From d962653c764f0e9435f303828b61dd072fafb35b Mon Sep 17 00:00:00 2001 From: Andrzej Rybczak Date: Mon, 12 Jul 2010 09:14:15 +0200 Subject: [PATCH] make feature 'display separators between albums' work in all screens --- doc/ncmpcpp.1 | 2 +- src/browser.cpp | 3 +++ src/browser.h | 1 + src/display.cpp | 42 +++++++++++++++++++++++++---------------- src/display.h | 7 +++++++ src/help.cpp | 2 +- src/media_library.cpp | 4 +++- src/media_library.h | 1 + src/playlist.cpp | 6 ++++-- src/playlist.h | 1 + src/playlist_editor.cpp | 4 +++- src/playlist_editor.h | 1 + src/screen.h | 5 +++++ src/search_engine.cpp | 3 +++ src/search_engine.h | 1 + src/tag_editor.h | 1 + 16 files changed, 62 insertions(+), 22 deletions(-) diff --git a/doc/ncmpcpp.1 b/doc/ncmpcpp.1 index 3a476d5c..3becafca 100644 --- a/doc/ncmpcpp.1 +++ b/doc/ncmpcpp.1 @@ -175,7 +175,7 @@ If enabled, time remaining to end of playlist will be shown after playlist's sta If enabled, total/remaining playlist time displayed in statusbar will be shown using shortened units' names (d:h:m:s instead of days:hours:minutes:seconds). .TP .B playlist_separate_albums = yes/no -If enabled, separators will be placed between albums in playlist. +If enabled, separators will be placed between albums. .TP .B playlist_display_mode = classic/columns Default display mode for Playlist. diff --git a/src/browser.cpp b/src/browser.cpp index 57c850b6..8c7ae267 100644 --- a/src/browser.cpp +++ b/src/browser.cpp @@ -57,6 +57,8 @@ const char *Browser::SupportedExtensions[] = void Browser::Init() { + static Display::ScreenFormat sf = { this, &Config.song_list_format }; + w = new Menu(0, MainStartY, COLS, MainHeight, Config.columns_in_browser ? Display::Columns() : "", Config.main_color, brNone); w->HighlightColor(Config.main_highlight_color); w->CyclicScrolling(Config.use_cyclic_scrolling); @@ -64,6 +66,7 @@ void Browser::Init() w->SetSelectPrefix(&Config.selected_item_prefix); w->SetSelectSuffix(&Config.selected_item_suffix); w->SetItemDisplayer(Display::Items); + w->SetItemDisplayerUserData(&sf); w->SetGetStringFunction(ItemToString); isInitialized = 1; } diff --git a/src/browser.h b/src/browser.h index 099329b2..ecf92b89 100644 --- a/src/browser.h +++ b/src/browser.h @@ -40,6 +40,7 @@ class Browser : public Screen< Menu > virtual bool isTabbable() { return true; } virtual MPD::Song *CurrentSong(); + virtual MPD::Song *GetSong(size_t pos) { return w->at(pos).type == MPD::itSong ? (*w)[pos].song : 0; } virtual bool allowsSelection() { return true; } virtual void ReverseSelection(); diff --git a/src/display.cpp b/src/display.cpp index 3735f9c2..4884ce02 100644 --- a/src/display.cpp +++ b/src/display.cpp @@ -18,6 +18,8 @@ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ +#include + #include "display.h" #include "helpers.h" #include "info.h" @@ -130,7 +132,7 @@ std::string Display::Columns() return TO_STRING(result); } -void Display::SongsInColumns(const MPD::Song &s, void *, Menu *menu) +void Display::SongsInColumns(const MPD::Song &s, void *data, Menu *menu) { if (!s.Localized()) const_cast(&s)->Localize(); @@ -142,10 +144,14 @@ void Display::SongsInColumns(const MPD::Song &s, void *, Menu *menu) if (Config.columns.empty()) return; - bool separate_albums = Config.playlist_separate_albums - && myScreen == myPlaylist - && menu->CurrentlyDrawedPosition()+1 < myPlaylist->Items->Size() - && (*myPlaylist->Items)[menu->CurrentlyDrawedPosition()+1].GetAlbum() != s.GetAlbum(); + assert(data); + bool separate_albums = false; + if (Config.playlist_separate_albums && menu->CurrentlyDrawedPosition()+1 < menu->Size()) + { + MPD::Song *next = static_cast(data)->screen->GetSong(menu->CurrentlyDrawedPosition()+1); + if (next && next->GetAlbum() != s.GetAlbum()) + separate_albums = true; + } if (separate_albums) *menu << fmtUnderline; @@ -300,10 +306,14 @@ void Display::Songs(const MPD::Song &s, void *data, Menu *menu) if (is_now_playing) *menu << Config.now_playing_prefix; - bool separate_albums = Config.playlist_separate_albums - && myScreen == myPlaylist - && menu->CurrentlyDrawedPosition()+1 < myPlaylist->Items->Size() - && (*myPlaylist->Items)[menu->CurrentlyDrawedPosition()+1].GetAlbum() != s.GetAlbum(); + assert(data); + bool separate_albums = false; + if (Config.playlist_separate_albums && menu->CurrentlyDrawedPosition()+1 < menu->Size()) + { + MPD::Song *next = static_cast(data)->screen->GetSong(menu->CurrentlyDrawedPosition()+1); + if (next && next->GetAlbum() != s.GetAlbum()) + separate_albums = true; + } if (separate_albums) { *menu << fmtUnderline; @@ -312,7 +322,7 @@ void Display::Songs(const MPD::Song &s, void *data, Menu *menu) bool discard_colors = Config.discard_colors_if_item_is_selected && menu->isSelected(menu->CurrentlyDrawedPosition()); - std::string line = s.toString(*static_cast(data), "$"); + std::string line = s.toString(*static_cast(data)->format, "$"); for (std::string::const_iterator it = line.begin(); it != line.end(); ++it) { if (*it == '$') @@ -376,7 +386,7 @@ void Display::Tags(const MPD::Song &s, void *data, Menu *menu) } } -void Display::Items(const MPD::Item &item, void *, Menu *menu) +void Display::Items(const MPD::Item &item, void *data, Menu *menu) { switch (item.type) { @@ -392,9 +402,9 @@ void Display::Items(const MPD::Item &item, void *, Menu *menu) } case MPD::itSong: if (!Config.columns_in_browser) - Display::Songs(*item.song, &Config.song_list_format, reinterpret_cast *>(menu)); + Display::Songs(*item.song, data, reinterpret_cast *>(menu)); else - Display::SongsInColumns(*item.song, 0, reinterpret_cast *>(menu)); + Display::SongsInColumns(*item.song, data, reinterpret_cast *>(menu)); return; case MPD::itPlaylist: *menu << Config.browser_playlist_prefix << ExtractTopName(item.name); @@ -404,14 +414,14 @@ void Display::Items(const MPD::Item &item, void *, Menu *menu) } } -void Display::SearchEngine(const std::pair &pair, void *, Menu< std::pair > *menu) +void Display::SearchEngine(const std::pair &pair, void *data, Menu< std::pair > *menu) { if (pair.second) { if (!Config.columns_in_search_engine) - Display::Songs(*pair.second, &Config.song_list_format, reinterpret_cast *>(menu)); + Display::Songs(*pair.second, data, reinterpret_cast *>(menu)); else - Display::SongsInColumns(*pair.second, 0, reinterpret_cast *>(menu)); + Display::SongsInColumns(*pair.second, data, reinterpret_cast *>(menu)); } else diff --git a/src/display.h b/src/display.h index 95a8b8cd..4662a732 100644 --- a/src/display.h +++ b/src/display.h @@ -24,9 +24,16 @@ #include "ncmpcpp.h" #include "menu.h" #include "mpdpp.h" +#include "screen.h" namespace Display { + struct ScreenFormat + { + BasicScreen *screen; + std::string *format; + }; + std::string Columns(); template void Generic(const T &t, void *, Menu *menu) diff --git a/src/help.cpp b/src/help.cpp index 09f6a58c..95cccefa 100644 --- a/src/help.cpp +++ b/src/help.cpp @@ -210,7 +210,7 @@ void Help::GetKeybindings() # endif // HAVE_TAGLIB_H *w << DisplayKeys(Key.ToggleDisplayMode) << "Toggle display mode\n"; *w << DisplayKeys(Key.ToggleInterface) << "Toggle user interface\n"; - *w << DisplayKeys(Key.ToggleSeparatorsInPlaylist) << "Toggle displaying separators between albums in playlist\n"; + *w << DisplayKeys(Key.ToggleSeparatorsInPlaylist) << "Toggle displaying separators between albums\n"; *w << DisplayKeys(Key.GoToPosition) << "Go to given position in current song (in % by default)\n"; *w << DisplayKeys(Key.SongInfo) << "Show song info\n"; # ifdef HAVE_CURL_CURL_H diff --git a/src/media_library.cpp b/src/media_library.cpp index d4cc92d3..746b2429 100644 --- a/src/media_library.cpp +++ b/src/media_library.cpp @@ -75,6 +75,8 @@ void MediaLibrary::Init() Albums->SetGetStringFunction(AlbumToString); Albums->SetGetStringFunctionUserData(this); + static Display::ScreenFormat sf = { this, &Config.song_library_format }; + Songs = new Menu(itsRightColStartX, MainStartY, itsRightColWidth, MainHeight, "Songs", Config.main_color, brNone); Songs->HighlightColor(Config.main_highlight_color); Songs->CyclicScrolling(Config.use_cyclic_scrolling); @@ -82,7 +84,7 @@ void MediaLibrary::Init() Songs->SetSelectPrefix(&Config.selected_item_prefix); Songs->SetSelectSuffix(&Config.selected_item_suffix); Songs->SetItemDisplayer(Display::Songs); - Songs->SetItemDisplayerUserData(&Config.song_library_format); + Songs->SetItemDisplayerUserData(&sf); Songs->SetGetStringFunction(SongToString); w = Artists; diff --git a/src/media_library.h b/src/media_library.h index 25613d77..cc915050 100644 --- a/src/media_library.h +++ b/src/media_library.h @@ -56,6 +56,7 @@ class MediaLibrary : public Screen virtual bool isTabbable() { return true; } virtual MPD::Song *CurrentSong(); + virtual MPD::Song *GetSong(size_t pos) { return w == Songs ? &Songs->at(pos) : 0; } virtual bool allowsSelection() { return true; } virtual void ReverseSelection(); diff --git a/src/playlist.cpp b/src/playlist.cpp index e4d0fbab..1de4749d 100644 --- a/src/playlist.cpp +++ b/src/playlist.cpp @@ -47,6 +47,8 @@ Menu< std::pair > *Playlist::SortDialog = 0 void Playlist::Init() { + static Display::ScreenFormat sf = { this, &Config.song_list_format }; + Items = new Menu(0, MainStartY, COLS, MainHeight, Config.columns_in_playlist ? Display::Columns() : "", Config.main_color, brNone); Items->CyclicScrolling(Config.use_cyclic_scrolling); Items->CenteredCursor(Config.centered_cursor); @@ -54,7 +56,7 @@ void Playlist::Init() Items->SetSelectPrefix(&Config.selected_item_prefix); Items->SetSelectSuffix(&Config.selected_item_suffix); Items->SetItemDisplayer(Config.columns_in_playlist ? Display::SongsInColumns : Display::Songs); - Items->SetItemDisplayerUserData(&Config.song_list_format); + Items->SetItemDisplayerUserData(&sf); Items->SetGetStringFunction(Config.columns_in_playlist ? SongInColumnsToString : SongToString); Items->SetGetStringFunctionUserData(&Config.song_list_format); @@ -275,7 +277,7 @@ void Playlist::MouseButtonPressed(MEVENT me) MPD::Song *Playlist::CurrentSong() { - return !Items->Empty() ? &Items->Current() : 0; + return w == Items && !Items->Empty() ? &Items->Current() : 0; } void Playlist::GetSelectedSongs(MPD::SongList &v) diff --git a/src/playlist.h b/src/playlist.h index 12466f10..79555bcf 100644 --- a/src/playlist.h +++ b/src/playlist.h @@ -45,6 +45,7 @@ class Playlist : public Screen virtual bool isTabbable() { return true; } virtual MPD::Song *CurrentSong(); + virtual MPD::Song *GetSong(size_t pos) { return w == Items ? &Items->at(pos) : 0; } virtual bool allowsSelection() { return w == Items; } virtual void ReverseSelection() { Items->ReverseSelection(); } diff --git a/src/playlist_editor.cpp b/src/playlist_editor.cpp index df186486..8b6c5235 100644 --- a/src/playlist_editor.cpp +++ b/src/playlist_editor.cpp @@ -51,6 +51,8 @@ void PlaylistEditor::Init() Playlists->CenteredCursor(Config.centered_cursor); Playlists->SetItemDisplayer(Display::Generic); + static Display::ScreenFormat sf = { this, &Config.song_list_format }; + Content = new Menu(RightColumnStartX, MainStartY, RightColumnWidth, MainHeight, "Playlist's content", Config.main_color, brNone); Content->HighlightColor(Config.main_highlight_color); Content->CyclicScrolling(Config.use_cyclic_scrolling); @@ -58,7 +60,7 @@ void PlaylistEditor::Init() Content->SetSelectPrefix(&Config.selected_item_prefix); Content->SetSelectSuffix(&Config.selected_item_suffix); Content->SetItemDisplayer(Display::Songs); - Content->SetItemDisplayerUserData(&Config.song_list_format); + Content->SetItemDisplayerUserData(&sf); Content->SetGetStringFunction(Playlist::SongToString); Content->SetGetStringFunctionUserData(&Config.song_list_format); diff --git a/src/playlist_editor.h b/src/playlist_editor.h index 48bd9809..8e07c3ca 100644 --- a/src/playlist_editor.h +++ b/src/playlist_editor.h @@ -40,6 +40,7 @@ class PlaylistEditor : public Screen virtual bool isTabbable() { return true; } virtual MPD::Song *CurrentSong(); + virtual MPD::Song *GetSong(size_t pos) { return w == Content ? &Content->at(pos) : 0; } virtual bool allowsSelection() { return w == Content; } virtual void ReverseSelection() { Content->ReverseSelection(); } diff --git a/src/screen.h b/src/screen.h index 24ef6b55..6668cdf3 100644 --- a/src/screen.h +++ b/src/screen.h @@ -96,6 +96,11 @@ class BasicScreen /// virtual MPD::Song *CurrentSong() { return 0; } + /// @return pointer to song at given position in the screen + /// (if screen is provides one) or null pointer otherwise. + /// + virtual MPD::Song *GetSong(GNUC_UNUSED size_t pos) { return 0; } + /// @return true if the screen allows selecting items, false otherwise /// virtual bool allowsSelection() = 0; diff --git a/src/search_engine.cpp b/src/search_engine.cpp index ffa87195..af241752 100644 --- a/src/search_engine.cpp +++ b/src/search_engine.cpp @@ -61,11 +61,14 @@ size_t SearchEngine::SearchButton = 14; void SearchEngine::Init() { + static Display::ScreenFormat sf = { this, &Config.song_list_format }; + w = new Menu< std::pair >(0, MainStartY, COLS, MainHeight, "", Config.main_color, brNone); w->HighlightColor(Config.main_highlight_color); w->CyclicScrolling(Config.use_cyclic_scrolling); w->CenteredCursor(Config.centered_cursor); w->SetItemDisplayer(Display::SearchEngine); + w->SetItemDisplayerUserData(&sf); w->SetSelectPrefix(&Config.selected_item_prefix); w->SetSelectSuffix(&Config.selected_item_suffix); w->SetGetStringFunction(SearchEngineOptionToString); diff --git a/src/search_engine.h b/src/search_engine.h index b71ca842..f006f233 100644 --- a/src/search_engine.h +++ b/src/search_engine.h @@ -38,6 +38,7 @@ class SearchEngine : public Screen< Menu< std::pair > > virtual bool isTabbable() { return true; } virtual MPD::Song *CurrentSong(); + virtual MPD::Song *GetSong(size_t pos) { return w->at(pos).second; } virtual bool allowsSelection() { return w->Choice() >= StaticOptions; } virtual void ReverseSelection() { w->ReverseSelection(StaticOptions); } diff --git a/src/tag_editor.h b/src/tag_editor.h index 61c2404d..7e164111 100644 --- a/src/tag_editor.h +++ b/src/tag_editor.h @@ -56,6 +56,7 @@ class TagEditor : public Screen virtual bool isTabbable() { return true; } virtual MPD::Song *CurrentSong(); + virtual MPD::Song *GetSong(size_t pos) { return w == Tags ? &Tags->at(pos) : 0; } virtual bool allowsSelection() { return w == Tags; } virtual void ReverseSelection() { Tags->ReverseSelection(); }