From 310b6c0ecd5d89900ba48df99f035655cf1e1b3b Mon Sep 17 00:00:00 2001 From: Andrzej Rybczak Date: Mon, 30 Mar 2009 20:03:23 +0200 Subject: [PATCH] new feature: cyclic scrolling --- doc/config | 2 ++ doc/ncmpcpp.1 | 3 +++ src/browser.cpp | 1 + src/media_library.cpp | 3 +++ src/menu.h | 23 ++++++++++++++++------- src/ncmpcpp.cpp | 1 + src/playlist.cpp | 2 ++ src/playlist_editor.cpp | 2 ++ src/search_engine.cpp | 1 + src/settings.cpp | 5 +++++ src/settings.h | 1 + src/tag_editor.cpp | 7 +++++++ 12 files changed, 44 insertions(+), 7 deletions(-) diff --git a/doc/config b/doc/config index c1a03ad7..47471d3e 100644 --- a/doc/config +++ b/doc/config @@ -142,6 +142,8 @@ # #fancy_scrolling = "yes" # +#cyclic_scrolling = "no" +# #follow_now_playing_lyrics = "no" # #ncmpc_like_songs_adding = "no" (enabled - add/remove, disabled - always add) diff --git a/doc/ncmpcpp.1 b/doc/ncmpcpp.1 index 4a825975..139e1ef9 100644 --- a/doc/ncmpcpp.1 +++ b/doc/ncmpcpp.1 @@ -123,6 +123,9 @@ No need to describe it, huh? .B fancy_scrolling = yes/no If enabled, content of other columns will be updated immediately while scrolling, otherwise only after you stop scrolling. .TP +.B cyclic_scrolling = yes/no +If enabled, cyclic scrolling is used (e.g. if you press down arrow being at the end of list, it'll take you to the beginning) +.TP .B playlist_show_remaining_time = yes/no If enabled, time remaining to end of playlist will be shown after playlist's statistics. .TP diff --git a/src/browser.cpp b/src/browser.cpp index b7f98acf..213b7f1e 100644 --- a/src/browser.cpp +++ b/src/browser.cpp @@ -54,6 +54,7 @@ void Browser::Init() w = new Menu(0, MainStartY, COLS, MainHeight, Config.columns_in_browser ? Display::Columns(Config.song_columns_list_format) : "", Config.main_color, brNone); w->HighlightColor(Config.main_highlight_color); w->SetTimeout(ncmpcpp_window_timeout); + w->CyclicScrolling(Config.use_cyclic_scrolling); w->SetSelectPrefix(&Config.selected_item_prefix); w->SetSelectSuffix(&Config.selected_item_suffix); w->SetItemDisplayer(Display::Items); diff --git a/src/media_library.cpp b/src/media_library.cpp index 93193dc8..45c25465 100644 --- a/src/media_library.cpp +++ b/src/media_library.cpp @@ -52,17 +52,20 @@ void MediaLibrary::Init() Artists = new Menu(0, MainStartY, itsLeftColWidth, MainHeight, IntoStr(Config.media_lib_primary_tag) + "s", Config.main_color, brNone); Artists->HighlightColor(Config.active_column_color); Artists->SetTimeout(ncmpcpp_window_timeout); + Artists->CyclicScrolling(Config.use_cyclic_scrolling); Artists->SetItemDisplayer(Display::Generic); Albums = new Menu< std::pair >(itsMiddleColStartX, MainStartY, itsMiddleColWidth, MainHeight, "Albums", Config.main_color, brNone); Albums->HighlightColor(Config.main_highlight_color); Albums->SetTimeout(ncmpcpp_window_timeout); + Albums->CyclicScrolling(Config.use_cyclic_scrolling); Albums->SetItemDisplayer(Display::Pairs); Albums->SetGetStringFunction(StringPairToString); Songs = new Menu(itsRightColStartX, MainStartY, itsRightColWidth, MainHeight, "Songs", Config.main_color, brNone); Songs->HighlightColor(Config.main_highlight_color); Songs->SetTimeout(ncmpcpp_window_timeout); + Songs->CyclicScrolling(Config.use_cyclic_scrolling); Songs->SetSelectPrefix(&Config.selected_item_prefix); Songs->SetSelectSuffix(&Config.selected_item_suffix); Songs->SetItemDisplayer(Display::Songs); diff --git a/src/menu.h b/src/menu.h index 4536ba33..34720ebf 100644 --- a/src/menu.h +++ b/src/menu.h @@ -148,7 +148,7 @@ namespace NCurses void ShowFiltered() { itsOptionsPtr = &itsFilteredOptions; } virtual void Refresh(); - virtual void Scroll(Where); + virtual void Scroll(Where where); virtual void Reset(); virtual void Clear(bool clrscr = 1); @@ -166,6 +166,7 @@ namespace NCurses void HighlightColor(Color col) { itsHighlightColor = col; } void Highlighting(bool hl) { highlightEnabled = hl; } + void CyclicScrolling(bool cs) { useCyclicScrolling = cs; } virtual bool Empty() const { return itsOptionsPtr->empty(); } @@ -203,6 +204,7 @@ namespace NCurses Color itsHighlightColor; bool highlightEnabled; + bool useCyclicScrolling; Buffer *itsSelectedPrefix; Buffer *itsSelectedSuffix; @@ -228,6 +230,7 @@ template NCurses::Menu::Menu(size_t startx, itsHighlight(0), itsHighlightColor(itsBaseColor), highlightEnabled(1), + useCyclicScrolling(0), itsSelectedPrefix(0), itsSelectedSuffix(0) { @@ -432,10 +435,11 @@ template void NCurses::Menu::Scroll(Where where) if (itsHighlight <= itsBeginning && itsHighlight > 0) { itsBeginning--; - //Window::Scroll(wUp); } if (itsHighlight == 0) { + if (useCyclicScrolling) + return Scroll(wEnd); break; } else @@ -444,7 +448,7 @@ template void NCurses::Menu::Scroll(Where where) } if (!(*itsOptionsPtr)[itsHighlight] || (*itsOptionsPtr)[itsHighlight]->isStatic) { - Scroll(itsHighlight == 0 ? wDown : wUp); + Scroll(itsHighlight == 0 && !useCyclicScrolling ? wDown : wUp); } break; } @@ -453,10 +457,11 @@ template void NCurses::Menu::Scroll(Where where) if (itsHighlight >= MaxCurrentHighlight && itsHighlight < MaxHighlight) { itsBeginning++; - //Window::Scroll(wDown); } if (itsHighlight == MaxHighlight) { + if (useCyclicScrolling) + return Scroll(wHome); break; } else @@ -465,12 +470,14 @@ template void NCurses::Menu::Scroll(Where where) } if (!(*itsOptionsPtr)[itsHighlight] || (*itsOptionsPtr)[itsHighlight]->isStatic) { - Scroll(itsHighlight == MaxHighlight ? wUp : wDown); + Scroll(itsHighlight == MaxHighlight && !useCyclicScrolling ? wUp : wDown); } break; } case wPageUp: { + if (useCyclicScrolling && itsHighlight == 0) + return Scroll(wEnd); itsHighlight -= itsHeight; itsBeginning -= itsHeight; if (itsBeginning < 0) @@ -481,12 +488,14 @@ template void NCurses::Menu::Scroll(Where where) } if (!(*itsOptionsPtr)[itsHighlight] || (*itsOptionsPtr)[itsHighlight]->isStatic) { - Scroll(itsHighlight == 0 ? wDown: wUp); + Scroll(itsHighlight == 0 && !useCyclicScrolling ? wDown : wUp); } break; } case wPageDown: { + if (useCyclicScrolling && itsHighlight == MaxHighlight) + return Scroll(wHome); itsHighlight += itsHeight; itsBeginning += itsHeight; if (itsBeginning > MaxBeginning) @@ -497,7 +506,7 @@ template void NCurses::Menu::Scroll(Where where) } if (!(*itsOptionsPtr)[itsHighlight] || (*itsOptionsPtr)[itsHighlight]->isStatic) { - Scroll(itsHighlight == MaxHighlight ? wUp : wDown); + Scroll(itsHighlight == MaxHighlight && !useCyclicScrolling ? wUp : wDown); } break; } diff --git a/src/ncmpcpp.cpp b/src/ncmpcpp.cpp index a941d296..b898716e 100644 --- a/src/ncmpcpp.cpp +++ b/src/ncmpcpp.cpp @@ -1376,6 +1376,7 @@ int main(int argc, char *argv[]) Menu mDialog((COLS-dialog_width)/2, (LINES-dialog_height)/2, dialog_width, dialog_height, "Add selected items to...", Config.main_color, Config.window_border); mDialog.SetTimeout(ncmpcpp_window_timeout); + mDialog.CyclicScrolling(Config.use_cyclic_scrolling); mDialog.SetItemDisplayer(Display::Generic); bool playlists_not_active = myScreen == myBrowser && Config.local_browser; diff --git a/src/playlist.cpp b/src/playlist.cpp index d55b65fc..738d7c52 100644 --- a/src/playlist.cpp +++ b/src/playlist.cpp @@ -51,6 +51,7 @@ void Playlist::Init() { w = new Menu(0, MainStartY, COLS, MainHeight, Config.columns_in_playlist ? Display::Columns(Config.song_columns_list_format) : "", Config.main_color, brNone); w->SetTimeout(ncmpcpp_window_timeout); + w->CyclicScrolling(Config.use_cyclic_scrolling); w->HighlightColor(Config.main_highlight_color); w->SetSelectPrefix(&Config.selected_item_prefix); w->SetSelectSuffix(&Config.selected_item_suffix); @@ -61,6 +62,7 @@ void Playlist::Init() SortDialog = new Menu< std::pair >((COLS-SortDialogWidth)/2, (LINES-SortDialogHeight)/2, SortDialogWidth, SortDialogHeight, "Sort songs by...", Config.main_color, Config.window_border); SortDialog->SetTimeout(ncmpcpp_window_timeout); + SortDialog->CyclicScrolling(Config.use_cyclic_scrolling); SortDialog->SetItemDisplayer(Display::Pairs); SortDialog->AddOption(std::make_pair("Artist", &MPD::Song::GetArtist)); diff --git a/src/playlist_editor.cpp b/src/playlist_editor.cpp index 1d167eb3..3de2f7b6 100644 --- a/src/playlist_editor.cpp +++ b/src/playlist_editor.cpp @@ -49,11 +49,13 @@ void PlaylistEditor::Init() Playlists = new Menu(0, MainStartY, LeftColumnWidth, MainHeight, "Playlists", Config.main_color, brNone); Playlists->HighlightColor(Config.active_column_color); Playlists->SetTimeout(ncmpcpp_window_timeout); + Playlists->CyclicScrolling(Config.use_cyclic_scrolling); Playlists->SetItemDisplayer(Display::Generic); Content = new Menu(RightColumnStartX, MainStartY, RightColumnWidth, MainHeight, "Playlist's content", Config.main_color, brNone); Content->HighlightColor(Config.main_highlight_color); Content->SetTimeout(ncmpcpp_window_timeout); + Content->CyclicScrolling(Config.use_cyclic_scrolling); Content->SetSelectPrefix(&Config.selected_item_prefix); Content->SetSelectSuffix(&Config.selected_item_suffix); Content->SetItemDisplayer(Display::Songs); diff --git a/src/search_engine.cpp b/src/search_engine.cpp index 61624a48..3c9856cc 100644 --- a/src/search_engine.cpp +++ b/src/search_engine.cpp @@ -47,6 +47,7 @@ void SearchEngine::Init() w = new Menu< std::pair >(0, MainStartY, COLS, MainHeight, "", Config.main_color, brNone); w->HighlightColor(Config.main_highlight_color); w->SetTimeout(ncmpcpp_window_timeout); + w->CyclicScrolling(Config.use_cyclic_scrolling); w->SetItemDisplayer(Display::SearchEngine); w->SetSelectPrefix(&Config.selected_item_prefix); w->SetSelectSuffix(&Config.selected_item_suffix); diff --git a/src/settings.cpp b/src/settings.cpp index 006554fc..62a8e377 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -274,6 +274,7 @@ void DefaultConfiguration(ncmpcpp_config &conf) conf.ignore_leading_the = false; conf.block_search_constraints_change = true; conf.use_console_editor = false; + conf.use_cyclic_scrolling = false; conf.set_window_title = true; conf.mpd_port = 6600; conf.mpd_connection_timeout = 15; @@ -574,6 +575,10 @@ void ReadConfiguration(ncmpcpp_config &conf) { conf.fancy_scrolling = v == "yes"; } + else if (cl.find("cyclic_scrolling") != string::npos) + { + conf.use_cyclic_scrolling = v == "yes"; + } else if (cl.find("playlist_show_remaining_time") != string::npos) { conf.playlist_show_remaining_time = v == "yes"; diff --git a/src/settings.h b/src/settings.h index f28315b0..413d81b1 100644 --- a/src/settings.h +++ b/src/settings.h @@ -165,6 +165,7 @@ struct ncmpcpp_config bool ignore_leading_the; bool block_search_constraints_change; bool use_console_editor; + bool use_cyclic_scrolling; int mpd_port; int mpd_connection_timeout; diff --git a/src/tag_editor.cpp b/src/tag_editor.cpp index e1d4c650..fc359a49 100644 --- a/src/tag_editor.cpp +++ b/src/tag_editor.cpp @@ -50,6 +50,7 @@ void TinyTagEditor::Init() w = new Menu(0, MainStartY, COLS, MainHeight, "", Config.main_color, brNone); w->HighlightColor(Config.main_highlight_color); w->SetTimeout(ncmpcpp_window_timeout); + w->CyclicScrolling(Config.use_cyclic_scrolling); w->SetItemDisplayer(Display::Generic); } @@ -306,12 +307,14 @@ void TagEditor::Init() Albums = new Menu(0, MainStartY, LeftColumnWidth, MainHeight, "Albums", Config.main_color, brNone); Albums->HighlightColor(Config.active_column_color); Albums->SetTimeout(ncmpcpp_window_timeout); + Albums->CyclicScrolling(Config.use_cyclic_scrolling); Albums->SetItemDisplayer(Display::Pairs); Albums->SetGetStringFunction(StringPairToString); Dirs = new Menu(0, MainStartY, LeftColumnWidth, MainHeight, "Directories", Config.main_color, brNone); Dirs->HighlightColor(Config.active_column_color); Dirs->SetTimeout(ncmpcpp_window_timeout); + Dirs->CyclicScrolling(Config.use_cyclic_scrolling); Dirs->SetItemDisplayer(Display::Pairs); Dirs->SetGetStringFunction(StringPairToString); @@ -320,11 +323,13 @@ void TagEditor::Init() TagTypes = new Menu(MiddleColumnStartX, MainStartY, MiddleColumnWidth, MainHeight, "Tag types", Config.main_color, brNone); TagTypes->HighlightColor(Config.main_highlight_color); TagTypes->SetTimeout(ncmpcpp_window_timeout); + TagTypes->CyclicScrolling(Config.use_cyclic_scrolling); TagTypes->SetItemDisplayer(Display::Generic); Tags = new Menu(RightColumnStartX, MainStartY, RightColumnWidth, MainHeight, "Tags", Config.main_color, brNone); Tags->HighlightColor(Config.main_highlight_color); Tags->SetTimeout(ncmpcpp_window_timeout); + Tags->CyclicScrolling(Config.use_cyclic_scrolling); Tags->SetSelectPrefix(&Config.selected_item_prefix); Tags->SetSelectSuffix(&Config.selected_item_suffix); Tags->SetItemDisplayer(Display::Tags); @@ -1165,6 +1170,7 @@ void TagEditor::DealWithFilenames(SongList &v) Menu *Main = new Menu((COLS-width)/2, (LINES-height)/2, width, height, "", Config.main_color, Config.window_border); Main->SetTimeout(ncmpcpp_window_timeout); + Main->CyclicScrolling(Config.use_cyclic_scrolling); Main->SetItemDisplayer(Display::Generic); Main->AddOption("Get tags from filename"); Main->AddOption("Rename files"); @@ -1225,6 +1231,7 @@ void TagEditor::DealWithFilenames(SongList &v) Main = new Menu((COLS-width)/2, (LINES-height)/2, one_width, height, "", Config.main_color, Config.active_window_border); Main->SetTimeout(ncmpcpp_window_timeout); + Main->CyclicScrolling(Config.use_cyclic_scrolling); Main->SetItemDisplayer(Display::Generic); if (!Patterns.empty())