diff --git a/src/actions.cpp b/src/actions.cpp index 29954010..0d762fe3 100644 --- a/src/actions.cpp +++ b/src/actions.cpp @@ -1119,7 +1119,7 @@ void ToggleDisplayMode::Run() if (Config.columns_in_playlist) { - myPlaylist->main().setItemDisplayer(std::bind(Display::SongsInColumns, _1, myPlaylist)); + myPlaylist->main().setItemDisplayer(std::bind(Display::SongsInColumns, _1, myPlaylist->proxySongList())); if (Config.titles_visibility) myPlaylist->main().setTitle(Display::Columns(myPlaylist->main().getWidth())); else @@ -1127,7 +1127,7 @@ void ToggleDisplayMode::Run() } else { - myPlaylist->main().setItemDisplayer(std::bind(Display::Songs, _1, myPlaylist, Config.song_list_format)); + myPlaylist->main().setItemDisplayer(std::bind(Display::Songs, _1, myPlaylist->proxySongList(), Config.song_list_format)); myPlaylist->main().setTitle(""); } } @@ -1149,9 +1149,9 @@ void ToggleDisplayMode::Run() Config.columns_in_playlist_editor = !Config.columns_in_playlist_editor; Statusbar::msg("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, myPlaylistEditor)); + myPlaylistEditor->Content.setItemDisplayer(std::bind(Display::SongsInColumns, _1, myPlaylistEditor->contentProxyList())); else - myPlaylistEditor->Content.setItemDisplayer(std::bind(Display::Songs, _1, myPlaylistEditor, Config.song_list_format)); + myPlaylistEditor->Content.setItemDisplayer(std::bind(Display::Songs, _1, myPlaylistEditor->contentProxyList(), Config.song_list_format)); } } diff --git a/src/browser.cpp b/src/browser.cpp index 3e625f97..95b97fe0 100644 --- a/src/browser.cpp +++ b/src/browser.cpp @@ -70,7 +70,7 @@ Browser::Browser() : itsBrowseLocally(0), itsScrollBeginning(0), itsBrowsedDir(" w.centeredCursor(Config.centered_cursor); w.setSelectedPrefix(Config.selected_item_prefix); w.setSelectedSuffix(Config.selected_item_suffix); - w.setItemDisplayer(Display::Items); + w.setItemDisplayer(std::bind(Display::Items, _1, proxySongList())); if (SupportedExtensions.empty()) Mpd.GetSupportedExtensions(SupportedExtensions); diff --git a/src/display.cpp b/src/display.cpp index 4f860c25..8a4ba8ed 100644 --- a/src/display.cpp +++ b/src/display.cpp @@ -73,16 +73,15 @@ const wchar_t *toColumnName(char c) } template -void setProperties(NC::Menu &menu, const MPD::Song &s, HasSongs &screen, bool &separate_albums, +void setProperties(NC::Menu &menu, const MPD::Song &s, const ProxySongList &pl, bool &separate_albums, bool &is_now_playing, bool &is_selected, bool &discard_colors) { size_t drawn_pos = menu.drawn() - menu.begin(); separate_albums = false; if (Config.playlist_separate_albums) { - auto pl = screen.proxySongList(); - assert(pl); - auto next = pl.getSong(drawn_pos+1); + size_t next_pos = drawn_pos+1; + auto next = next_pos < pl.size() ? pl.getSong(next_pos) : 0; if (next && next->getAlbum() != s.getAlbum()) separate_albums = true; } @@ -103,10 +102,10 @@ void setProperties(NC::Menu &menu, const MPD::Song &s, HasSongs &screen, bool } template -void showSongs(NC::Menu &menu, const MPD::Song &s, HasSongs &screen, const std::string &format) +void showSongs(NC::Menu &menu, const MPD::Song &s, const ProxySongList &pl, const std::string &format) { bool separate_albums, is_now_playing, is_selected, discard_colors; - setProperties(menu, s, screen, separate_albums, is_now_playing, is_selected, discard_colors); + setProperties(menu, s, pl, separate_albums, is_now_playing, is_selected, discard_colors); size_t y = menu.getY(); std::string line = s.toString(format, Config.tags_separator, "$"); @@ -161,13 +160,13 @@ void showSongs(NC::Menu &menu, const MPD::Song &s, HasSongs &screen, const st } template -void showSongsInColumns(NC::Menu &menu, const MPD::Song &s, HasSongs &screen) +void showSongsInColumns(NC::Menu &menu, const MPD::Song &s, const ProxySongList &pl) { if (Config.columns.empty()) return; bool separate_albums, is_now_playing, is_selected, discard_colors; - setProperties(menu, s, screen, separate_albums, is_now_playing, is_selected, discard_colors); + setProperties(menu, s, pl, separate_albums, is_now_playing, is_selected, discard_colors); int width; int y = menu.getY(); @@ -346,14 +345,14 @@ std::string Display::Columns(size_t list_width) return result; } -void Display::SongsInColumns(NC::Menu &menu, HasSongs *screen) +void Display::SongsInColumns(NC::Menu< MPD::Song >& menu, const ProxySongList &pl) { - showSongsInColumns(menu, menu.drawn()->value(), *screen); + showSongsInColumns(menu, menu.drawn()->value(), pl); } -void Display::Songs(NC::Menu &menu, HasSongs *screen, const std::string &format) +void Display::Songs(NC::Menu< MPD::Song >& menu, const ProxySongList &pl, const std::string &format) { - showSongs(menu, menu.drawn()->value(), *screen, format); + showSongs(menu, menu.drawn()->value(), pl, format); } #ifdef HAVE_TAGLIB_H @@ -382,7 +381,7 @@ void Display::Outputs(NC::Menu &menu) menu << menu.drawn()->value().name(); } -void Display::Items(NC::Menu &menu) +void Display::Items(NC::Menu &menu, const ProxySongList &pl) { const MPD::Item &item = menu.drawn()->value(); switch (item.type) @@ -392,9 +391,9 @@ void Display::Items(NC::Menu &menu) break; case MPD::itSong: if (!Config.columns_in_browser) - showSongs(menu, *item.song, *myBrowser, Config.song_list_format); + showSongs(menu, *item.song, pl, Config.song_list_format); else - showSongsInColumns(menu, *item.song, *myBrowser); + showSongsInColumns(menu, *item.song, pl); break; case MPD::itPlaylist: menu << Config.browser_playlist_prefix << getBasename(item.name); @@ -402,15 +401,15 @@ void Display::Items(NC::Menu &menu) } } -void Display::SearchEngine(NC::Menu &menu) +void Display::SearchEngine(NC::Menu &menu, const ProxySongList &pl) { const SEItem &si = menu.drawn()->value(); if (si.isSong()) { if (!Config.columns_in_search_engine) - showSongs(menu, si.song(), *mySearcher, Config.song_list_format); + showSongs(menu, si.song(), pl, Config.song_list_format); else - showSongsInColumns(menu, si.song(), *mySearcher); + showSongsInColumns(menu, si.song(), pl); } else menu << si.buffer(); diff --git a/src/display.h b/src/display.h index d6606642..5898cdb9 100644 --- a/src/display.h +++ b/src/display.h @@ -36,17 +36,17 @@ void Default(NC::Menu &menu) { menu << menu.drawn()->value(); } template void Pair(NC::Menu< std::pair > &menu) { menu << menu.drawn()->value().first; } -void SongsInColumns(NC::Menu &menu, HasSongs *screen); +void SongsInColumns(NC::Menu &menu, const ProxySongList &pl); -void Songs(NC::Menu &menu, HasSongs *screen, const std::string &format); +void Songs(NC::Menu &menu, const ProxySongList &pl, const std::string &format); void Tags(NC::Menu &menu); void Outputs(NC::Menu &menu); -void SearchEngine(NC::Menu &menu); +void SearchEngine(NC::Menu &menu, const ProxySongList &pl); -void Items(NC::Menu &menu); +void Items(NC::Menu &menu, const ProxySongList &pl); } diff --git a/src/media_library.cpp b/src/media_library.cpp index 991acafa..cd76a9eb 100644 --- a/src/media_library.cpp +++ b/src/media_library.cpp @@ -145,7 +145,7 @@ MediaLibrary::MediaLibrary() Songs.centeredCursor(Config.centered_cursor); Songs.setSelectedPrefix(Config.selected_item_prefix); Songs.setSelectedSuffix(Config.selected_item_suffix); - Songs.setItemDisplayer(std::bind(Display::Songs, _1, this, Config.song_library_format)); + Songs.setItemDisplayer(std::bind(Display::Songs, _1, songsProxyList(), Config.song_library_format)); w = &Tags; } diff --git a/src/menu.h b/src/menu.h index ac7f968d..95bf7a92 100644 --- a/src/menu.h +++ b/src/menu.h @@ -784,6 +784,7 @@ template bool Menu::hasSelected() const template void Menu::highlight(size_t pos) { + assert(pos < m_options_ptr->size()); m_highlight = pos; size_t half_height = m_height/2; if (pos < half_height) diff --git a/src/playlist.cpp b/src/playlist.cpp index 44300451..38d24c2a 100644 --- a/src/playlist.cpp +++ b/src/playlist.cpp @@ -60,9 +60,9 @@ Playlist::Playlist() : itsTotalLength(0), itsRemainingTime(0), itsScrollBegin(0) w.setSelectedPrefix(Config.selected_item_prefix); w.setSelectedSuffix(Config.selected_item_suffix); if (Config.columns_in_playlist) - w.setItemDisplayer(std::bind(Display::SongsInColumns, _1, this)); + w.setItemDisplayer(std::bind(Display::SongsInColumns, _1, proxySongList())); else - w.setItemDisplayer(std::bind(Display::Songs, _1, this, Config.song_list_format)); + w.setItemDisplayer(std::bind(Display::Songs, _1, proxySongList(), Config.song_list_format)); } void Playlist::switchTo() diff --git a/src/playlist_editor.cpp b/src/playlist_editor.cpp index 8dfe971b..c125dbb0 100644 --- a/src/playlist_editor.cpp +++ b/src/playlist_editor.cpp @@ -77,9 +77,9 @@ PlaylistEditor::PlaylistEditor() Content.setSelectedPrefix(Config.selected_item_prefix); Content.setSelectedSuffix(Config.selected_item_suffix); if (Config.columns_in_playlist_editor) - Content.setItemDisplayer(std::bind(Display::SongsInColumns, _1, this)); + Content.setItemDisplayer(std::bind(Display::SongsInColumns, _1, contentProxyList())); else - Content.setItemDisplayer(std::bind(Display::Songs, _1, this, Config.song_list_format)); + Content.setItemDisplayer(std::bind(Display::Songs, _1, contentProxyList(), Config.song_list_format)); w = &Playlists; } diff --git a/src/proxy_song_list.h b/src/proxy_song_list.h index f713a277..30429564 100644 --- a/src/proxy_song_list.h +++ b/src/proxy_song_list.h @@ -68,20 +68,25 @@ class ProxySongList virtual void highlight(size_t pos) { m_menu.highlight(pos); } virtual bool isSelected(size_t pos) { + assert(pos < m_menu.size()); return m_menu[pos].isSelected(); } virtual void setSelected(size_t pos, bool selected) { + assert(pos < m_menu.size()); m_menu[pos].setSelected(selected); } virtual bool isBold(size_t pos) { + assert(pos < m_menu.size()); return m_menu[pos].isBold(); } virtual void setBold(size_t pos, bool bold) { + assert(pos < m_menu.size()); m_menu[pos].setBold(bold); } virtual MPD::Song *getSong(size_t pos) { + assert(pos < m_menu.size()); return m_song_getter(m_menu[pos]); } virtual MPD::Song *currentSong() { @@ -104,19 +109,19 @@ public: template ProxySongList(typename NC::Menu &menu, F f) : m_impl(new Impl(menu, f)) { } - bool empty() { return m_impl->empty(); } - size_t size() { return m_impl->size(); } - size_t choice() { return m_impl->choice(); } - void highlight(size_t pos) { m_impl->highlight(pos); } + bool empty() const { return m_impl->empty(); } + size_t size() const { return m_impl->size(); } + size_t choice() const { return m_impl->choice(); } + void highlight(size_t pos) const { m_impl->highlight(pos); } - bool isSelected(size_t pos) { return m_impl->isSelected(pos); } - void setSelected(size_t pos, bool selected) { m_impl->setSelected(pos, selected); } + bool isSelected(size_t pos) const { return m_impl->isSelected(pos); } + void setSelected(size_t pos, bool selected) const { m_impl->setSelected(pos, selected); } - bool isBold(size_t pos) { return m_impl->isBold(pos); } - void setBold(size_t pos, bool bold) { m_impl->setBold(pos, bold); } + bool isBold(size_t pos) const { return m_impl->isBold(pos); } + void setBold(size_t pos, bool bold) const{ m_impl->setBold(pos, bold); } - MPD::Song *getSong(size_t pos) { return m_impl->getSong(pos); } - MPD::Song *currentSong() { return m_impl->currentSong(); } + MPD::Song *getSong(size_t pos) const { return m_impl->getSong(pos); } + MPD::Song *currentSong() const { return m_impl->currentSong(); } /// @return true if there is no underlying menu object, false otherwise operator bool() const { return m_impl.get() != 0; } diff --git a/src/search_engine.cpp b/src/search_engine.cpp index c4fc3b37..12327a27 100644 --- a/src/search_engine.cpp +++ b/src/search_engine.cpp @@ -108,7 +108,7 @@ SearchEngine::SearchEngine() w.setHighlightColor(Config.main_highlight_color); w.cyclicScrolling(Config.use_cyclic_scrolling); w.centeredCursor(Config.centered_cursor); - w.setItemDisplayer(Display::SearchEngine); + w.setItemDisplayer(std::bind(Display::SearchEngine, _1, proxySongList())); w.setSelectedPrefix(Config.selected_item_prefix); w.setSelectedSuffix(Config.selected_item_suffix); SearchMode = &SearchModes[Config.search_engine_default_search_mode];