diff --git a/doc/ncmpcpp_keys b/doc/ncmpcpp_keys index c06b800e..4221ef52 100644 --- a/doc/ncmpcpp_keys +++ b/doc/ncmpcpp_keys @@ -115,6 +115,8 @@ # #key_toggle_auto_center = 'U' # +#key_toggle_playlist_display_mode = 'p' +# #key_go_to_containing_directory = 'G' # #key_start_searching = 'y' diff --git a/src/helpers.cpp b/src/helpers.cpp index 8a792fda..e474cfcd 100644 --- a/src/helpers.cpp +++ b/src/helpers.cpp @@ -863,9 +863,9 @@ void Search(SongList &result, Song &s) if (found && !s.GetAlbum().empty()) found = copy.GetAlbum().find(s.GetAlbum()) != string::npos; if (found && !s.GetYear().empty()) - found = atoi(copy.GetYear().c_str()) == atoi(s.GetYear().c_str()) && atoi(s.GetYear().c_str()); + found = StrToInt(copy.GetYear()) == StrToInt(s.GetYear()) && StrToInt(s.GetYear()); if (found && !s.GetTrack().empty()) - found = atoi(copy.GetTrack().c_str()) == atoi(s.GetTrack().c_str()) && atoi(s.GetTrack().c_str()); + found = StrToInt(copy.GetTrack()) == StrToInt(s.GetTrack()) && StrToInt(s.GetTrack()); if (found && !s.GetGenre().empty()) found = copy.GetGenre().find(s.GetGenre()) != string::npos; if (found && !s.GetComment().empty()) @@ -882,9 +882,9 @@ void Search(SongList &result, Song &s) if (found && !s.GetAlbum().empty()) found = copy.GetAlbum() == s.GetAlbum(); if (found && !s.GetYear().empty()) - found = atoi(copy.GetYear().c_str()) == atoi(s.GetYear().c_str()) && atoi(s.GetYear().c_str()); + found = StrToInt(copy.GetYear()) == StrToInt(s.GetYear()) && StrToInt(s.GetYear()); if (found && !s.GetTrack().empty()) - found = atoi(copy.GetTrack().c_str()) == atoi(s.GetTrack().c_str()) && atoi(s.GetTrack().c_str()); + found = StrToInt(copy.GetTrack()) == StrToInt(s.GetTrack()) && StrToInt(s.GetTrack()); if (found && !s.GetGenre().empty()) found = copy.GetGenre() == s.GetGenre(); if (found && !s.GetComment().empty()) diff --git a/src/menu.h b/src/menu.h index c7e1e7d1..d8264d6f 100644 --- a/src/menu.h +++ b/src/menu.h @@ -415,6 +415,9 @@ void Menu::Refresh(bool redraw_whole_window) if (itsHighlight >= itsOptions.size()-1) Highlight(itsOptions.size()); + while (itsHighlight-itsBeginning > itsHeight-1) + itsBeginning++; + if (redraw_whole_window) { Window::Clear(); diff --git a/src/ncmpcpp.cpp b/src/ncmpcpp.cpp index 7d5619e6..9cb836a7 100644 --- a/src/ncmpcpp.cpp +++ b/src/ncmpcpp.cpp @@ -288,6 +288,7 @@ int main(int argc, char *argv[]) sHelp->Add(DisplayKeys(Key.Add) + "Add url/file/directory to playlist\n"); sHelp->Add(DisplayKeys(Key.SavePlaylist) + "Save playlist\n"); sHelp->Add(DisplayKeys(Key.GoToNowPlaying) + "Go to currently playing position\n"); + sHelp->Add(DisplayKeys(Key.TogglePlaylistDisplayMode) + "Toggle playlist display mode\n"); sHelp->Add(DisplayKeys(Key.ToggleAutoCenter) + "Toggle auto center mode\n\n\n"); sHelp->Add(" [.b]Keys - Browse screen\n -----------------------------------------[/b]\n"); @@ -342,18 +343,18 @@ int main(int argc, char *argv[]) int input; timer = time(NULL); - sHelp->Timeout(ncmpcpp_window_timeout); - mPlaylist->Timeout(ncmpcpp_window_timeout); - mBrowser->Timeout(ncmpcpp_window_timeout); - mTagEditor->Timeout(ncmpcpp_window_timeout); - mSearcher->Timeout(ncmpcpp_window_timeout); - mLibArtists->Timeout(ncmpcpp_window_timeout); - mLibAlbums->Timeout(ncmpcpp_window_timeout); - mLibSongs->Timeout(ncmpcpp_window_timeout); - sLyrics->Timeout(ncmpcpp_window_timeout); - wFooter->Timeout(ncmpcpp_window_timeout); - mPlaylistList->Timeout(ncmpcpp_window_timeout); - mPlaylistEditor->Timeout(ncmpcpp_window_timeout); + sHelp->SetTimeout(ncmpcpp_window_timeout); + mPlaylist->SetTimeout(ncmpcpp_window_timeout); + mBrowser->SetTimeout(ncmpcpp_window_timeout); + mTagEditor->SetTimeout(ncmpcpp_window_timeout); + mSearcher->SetTimeout(ncmpcpp_window_timeout); + mLibArtists->SetTimeout(ncmpcpp_window_timeout); + mLibAlbums->SetTimeout(ncmpcpp_window_timeout); + mLibSongs->SetTimeout(ncmpcpp_window_timeout); + sLyrics->SetTimeout(ncmpcpp_window_timeout); + wFooter->SetTimeout(ncmpcpp_window_timeout); + mPlaylistList->SetTimeout(ncmpcpp_window_timeout); + mPlaylistEditor->SetTimeout(ncmpcpp_window_timeout); mPlaylist->HighlightColor(Config.main_highlight_color); mBrowser->HighlightColor(Config.main_highlight_color); @@ -721,14 +722,12 @@ int main(int argc, char *argv[]) main_height++; sHelp->Resize(COLS, main_height); - sHelp->Timeout(ncmpcpp_window_timeout); mPlaylist->Resize(COLS, main_height); mPlaylist->SetTitle(Config.columns_in_playlist ? DisplayColumns(Config.song_columns_list_format) : ""); mBrowser->Resize(COLS, main_height); mTagEditor->Resize(COLS, main_height); mSearcher->Resize(COLS, main_height); sLyrics->Resize(COLS, main_height); - sLyrics->Timeout(ncmpcpp_window_timeout); lib_artist_width = COLS/3-1; lib_albums_start_x = lib_artist_width+1; @@ -1412,7 +1411,7 @@ int main(int argc, char *argv[]) { block_playlist_update = 1; dont_change_now_playing = 1; - mPlaylist->Timeout(50); + mPlaylist->SetTimeout(50); while (!mPlaylist->Empty() && Keypressed(input, Key.Delete)) { TraceMpdStatus(); @@ -1421,7 +1420,7 @@ int main(int argc, char *argv[]) mPlaylist->Refresh(); mPlaylist->ReadKey(input); } - mPlaylist->Timeout(ncmpcpp_window_timeout); + mPlaylist->SetTimeout(ncmpcpp_window_timeout); dont_change_now_playing = 0; } Mpd->CommitQueue(); @@ -1468,7 +1467,7 @@ int main(int argc, char *argv[]) } else { - mPlaylistEditor->Timeout(50); + mPlaylistEditor->SetTimeout(50); while (!mPlaylistEditor->Empty() && Keypressed(input, Key.Delete)) { TraceMpdStatus(); @@ -1477,7 +1476,7 @@ int main(int argc, char *argv[]) mPlaylistEditor->Refresh(); mPlaylistEditor->ReadKey(input); } - mPlaylistEditor->Timeout(ncmpcpp_window_timeout); + mPlaylistEditor->SetTimeout(ncmpcpp_window_timeout); } Mpd->CommitQueue(); } @@ -1711,6 +1710,15 @@ int main(int argc, char *argv[]) block_progressbar_update = 0; UNLOCK_STATUSBAR; } + else if (Keypressed(input, Key.TogglePlaylistDisplayMode) && wCurrent == mPlaylist) + { + Config.columns_in_playlist = !Config.columns_in_playlist; + ShowMessage("Playlist display mode: " + string(Config.columns_in_playlist ? "Columns" : "Classic")); + mPlaylist->SetItemDisplayer(Config.columns_in_playlist ? DisplaySongInColumns : DisplaySong); + mPlaylist->SetItemDisplayerUserData(Config.columns_in_playlist ? &Config.song_columns_list_format : &Config.song_list_format); + mPlaylist->SetTitle(Config.columns_in_playlist ? DisplayColumns(Config.song_columns_list_format) : ""); + redraw_me = 1; + } else if (Keypressed(input, Key.ToggleAutoCenter)) { Config.autocenter_mode = !Config.autocenter_mode; @@ -1970,7 +1978,7 @@ int main(int argc, char *argv[]) const int dialog_width = COLS*0.8; const int dialog_height = LINES*0.6; Menu *mDialog = new Menu((COLS-dialog_width)/2, (LINES-dialog_height)/2, dialog_width, dialog_height, "Add selected items to...", clYellow, brGreen); - mDialog->Timeout(ncmpcpp_window_timeout); + mDialog->SetTimeout(ncmpcpp_window_timeout); mDialog->AddOption("Current MPD playlist"); mDialog->AddOption("Create new playlist (m3u file)"); @@ -2250,7 +2258,6 @@ int main(int argc, char *argv[]) sLyrics->WriteXY(0, 0, "Fetching lyrics..."); sLyrics->Refresh(); sLyrics->Add(GetLyrics(s->GetArtist(), s->GetTitle())); - sLyrics->Timeout(ncmpcpp_window_timeout); } } } diff --git a/src/scrollpad.cpp b/src/scrollpad.cpp index 96059e0b..39c28f49 100644 --- a/src/scrollpad.cpp +++ b/src/scrollpad.cpp @@ -106,6 +106,7 @@ void Scrollpad::recreate_win() { delwin(itsWindow); itsWindow = newpad(itsRealHeight, itsWidth); + SetTimeout(itsWindowTimeout); SetColor(itsBaseColor, itsBgColor); Write(itsContent.c_str()); } diff --git a/src/settings.cpp b/src/settings.cpp index 9583a96d..6d8f380b 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -80,6 +80,7 @@ void DefaultKeys(ncmpcpp_keys &keys) keys.GoToContainingDir[0] = 'G'; keys.StartSearching[0] = 'y'; keys.ToggleAutoCenter[0] = 'U'; + keys.TogglePlaylistDisplayMode[0] = 'p'; keys.GoToParentDir[0] = 263; keys.Quit[0] = 'q'; @@ -136,6 +137,7 @@ void DefaultKeys(ncmpcpp_keys &keys) keys.GoToContainingDir[1] = null_key; keys.StartSearching[1] = null_key; keys.ToggleAutoCenter[1] = null_key; + keys.TogglePlaylistDisplayMode[1] = null_key; keys.GoToParentDir[1] = 127; keys.Quit[1] = 'Q'; } @@ -386,6 +388,8 @@ void ReadKeys(ncmpcpp_keys &keys) GetKeys(*it, keys.GoToNowPlaying); else if (it->find("key_toggle_auto_center ") != string::npos) GetKeys(*it, keys.ToggleAutoCenter); + else if (it->find("key_toggle_playlist_display_mode ") != string::npos) + GetKeys(*it, keys.TogglePlaylistDisplayMode); else if (it->find("key_go_to_containing_directory ") != string::npos) GetKeys(*it, keys.GoToContainingDir); else if (it->find("key_start_searching ") != string::npos) diff --git a/src/settings.h b/src/settings.h index 282fb0e2..57d18ac8 100644 --- a/src/settings.h +++ b/src/settings.h @@ -82,6 +82,7 @@ struct ncmpcpp_keys int GoToContainingDir[2]; int StartSearching[2]; int ToggleAutoCenter[2]; + int TogglePlaylistDisplayMode[2]; int GoToParentDir[2]; int Quit[2]; }; diff --git a/src/window.cpp b/src/window.cpp index ef9b616d..aed3a587 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -20,7 +20,7 @@ #include "window.h" -Window::Window(int startx, int starty, int width, int height, string title, Color color, Border border) : itsWindow(0), itsWinBorder(0), itsGetStringHelper(0), itsStartX(startx), itsStartY(starty), itsWidth(width), itsHeight(height), BBEnabled(1), AutoRefreshEnabled(1), itsTitle(title), itsColor(color), itsBaseColor(color), itsBgColor(clDefault), itsBaseBgColor(clDefault), itsBorder(border) +Window::Window(int startx, int starty, int width, int height, string title, Color color, Border border) : itsWindow(0), itsWinBorder(0), itsGetStringHelper(0), itsStartX(startx), itsStartY(starty), itsWidth(width), itsHeight(height), itsWindowTimeout(-1), BBEnabled(1), AutoRefreshEnabled(1), itsTitle(title), itsColor(color), itsBaseColor(color), itsBgColor(clDefault), itsBaseBgColor(clDefault), itsBorder(border) { if (itsStartX < 0) itsStartX = 0; if (itsStartY < 0) itsStartY = 0; @@ -153,7 +153,8 @@ void Window::recreate_win() { delwin(itsWindow); itsWindow = newwin(itsHeight, itsWidth, itsStartY, itsStartX); - SetColor(itsColor); + SetTimeout(itsWindowTimeout); + SetColor(itsColor, itsBgColor); } bool Window::reallocate_win(int newx, int newy) @@ -265,8 +266,9 @@ void Window::Delay(bool delay) const nodelay(itsWindow, !delay); } -void Window::Timeout(int timeout) const +void Window::SetTimeout(int timeout) { + itsWindowTimeout = timeout; wtimeout(itsWindow, timeout); } diff --git a/src/window.h b/src/window.h index c0a4b2a2..4c53ce01 100644 --- a/src/window.h +++ b/src/window.h @@ -84,7 +84,7 @@ class Window virtual void Reverse(bool) const; virtual void AltCharset(bool) const; virtual void Delay(bool) const; - virtual void Timeout(int) const; + virtual void SetTimeout(int); virtual void AutoRefresh(bool val) { AutoRefreshEnabled = val; } virtual void ReadKey(int &) const; virtual void ReadKey() const; @@ -142,6 +142,7 @@ class Window int itsStartY; int itsWidth; int itsHeight; + int itsWindowTimeout; bool BBEnabled; bool AutoRefreshEnabled; string itsTitle;