new feature: cyclic scrolling
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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->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);
|
||||
|
||||
@@ -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->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<std::string, SearchConstraints> >(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<Song>(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);
|
||||
|
||||
23
src/menu.h
23
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 <typename T> NCurses::Menu<T>::Menu(size_t startx,
|
||||
itsHighlight(0),
|
||||
itsHighlightColor(itsBaseColor),
|
||||
highlightEnabled(1),
|
||||
useCyclicScrolling(0),
|
||||
itsSelectedPrefix(0),
|
||||
itsSelectedSuffix(0)
|
||||
{
|
||||
@@ -432,10 +435,11 @@ template <typename T> void NCurses::Menu<T>::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 <typename T> void NCurses::Menu<T>::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 <typename T> void NCurses::Menu<T>::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 <typename T> void NCurses::Menu<T>::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 <typename T> void NCurses::Menu<T>::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 <typename T> void NCurses::Menu<T>::Scroll(Where where)
|
||||
}
|
||||
if (!(*itsOptionsPtr)[itsHighlight] || (*itsOptionsPtr)[itsHighlight]->isStatic)
|
||||
{
|
||||
Scroll(itsHighlight == MaxHighlight ? wUp : wDown);
|
||||
Scroll(itsHighlight == MaxHighlight && !useCyclicScrolling ? wUp : wDown);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
mDialog.SetTimeout(ncmpcpp_window_timeout);
|
||||
mDialog.CyclicScrolling(Config.use_cyclic_scrolling);
|
||||
mDialog.SetItemDisplayer(Display::Generic);
|
||||
|
||||
bool playlists_not_active = myScreen == myBrowser && Config.local_browser;
|
||||
|
||||
@@ -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->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<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->CyclicScrolling(Config.use_cyclic_scrolling);
|
||||
SortDialog->SetItemDisplayer(Display::Pairs);
|
||||
|
||||
SortDialog->AddOption(std::make_pair("Artist", &MPD::Song::GetArtist));
|
||||
|
||||
@@ -49,11 +49,13 @@ void PlaylistEditor::Init()
|
||||
Playlists = new Menu<string>(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<Song>(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);
|
||||
|
||||
@@ -47,6 +47,7 @@ void SearchEngine::Init()
|
||||
w = new Menu< std::pair<Buffer *, Song *> >(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);
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -50,6 +50,7 @@ void TinyTagEditor::Init()
|
||||
w = new Menu<Buffer>(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<string_pair>(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<string_pair>(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<string>(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<Song>(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<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->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<string>((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())
|
||||
|
||||
Reference in New Issue
Block a user