From 1596c8ed401c7136153041932b35cfd8410f961f Mon Sep 17 00:00:00 2001 From: Andrzej Rybczak Date: Fri, 31 Aug 2012 11:57:25 +0200 Subject: [PATCH] menu: simplify ItemDisplayer further --- src/actions.cpp | 8 ++++---- src/browser.cpp | 2 +- src/display.cpp | 41 ++++++++++++++++++++++------------------- src/display.h | 20 ++++++++++---------- src/media_library.cpp | 9 +++++---- src/media_library.h | 4 ++-- src/menu.h | 18 ++++++++++++------ src/playlist.cpp | 4 ++-- src/playlist_editor.cpp | 4 ++-- 9 files changed, 60 insertions(+), 50 deletions(-) diff --git a/src/actions.cpp b/src/actions.cpp index 104cae85..0092169a 100644 --- a/src/actions.cpp +++ b/src/actions.cpp @@ -1161,13 +1161,13 @@ void ToggleDisplayMode::Run() if (Config.columns_in_playlist) { - myPlaylist->Items->setItemDisplayer(std::bind(Display::SongsInColumns, _1, _2, *myPlaylist)); + myPlaylist->Items->setItemDisplayer(std::bind(Display::SongsInColumns, _1, *myPlaylist)); myPlaylist->Items->SetTitle(Config.titles_visibility ? Display::Columns(myPlaylist->Items->GetWidth()) : ""); myPlaylist->Items->SetItemStringifier(Playlist::SongInColumnsToString); } else { - myPlaylist->Items->setItemDisplayer(std::bind(Display::Songs, _1, _2, *myPlaylist, Config.song_list_format)); + myPlaylist->Items->setItemDisplayer(std::bind(Display::Songs, _1, *myPlaylist, Config.song_list_format)); myPlaylist->Items->SetTitle(""); myPlaylist->Items->SetItemStringifier(Playlist::SongToString); } @@ -1191,12 +1191,12 @@ void ToggleDisplayMode::Run() ShowMessage("Playlist editor display mode: %s", Config.columns_in_playlist_editor ? "Columns" : "Classic"); if (Config.columns_in_playlist_editor) { - myPlaylistEditor->Content->setItemDisplayer(std::bind(Display::SongsInColumns, _1, _2, *myPlaylistEditor)); + myPlaylistEditor->Content->setItemDisplayer(std::bind(Display::SongsInColumns, _1, *myPlaylistEditor)); myPlaylistEditor->Content->SetItemStringifier(Playlist::SongInColumnsToString); } else { - myPlaylistEditor->Content->setItemDisplayer(std::bind(Display::Songs, _1, _2, *myPlaylistEditor, Config.song_list_format)); + myPlaylistEditor->Content->setItemDisplayer(std::bind(Display::Songs, _1, *myPlaylistEditor, Config.song_list_format)); myPlaylistEditor->Content->SetItemStringifier(Playlist::SongToString); } } diff --git a/src/browser.cpp b/src/browser.cpp index 5499aa97..446556b9 100644 --- a/src/browser.cpp +++ b/src/browser.cpp @@ -58,7 +58,7 @@ void Browser::Init() w->CenteredCursor(Config.centered_cursor); w->SetSelectPrefix(Config.selected_item_prefix); w->SetSelectSuffix(Config.selected_item_suffix); - w->setItemDisplayer(std::bind(Display::Items, _1, _2)); + w->setItemDisplayer(Display::Items); w->SetItemStringifier(ItemToString); if (SupportedExtensions.empty()) diff --git a/src/display.cpp b/src/display.cpp index fa4041f2..abff372c 100644 --- a/src/display.cpp +++ b/src/display.cpp @@ -77,18 +77,18 @@ void setProperties(Menu &menu, const MPD::Song &s, BasicScreen &screen, bool bool &is_now_playing, bool &is_selected, bool &discard_colors) { separate_albums = false; - if (Config.playlist_separate_albums && menu.CurrentlyDrawedPosition()+1 < menu.Size()) + if (Config.playlist_separate_albums) { - MPD::Song *next = screen.GetSong(menu.CurrentlyDrawedPosition()+1); + MPD::Song *next = screen.GetSong(menu.DrawnPosition()+1); if (next && next->getAlbum() != s.getAlbum()) separate_albums = true; } if (separate_albums) menu << fmtUnderline; - int song_pos = menu.isFiltered() ? s.getPosition() : menu.CurrentlyDrawedPosition(); + int song_pos = menu.isFiltered() ? s.getPosition() : menu.DrawnPosition(); is_now_playing = song_pos == myPlaylist->NowPlaying && s.getID() > 0; // playlist - is_selected = menu[menu.CurrentlyDrawedPosition()].isSelected(); + is_selected = menu.Drawn().isSelected(); discard_colors = Config.discard_colors_if_item_is_selected && is_selected; } @@ -99,7 +99,7 @@ void showSongs(Menu &menu, const MPD::Song &s, BasicScreen &screen, const std setProperties(menu, s, screen, separate_albums, is_now_playing, is_selected, discard_colors); std::string line = s.toString(format, "$"); - for (std::string::const_iterator it = line.begin(); it != line.end(); ++it) + for (auto it = line.begin(); it != line.end(); ++it) { if (*it == '$') { @@ -122,7 +122,7 @@ void showSongs(Menu &menu, const MPD::Song &s, BasicScreen &screen, const std buf.RemoveFormatting(); if (is_now_playing) buf << Config.now_playing_suffix; - menu << XY(menu.GetWidth()-buf.Str().length()-(menu[menu.CurrentlyDrawedPosition()].isSelected() ? Config.selected_item_suffix_length : 0), menu.Y()) << buf; + menu << XY(menu.GetWidth()-buf.Str().length()-(is_selected ? Config.selected_item_suffix_length : 0), menu.Y()) << buf; if (separate_albums) menu << fmtUnderlineEnd; return; @@ -332,18 +332,19 @@ std::string Display::Columns(size_t list_width) return result; } -void Display::SongsInColumns(Menu &menu, const MPD::Song &s, BasicScreen &screen) +void Display::SongsInColumns(Menu &menu, BasicScreen &screen) { - showSongsInColumns(menu, s, screen); + showSongsInColumns(menu, menu.Drawn().value(), screen); } -void Display::Songs(Menu &menu, const MPD::Song &s, BasicScreen &screen, const std::string &format) +void Display::Songs(Menu &menu, BasicScreen &screen, const std::string &format) { - showSongs(menu, s, screen, format); + showSongs(menu, menu.Drawn().value(), screen, format); } -void Display::Tags(Menu &menu, const MPD::MutableSong &s) +void Display::Tags(Menu &menu) { + const MPD::MutableSong &s = menu.Drawn().value(); size_t i = myTagEditor->TagTypes->Choice(); if (i < 11) { @@ -358,13 +359,14 @@ void Display::Tags(Menu &menu, const MPD::MutableSong &s) } } -void Display::Outputs(Menu< MPD::Output > &menu, const MPD::Output &o) +void Display::Outputs(Menu< MPD::Output > &menu) { - menu << o.name(); + menu << menu.Drawn().value().name(); } -void Display::Items(Menu &menu, const MPD::Item &item) +void Display::Items(Menu &menu) { + const MPD::Item &item = menu.Drawn().value(); switch (item.type) { case MPD::itDirectory: @@ -382,15 +384,16 @@ void Display::Items(Menu &menu, const MPD::Item &item) } } -void Display::SearchEngine(Menu &menu, const SEItem &ei) +void Display::SearchEngine(Menu &menu) { - if (ei.isSong()) + const SEItem &si = menu.Drawn().value(); + if (si.isSong()) { if (!Config.columns_in_search_engine) - showSongs(menu, ei.song(), *mySearcher, Config.song_list_format); + showSongs(menu, si.song(), *mySearcher, Config.song_list_format); else - showSongsInColumns(menu, ei.song(), *mySearcher); + showSongsInColumns(menu, si.song(), *mySearcher); } else - menu << ei.buffer(); + menu << si.buffer(); } diff --git a/src/display.h b/src/display.h index 10b6b3fa..efd0c41c 100644 --- a/src/display.h +++ b/src/display.h @@ -32,27 +32,27 @@ namespace Display { std::string Columns(size_t); - template void Default(Menu &menu, const T &t) + template void Default(Menu &menu) { - menu << t; + menu << menu.Drawn().value(); } - template void Pair(Menu< std::pair > &menu, const std::pair &pair) + template void Pair(Menu< std::pair > &menu) { - menu << pair.first; + menu << menu.Drawn().value().first; } - void SongsInColumns(Menu &menu, const MPD::Song &s, BasicScreen &screen); + void SongsInColumns(Menu &menu, BasicScreen &screen); - void Songs(Menu &menu, const MPD::Song &s, BasicScreen &screen, const std::string &format); + void Songs(Menu &menu, BasicScreen &screen, const std::string &format); - void Tags(Menu &menu, const MPD::MutableSong &s); + void Tags(Menu &menu); - void Outputs(Menu &menu, const MPD::Output &o); + void Outputs(Menu &menu); - void SearchEngine(Menu &menu, const SEItem &si); + void SearchEngine(Menu &menu); - void Items(Menu &menu, const MPD::Item &item); + void Items(Menu &menu); } #endif diff --git a/src/media_library.cpp b/src/media_library.cpp index 3b4a3b0a..9ffe416b 100644 --- a/src/media_library.cpp +++ b/src/media_library.cpp @@ -84,7 +84,7 @@ void MediaLibrary::Init() Songs->CenteredCursor(Config.centered_cursor); Songs->SetSelectPrefix(Config.selected_item_prefix); Songs->SetSelectSuffix(Config.selected_item_suffix); - Songs->setItemDisplayer(std::bind(Display::Songs, _1, _2, *this, Config.song_library_format)); + Songs->setItemDisplayer(std::bind(Display::Songs, _1, *this, Config.song_library_format)); Songs->SetItemStringifier(SongToString); w = Artists; @@ -768,13 +768,14 @@ std::string MediaLibrary::AlbumToString(const SearchConstraints &sc) return result; } -void MediaLibrary::DisplayAlbums(Menu &menu, const SearchConstraints &sc) +void MediaLibrary::DisplayAlbums(Menu &menu) { - menu << AlbumToString(sc); + menu << AlbumToString(menu.Drawn().value()); } -void MediaLibrary::DisplayPrimaryTags(Menu &menu, const std::string &tag) +void MediaLibrary::DisplayPrimaryTags(Menu &menu) { + const std::string &tag = menu.Drawn().value(); if (tag.empty()) menu << Config.empty_tag; else diff --git a/src/media_library.h b/src/media_library.h index d18fc42c..6e9fa7b5 100644 --- a/src/media_library.h +++ b/src/media_library.h @@ -90,8 +90,8 @@ class MediaLibrary : public Screen static std::string SongToString(const MPD::Song &s); static std::string AlbumToString(const SearchConstraints &); - static void DisplayAlbums(Menu &menu, const SearchConstraints &sc); - static void DisplayPrimaryTags(Menu &menu, const std::string &tag); + static void DisplayAlbums(Menu &menu); + static void DisplayPrimaryTags(Menu &menu); static bool SortSongsByTrack(const MPD::Song &, const MPD::Song &); static bool SortAllTracks(const MPD::Song &, const MPD::Song &); diff --git a/src/menu.h b/src/menu.h index 2d254400..29a64750 100644 --- a/src/menu.h +++ b/src/menu.h @@ -100,7 +100,7 @@ template struct Menu : public Window, public List /// If not set by setItemDisplayer(), menu won't display anything. /// @see setItemDisplayer() /// - typedef std::function &, const T &)> ItemDisplayer; + typedef std::function &)> ItemDisplayer; /// Function helper prototype used for converting items to strings. /// If not set by SetItemStringifier(), searching and filtering @@ -466,11 +466,17 @@ template struct Menu : public Window, public List /// virtual size_t Size() const; - /// @return position of currently drawed item. The result is - /// defined only within drawing function that is called by Refresh() + /// @return currently drawn item. The result is defined only within + /// drawing function that is called by Refresh() /// @see Refresh() /// - size_t CurrentlyDrawedPosition() const { return m_drawn_position; } + const Item &Drawn() const { return *(*m_options_ptr)[m_drawn_position]; } + + /// @return position of currently drawn item. The result is defined + /// only within drawing function that is called by Refresh() + /// @see Refresh() + /// + size_t DrawnPosition() const { return m_drawn_position; } /// @return reference to last item on the list /// @throw List::InvalidItem if requested item is separator @@ -537,7 +543,7 @@ template struct Menu : public Window, public List ConstReverseIterator RbeginV() const { return ConstReverseValueIterator(End()); } ReverseValueIterator RendV() { return ReverseValueIterator(Begin()); } ConstReverseValueIterator RendV() const { return ConstReverseValueIterator(Begin()); } - + private: /// Clears filter, filtered data etc. /// @@ -719,7 +725,7 @@ template void Menu::Refresh() if ((*m_options_ptr)[i]->isSelected()) *this << m_selected_prefix; if (m_item_displayer) - m_item_displayer(*this, (*m_options_ptr)[i]->value()); + m_item_displayer(*this); if ((*m_options_ptr)[i]->isSelected()) *this << m_selected_suffix; if (m_highlight_enabled && i == m_highlight) diff --git a/src/playlist.cpp b/src/playlist.cpp index eb1b4875..176681db 100644 --- a/src/playlist.cpp +++ b/src/playlist.cpp @@ -53,12 +53,12 @@ void Playlist::Init() Items->SetSelectSuffix(Config.selected_item_suffix); if (Config.columns_in_playlist) { - Items->setItemDisplayer(std::bind(Display::SongsInColumns, _1, _2, *this)); + Items->setItemDisplayer(std::bind(Display::SongsInColumns, _1, *this)); Items->SetItemStringifier(SongInColumnsToString); } else { - Items->setItemDisplayer(std::bind(Display::Songs, _1, _2, *this, Config.song_list_format)); + Items->setItemDisplayer(std::bind(Display::Songs, _1, *this, Config.song_list_format)); Items->SetItemStringifier(SongToString); } diff --git a/src/playlist_editor.cpp b/src/playlist_editor.cpp index bb31f234..d05b2b27 100644 --- a/src/playlist_editor.cpp +++ b/src/playlist_editor.cpp @@ -62,12 +62,12 @@ void PlaylistEditor::Init() Content->SetSelectSuffix(Config.selected_item_suffix); if (Config.columns_in_playlist_editor) { - Content->setItemDisplayer(std::bind(Display::SongsInColumns, _1, _2, *this)); + Content->setItemDisplayer(std::bind(Display::SongsInColumns, _1, *this)); Content->SetItemStringifier(Playlist::SongInColumnsToString); } else { - Content->setItemDisplayer(std::bind(Display::Songs, _1, _2, *this, Config.song_list_format)); + Content->setItemDisplayer(std::bind(Display::Songs, _1, *this, Config.song_list_format)); Content->SetItemStringifier(Playlist::SongToString); }