new feature: cyclic scrolling

This commit is contained in:
Andrzej Rybczak
2009-03-30 20:03:23 +02:00
parent dda14b9796
commit 310b6c0ecd
12 changed files with 44 additions and 7 deletions

View File

@@ -142,6 +142,8 @@
# #
#fancy_scrolling = "yes" #fancy_scrolling = "yes"
# #
#cyclic_scrolling = "no"
#
#follow_now_playing_lyrics = "no" #follow_now_playing_lyrics = "no"
# #
#ncmpc_like_songs_adding = "no" (enabled - add/remove, disabled - always add) #ncmpc_like_songs_adding = "no" (enabled - add/remove, disabled - always add)

View File

@@ -123,6 +123,9 @@ No need to describe it, huh?
.B fancy_scrolling = yes/no .B fancy_scrolling = yes/no
If enabled, content of other columns will be updated immediately while scrolling, otherwise only after you stop scrolling. If enabled, content of other columns will be updated immediately while scrolling, otherwise only after you stop scrolling.
.TP .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 .B playlist_show_remaining_time = yes/no
If enabled, time remaining to end of playlist will be shown after playlist's statistics. If enabled, time remaining to end of playlist will be shown after playlist's statistics.
.TP .TP

View File

@@ -54,6 +54,7 @@ void Browser::Init()
w = new Menu<Item>(0, MainStartY, COLS, MainHeight, Config.columns_in_browser ? Display::Columns(Config.song_columns_list_format) : "", Config.main_color, brNone); w = new Menu<Item>(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->HighlightColor(Config.main_highlight_color);
w->SetTimeout(ncmpcpp_window_timeout); w->SetTimeout(ncmpcpp_window_timeout);
w->CyclicScrolling(Config.use_cyclic_scrolling);
w->SetSelectPrefix(&Config.selected_item_prefix); w->SetSelectPrefix(&Config.selected_item_prefix);
w->SetSelectSuffix(&Config.selected_item_suffix); w->SetSelectSuffix(&Config.selected_item_suffix);
w->SetItemDisplayer(Display::Items); w->SetItemDisplayer(Display::Items);

View File

@@ -52,17 +52,20 @@ void MediaLibrary::Init()
Artists = new Menu<string>(0, MainStartY, itsLeftColWidth, MainHeight, IntoStr(Config.media_lib_primary_tag) + "s", Config.main_color, brNone); Artists = new Menu<string>(0, MainStartY, itsLeftColWidth, MainHeight, IntoStr(Config.media_lib_primary_tag) + "s", Config.main_color, brNone);
Artists->HighlightColor(Config.active_column_color); Artists->HighlightColor(Config.active_column_color);
Artists->SetTimeout(ncmpcpp_window_timeout); Artists->SetTimeout(ncmpcpp_window_timeout);
Artists->CyclicScrolling(Config.use_cyclic_scrolling);
Artists->SetItemDisplayer(Display::Generic); Artists->SetItemDisplayer(Display::Generic);
Albums = new Menu< std::pair<std::string, SearchConstraints> >(itsMiddleColStartX, MainStartY, itsMiddleColWidth, MainHeight, "Albums", Config.main_color, brNone); Albums = new Menu< std::pair<std::string, SearchConstraints> >(itsMiddleColStartX, MainStartY, itsMiddleColWidth, MainHeight, "Albums", Config.main_color, brNone);
Albums->HighlightColor(Config.main_highlight_color); Albums->HighlightColor(Config.main_highlight_color);
Albums->SetTimeout(ncmpcpp_window_timeout); Albums->SetTimeout(ncmpcpp_window_timeout);
Albums->CyclicScrolling(Config.use_cyclic_scrolling);
Albums->SetItemDisplayer(Display::Pairs); Albums->SetItemDisplayer(Display::Pairs);
Albums->SetGetStringFunction(StringPairToString); Albums->SetGetStringFunction(StringPairToString);
Songs = new Menu<Song>(itsRightColStartX, MainStartY, itsRightColWidth, MainHeight, "Songs", Config.main_color, brNone); Songs = new Menu<Song>(itsRightColStartX, MainStartY, itsRightColWidth, MainHeight, "Songs", Config.main_color, brNone);
Songs->HighlightColor(Config.main_highlight_color); Songs->HighlightColor(Config.main_highlight_color);
Songs->SetTimeout(ncmpcpp_window_timeout); Songs->SetTimeout(ncmpcpp_window_timeout);
Songs->CyclicScrolling(Config.use_cyclic_scrolling);
Songs->SetSelectPrefix(&Config.selected_item_prefix); Songs->SetSelectPrefix(&Config.selected_item_prefix);
Songs->SetSelectSuffix(&Config.selected_item_suffix); Songs->SetSelectSuffix(&Config.selected_item_suffix);
Songs->SetItemDisplayer(Display::Songs); Songs->SetItemDisplayer(Display::Songs);

View File

@@ -148,7 +148,7 @@ namespace NCurses
void ShowFiltered() { itsOptionsPtr = &itsFilteredOptions; } void ShowFiltered() { itsOptionsPtr = &itsFilteredOptions; }
virtual void Refresh(); virtual void Refresh();
virtual void Scroll(Where); virtual void Scroll(Where where);
virtual void Reset(); virtual void Reset();
virtual void Clear(bool clrscr = 1); virtual void Clear(bool clrscr = 1);
@@ -166,6 +166,7 @@ namespace NCurses
void HighlightColor(Color col) { itsHighlightColor = col; } void HighlightColor(Color col) { itsHighlightColor = col; }
void Highlighting(bool hl) { highlightEnabled = hl; } void Highlighting(bool hl) { highlightEnabled = hl; }
void CyclicScrolling(bool cs) { useCyclicScrolling = cs; }
virtual bool Empty() const { return itsOptionsPtr->empty(); } virtual bool Empty() const { return itsOptionsPtr->empty(); }
@@ -203,6 +204,7 @@ namespace NCurses
Color itsHighlightColor; Color itsHighlightColor;
bool highlightEnabled; bool highlightEnabled;
bool useCyclicScrolling;
Buffer *itsSelectedPrefix; Buffer *itsSelectedPrefix;
Buffer *itsSelectedSuffix; Buffer *itsSelectedSuffix;
@@ -228,6 +230,7 @@ template <typename T> NCurses::Menu<T>::Menu(size_t startx,
itsHighlight(0), itsHighlight(0),
itsHighlightColor(itsBaseColor), itsHighlightColor(itsBaseColor),
highlightEnabled(1), highlightEnabled(1),
useCyclicScrolling(0),
itsSelectedPrefix(0), itsSelectedPrefix(0),
itsSelectedSuffix(0) itsSelectedSuffix(0)
{ {
@@ -432,10 +435,11 @@ template <typename T> void NCurses::Menu<T>::Scroll(Where where)
if (itsHighlight <= itsBeginning && itsHighlight > 0) if (itsHighlight <= itsBeginning && itsHighlight > 0)
{ {
itsBeginning--; itsBeginning--;
//Window::Scroll(wUp);
} }
if (itsHighlight == 0) if (itsHighlight == 0)
{ {
if (useCyclicScrolling)
return Scroll(wEnd);
break; break;
} }
else else
@@ -444,7 +448,7 @@ template <typename T> void NCurses::Menu<T>::Scroll(Where where)
} }
if (!(*itsOptionsPtr)[itsHighlight] || (*itsOptionsPtr)[itsHighlight]->isStatic) if (!(*itsOptionsPtr)[itsHighlight] || (*itsOptionsPtr)[itsHighlight]->isStatic)
{ {
Scroll(itsHighlight == 0 ? wDown : wUp); Scroll(itsHighlight == 0 && !useCyclicScrolling ? wDown : wUp);
} }
break; break;
} }
@@ -453,10 +457,11 @@ template <typename T> void NCurses::Menu<T>::Scroll(Where where)
if (itsHighlight >= MaxCurrentHighlight && itsHighlight < MaxHighlight) if (itsHighlight >= MaxCurrentHighlight && itsHighlight < MaxHighlight)
{ {
itsBeginning++; itsBeginning++;
//Window::Scroll(wDown);
} }
if (itsHighlight == MaxHighlight) if (itsHighlight == MaxHighlight)
{ {
if (useCyclicScrolling)
return Scroll(wHome);
break; break;
} }
else else
@@ -465,12 +470,14 @@ template <typename T> void NCurses::Menu<T>::Scroll(Where where)
} }
if (!(*itsOptionsPtr)[itsHighlight] || (*itsOptionsPtr)[itsHighlight]->isStatic) if (!(*itsOptionsPtr)[itsHighlight] || (*itsOptionsPtr)[itsHighlight]->isStatic)
{ {
Scroll(itsHighlight == MaxHighlight ? wUp : wDown); Scroll(itsHighlight == MaxHighlight && !useCyclicScrolling ? wUp : wDown);
} }
break; break;
} }
case wPageUp: case wPageUp:
{ {
if (useCyclicScrolling && itsHighlight == 0)
return Scroll(wEnd);
itsHighlight -= itsHeight; itsHighlight -= itsHeight;
itsBeginning -= itsHeight; itsBeginning -= itsHeight;
if (itsBeginning < 0) if (itsBeginning < 0)
@@ -481,12 +488,14 @@ template <typename T> void NCurses::Menu<T>::Scroll(Where where)
} }
if (!(*itsOptionsPtr)[itsHighlight] || (*itsOptionsPtr)[itsHighlight]->isStatic) if (!(*itsOptionsPtr)[itsHighlight] || (*itsOptionsPtr)[itsHighlight]->isStatic)
{ {
Scroll(itsHighlight == 0 ? wDown: wUp); Scroll(itsHighlight == 0 && !useCyclicScrolling ? wDown : wUp);
} }
break; break;
} }
case wPageDown: case wPageDown:
{ {
if (useCyclicScrolling && itsHighlight == MaxHighlight)
return Scroll(wHome);
itsHighlight += itsHeight; itsHighlight += itsHeight;
itsBeginning += itsHeight; itsBeginning += itsHeight;
if (itsBeginning > MaxBeginning) if (itsBeginning > MaxBeginning)
@@ -497,7 +506,7 @@ template <typename T> void NCurses::Menu<T>::Scroll(Where where)
} }
if (!(*itsOptionsPtr)[itsHighlight] || (*itsOptionsPtr)[itsHighlight]->isStatic) if (!(*itsOptionsPtr)[itsHighlight] || (*itsOptionsPtr)[itsHighlight]->isStatic)
{ {
Scroll(itsHighlight == MaxHighlight ? wUp : wDown); Scroll(itsHighlight == MaxHighlight && !useCyclicScrolling ? wUp : wDown);
} }
break; break;
} }

View File

@@ -1376,6 +1376,7 @@ int main(int argc, char *argv[])
Menu<string> mDialog((COLS-dialog_width)/2, (LINES-dialog_height)/2, dialog_width, dialog_height, "Add selected items to...", Config.main_color, Config.window_border); Menu<string> 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.SetTimeout(ncmpcpp_window_timeout);
mDialog.CyclicScrolling(Config.use_cyclic_scrolling);
mDialog.SetItemDisplayer(Display::Generic); mDialog.SetItemDisplayer(Display::Generic);
bool playlists_not_active = myScreen == myBrowser && Config.local_browser; bool playlists_not_active = myScreen == myBrowser && Config.local_browser;

View File

@@ -51,6 +51,7 @@ void Playlist::Init()
{ {
w = new Menu<MPD::Song>(0, MainStartY, COLS, MainHeight, Config.columns_in_playlist ? Display::Columns(Config.song_columns_list_format) : "", Config.main_color, brNone); w = new Menu<MPD::Song>(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->SetTimeout(ncmpcpp_window_timeout);
w->CyclicScrolling(Config.use_cyclic_scrolling);
w->HighlightColor(Config.main_highlight_color); w->HighlightColor(Config.main_highlight_color);
w->SetSelectPrefix(&Config.selected_item_prefix); w->SetSelectPrefix(&Config.selected_item_prefix);
w->SetSelectSuffix(&Config.selected_item_suffix); w->SetSelectSuffix(&Config.selected_item_suffix);
@@ -61,6 +62,7 @@ void Playlist::Init()
SortDialog = new Menu< std::pair<std::string, MPD::Song::GetFunction> >((COLS-SortDialogWidth)/2, (LINES-SortDialogHeight)/2, SortDialogWidth, SortDialogHeight, "Sort songs by...", Config.main_color, Config.window_border); SortDialog = new Menu< std::pair<std::string, MPD::Song::GetFunction> >((COLS-SortDialogWidth)/2, (LINES-SortDialogHeight)/2, SortDialogWidth, SortDialogHeight, "Sort songs by...", Config.main_color, Config.window_border);
SortDialog->SetTimeout(ncmpcpp_window_timeout); SortDialog->SetTimeout(ncmpcpp_window_timeout);
SortDialog->CyclicScrolling(Config.use_cyclic_scrolling);
SortDialog->SetItemDisplayer(Display::Pairs); SortDialog->SetItemDisplayer(Display::Pairs);
SortDialog->AddOption(std::make_pair("Artist", &MPD::Song::GetArtist)); SortDialog->AddOption(std::make_pair("Artist", &MPD::Song::GetArtist));

View File

@@ -49,11 +49,13 @@ void PlaylistEditor::Init()
Playlists = new Menu<string>(0, MainStartY, LeftColumnWidth, MainHeight, "Playlists", Config.main_color, brNone); Playlists = new Menu<string>(0, MainStartY, LeftColumnWidth, MainHeight, "Playlists", Config.main_color, brNone);
Playlists->HighlightColor(Config.active_column_color); Playlists->HighlightColor(Config.active_column_color);
Playlists->SetTimeout(ncmpcpp_window_timeout); Playlists->SetTimeout(ncmpcpp_window_timeout);
Playlists->CyclicScrolling(Config.use_cyclic_scrolling);
Playlists->SetItemDisplayer(Display::Generic); Playlists->SetItemDisplayer(Display::Generic);
Content = new Menu<Song>(RightColumnStartX, MainStartY, RightColumnWidth, MainHeight, "Playlist's content", Config.main_color, brNone); Content = new Menu<Song>(RightColumnStartX, MainStartY, RightColumnWidth, MainHeight, "Playlist's content", Config.main_color, brNone);
Content->HighlightColor(Config.main_highlight_color); Content->HighlightColor(Config.main_highlight_color);
Content->SetTimeout(ncmpcpp_window_timeout); Content->SetTimeout(ncmpcpp_window_timeout);
Content->CyclicScrolling(Config.use_cyclic_scrolling);
Content->SetSelectPrefix(&Config.selected_item_prefix); Content->SetSelectPrefix(&Config.selected_item_prefix);
Content->SetSelectSuffix(&Config.selected_item_suffix); Content->SetSelectSuffix(&Config.selected_item_suffix);
Content->SetItemDisplayer(Display::Songs); Content->SetItemDisplayer(Display::Songs);

View File

@@ -47,6 +47,7 @@ void SearchEngine::Init()
w = new Menu< std::pair<Buffer *, Song *> >(0, MainStartY, COLS, MainHeight, "", Config.main_color, brNone); w = new Menu< std::pair<Buffer *, Song *> >(0, MainStartY, COLS, MainHeight, "", Config.main_color, brNone);
w->HighlightColor(Config.main_highlight_color); w->HighlightColor(Config.main_highlight_color);
w->SetTimeout(ncmpcpp_window_timeout); w->SetTimeout(ncmpcpp_window_timeout);
w->CyclicScrolling(Config.use_cyclic_scrolling);
w->SetItemDisplayer(Display::SearchEngine); w->SetItemDisplayer(Display::SearchEngine);
w->SetSelectPrefix(&Config.selected_item_prefix); w->SetSelectPrefix(&Config.selected_item_prefix);
w->SetSelectSuffix(&Config.selected_item_suffix); w->SetSelectSuffix(&Config.selected_item_suffix);

View File

@@ -274,6 +274,7 @@ void DefaultConfiguration(ncmpcpp_config &conf)
conf.ignore_leading_the = false; conf.ignore_leading_the = false;
conf.block_search_constraints_change = true; conf.block_search_constraints_change = true;
conf.use_console_editor = false; conf.use_console_editor = false;
conf.use_cyclic_scrolling = false;
conf.set_window_title = true; conf.set_window_title = true;
conf.mpd_port = 6600; conf.mpd_port = 6600;
conf.mpd_connection_timeout = 15; conf.mpd_connection_timeout = 15;
@@ -574,6 +575,10 @@ void ReadConfiguration(ncmpcpp_config &conf)
{ {
conf.fancy_scrolling = v == "yes"; 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) else if (cl.find("playlist_show_remaining_time") != string::npos)
{ {
conf.playlist_show_remaining_time = v == "yes"; conf.playlist_show_remaining_time = v == "yes";

View File

@@ -165,6 +165,7 @@ struct ncmpcpp_config
bool ignore_leading_the; bool ignore_leading_the;
bool block_search_constraints_change; bool block_search_constraints_change;
bool use_console_editor; bool use_console_editor;
bool use_cyclic_scrolling;
int mpd_port; int mpd_port;
int mpd_connection_timeout; int mpd_connection_timeout;

View File

@@ -50,6 +50,7 @@ void TinyTagEditor::Init()
w = new Menu<Buffer>(0, MainStartY, COLS, MainHeight, "", Config.main_color, brNone); w = new Menu<Buffer>(0, MainStartY, COLS, MainHeight, "", Config.main_color, brNone);
w->HighlightColor(Config.main_highlight_color); w->HighlightColor(Config.main_highlight_color);
w->SetTimeout(ncmpcpp_window_timeout); w->SetTimeout(ncmpcpp_window_timeout);
w->CyclicScrolling(Config.use_cyclic_scrolling);
w->SetItemDisplayer(Display::Generic); w->SetItemDisplayer(Display::Generic);
} }
@@ -306,12 +307,14 @@ void TagEditor::Init()
Albums = new Menu<string_pair>(0, MainStartY, LeftColumnWidth, MainHeight, "Albums", Config.main_color, brNone); Albums = new Menu<string_pair>(0, MainStartY, LeftColumnWidth, MainHeight, "Albums", Config.main_color, brNone);
Albums->HighlightColor(Config.active_column_color); Albums->HighlightColor(Config.active_column_color);
Albums->SetTimeout(ncmpcpp_window_timeout); Albums->SetTimeout(ncmpcpp_window_timeout);
Albums->CyclicScrolling(Config.use_cyclic_scrolling);
Albums->SetItemDisplayer(Display::Pairs); Albums->SetItemDisplayer(Display::Pairs);
Albums->SetGetStringFunction(StringPairToString); Albums->SetGetStringFunction(StringPairToString);
Dirs = new Menu<string_pair>(0, MainStartY, LeftColumnWidth, MainHeight, "Directories", Config.main_color, brNone); Dirs = new Menu<string_pair>(0, MainStartY, LeftColumnWidth, MainHeight, "Directories", Config.main_color, brNone);
Dirs->HighlightColor(Config.active_column_color); Dirs->HighlightColor(Config.active_column_color);
Dirs->SetTimeout(ncmpcpp_window_timeout); Dirs->SetTimeout(ncmpcpp_window_timeout);
Dirs->CyclicScrolling(Config.use_cyclic_scrolling);
Dirs->SetItemDisplayer(Display::Pairs); Dirs->SetItemDisplayer(Display::Pairs);
Dirs->SetGetStringFunction(StringPairToString); Dirs->SetGetStringFunction(StringPairToString);
@@ -320,11 +323,13 @@ void TagEditor::Init()
TagTypes = new Menu<string>(MiddleColumnStartX, MainStartY, MiddleColumnWidth, MainHeight, "Tag types", Config.main_color, brNone); TagTypes = new Menu<string>(MiddleColumnStartX, MainStartY, MiddleColumnWidth, MainHeight, "Tag types", Config.main_color, brNone);
TagTypes->HighlightColor(Config.main_highlight_color); TagTypes->HighlightColor(Config.main_highlight_color);
TagTypes->SetTimeout(ncmpcpp_window_timeout); TagTypes->SetTimeout(ncmpcpp_window_timeout);
TagTypes->CyclicScrolling(Config.use_cyclic_scrolling);
TagTypes->SetItemDisplayer(Display::Generic); TagTypes->SetItemDisplayer(Display::Generic);
Tags = new Menu<Song>(RightColumnStartX, MainStartY, RightColumnWidth, MainHeight, "Tags", Config.main_color, brNone); Tags = new Menu<Song>(RightColumnStartX, MainStartY, RightColumnWidth, MainHeight, "Tags", Config.main_color, brNone);
Tags->HighlightColor(Config.main_highlight_color); Tags->HighlightColor(Config.main_highlight_color);
Tags->SetTimeout(ncmpcpp_window_timeout); Tags->SetTimeout(ncmpcpp_window_timeout);
Tags->CyclicScrolling(Config.use_cyclic_scrolling);
Tags->SetSelectPrefix(&Config.selected_item_prefix); Tags->SetSelectPrefix(&Config.selected_item_prefix);
Tags->SetSelectSuffix(&Config.selected_item_suffix); Tags->SetSelectSuffix(&Config.selected_item_suffix);
Tags->SetItemDisplayer(Display::Tags); Tags->SetItemDisplayer(Display::Tags);
@@ -1165,6 +1170,7 @@ void TagEditor::DealWithFilenames(SongList &v)
Menu<string> *Main = new Menu<string>((COLS-width)/2, (LINES-height)/2, width, height, "", Config.main_color, Config.window_border); Menu<string> *Main = new Menu<string>((COLS-width)/2, (LINES-height)/2, width, height, "", Config.main_color, Config.window_border);
Main->SetTimeout(ncmpcpp_window_timeout); Main->SetTimeout(ncmpcpp_window_timeout);
Main->CyclicScrolling(Config.use_cyclic_scrolling);
Main->SetItemDisplayer(Display::Generic); Main->SetItemDisplayer(Display::Generic);
Main->AddOption("Get tags from filename"); Main->AddOption("Get tags from filename");
Main->AddOption("Rename files"); Main->AddOption("Rename files");
@@ -1225,6 +1231,7 @@ void TagEditor::DealWithFilenames(SongList &v)
Main = new Menu<string>((COLS-width)/2, (LINES-height)/2, one_width, height, "", Config.main_color, Config.active_window_border); Main = new Menu<string>((COLS-width)/2, (LINES-height)/2, one_width, height, "", Config.main_color, Config.active_window_border);
Main->SetTimeout(ncmpcpp_window_timeout); Main->SetTimeout(ncmpcpp_window_timeout);
Main->CyclicScrolling(Config.use_cyclic_scrolling);
Main->SetItemDisplayer(Display::Generic); Main->SetItemDisplayer(Display::Generic);
if (!Patterns.empty()) if (!Patterns.empty())