diff --git a/src/browser.cpp b/src/browser.cpp index 6a409439..a95bb9c6 100644 --- a/src/browser.cpp +++ b/src/browser.cpp @@ -108,7 +108,10 @@ void Browser::SwitchTo() if (isLocal() && Config.browser_sort_mode == smMTime) // local browser doesn't support sorting by mtime Config.browser_sort_mode = smName; - w->empty() ? myBrowser->GetDirectory(itsBrowsedDir) : myBrowser->UpdateItemList(); + if (w->empty()) + myBrowser->GetDirectory(itsBrowsedDir); + else + markSongsInPlaylist(getProxySongList()); if (myScreen != this && myScreen->isTabbable()) Global::myPrevScreen = myScreen; @@ -612,13 +615,6 @@ bool Browser::deleteItem(const MPD::Item &item) } #endif // !WIN32 -void Browser::UpdateItemList() -{ - for (auto it = w->begin(); it != w->end(); ++it) - if (it->value().type == itSong) - it->setBold(myPlaylist->checkForSong(*it->value().song)); -} - namespace {// bool hasSupportedExtension(const std::string &file) diff --git a/src/browser.h b/src/browser.h index 392cb758..46e56a25 100644 --- a/src/browser.h +++ b/src/browser.h @@ -73,7 +73,6 @@ class Browser : public Screen< NC::Menu >, public Filterable, public void ChangeBrowseMode(); bool deleteItem(const MPD::Item &); # endif // !WIN32 - void UpdateItemList(); static bool isParentDirectory(const MPD::Item &item) { return item.type == MPD::itDirectory && item.name == ".."; diff --git a/src/helpers.cpp b/src/helpers.cpp index 301928f9..11249fbd 100644 --- a/src/helpers.cpp +++ b/src/helpers.cpp @@ -282,11 +282,12 @@ std::string Timestamp(time_t t) return result; } -void UpdateSongList(NC::Menu *menu) +void markSongsInPlaylist(std::shared_ptr pl) { - for (auto it = menu->begin(); it != menu->end(); ++it) - it->setBold(myPlaylist->checkForSong(it->value())); - menu->refresh(); + size_t list_size = pl->size(); + for (size_t i = 0; i < list_size; ++i) + if (auto s = pl->getSong(i)) + pl->setBold(i, myPlaylist->checkForSong(*s)); } std::basic_string Scroller(const std::basic_string &str, size_t &pos, size_t width) diff --git a/src/helpers.h b/src/helpers.h index cc6e7d54..05cf9776 100644 --- a/src/helpers.h +++ b/src/helpers.h @@ -394,7 +394,7 @@ template void ShowTag(T &buf, const std::string &tag) std::string Timestamp(time_t t); -void UpdateSongList(NC::Menu *); +void markSongsInPlaylist(std::shared_ptr pl); std::basic_string Scroller(const std::basic_string &str, size_t &pos, size_t width); diff --git a/src/media_library.cpp b/src/media_library.cpp index 67fcde91..4ca07958 100644 --- a/src/media_library.cpp +++ b/src/media_library.cpp @@ -206,8 +206,8 @@ void MediaLibrary::SwitchTo() Global::myPrevScreen = myScreen; myScreen = this; Global::RedrawHeader = true; + markSongsInPlaylist(songsProxyList()); Refresh(); - UpdateSongList(Songs); } std::basic_string MediaLibrary::Title() @@ -533,9 +533,7 @@ std::shared_ptr MediaLibrary::getProxySongList() { auto ptr = nullProxySongList(); if (w == Songs) - ptr = mkProxySongList(*Songs, [](NC::Menu::Item &item) { - return &item.value(); - }); + ptr = songsProxyList(); return ptr; } @@ -696,6 +694,13 @@ void MediaLibrary::PrevColumn() } } +std::shared_ptr MediaLibrary::songsProxyList() +{ + return mkProxySongList(*Songs, [](NC::Menu::Item &item) { + return &item.value(); + }); +} + void MediaLibrary::LocateSong(const MPD::Song &s) { std::string primary_tag; diff --git a/src/media_library.h b/src/media_library.h index daaf394b..98c25fdf 100644 --- a/src/media_library.h +++ b/src/media_library.h @@ -68,6 +68,8 @@ class MediaLibrary : public Screen, public Filterable, public HasSon void LocateSong(const MPD::Song &); + std::shared_ptr songsProxyList(); + struct SearchConstraints { SearchConstraints() { } diff --git a/src/playlist_editor.cpp b/src/playlist_editor.cpp index 7694c4a6..6b981bda 100644 --- a/src/playlist_editor.cpp +++ b/src/playlist_editor.cpp @@ -133,7 +133,7 @@ void PlaylistEditor::SwitchTo() Global::myPrevScreen = myScreen; myScreen = this; Global::RedrawHeader = true; - UpdateSongList(Content); + markSongsInPlaylist(contentProxyList()); Refresh(); } @@ -285,6 +285,13 @@ bool PlaylistEditor::PrevColumn() return false; } +std::shared_ptr PlaylistEditor::contentProxyList() +{ + return mkProxySongList(*Content, [](NC::Menu::Item &item) { + return &item.value(); + }); +} + void PlaylistEditor::AddToPlaylist(bool add_n_play) { MPD::SongList list; @@ -451,9 +458,7 @@ std::shared_ptr PlaylistEditor::getProxySongList() { auto ptr = nullProxySongList(); if (w == Content) - ptr = mkProxySongList(*Content, [](NC::Menu::Item &item) { - return &item.value(); - }); + ptr = contentProxyList(); return ptr; } diff --git a/src/playlist_editor.h b/src/playlist_editor.h index 05c401a2..36f38138 100644 --- a/src/playlist_editor.h +++ b/src/playlist_editor.h @@ -72,6 +72,8 @@ class PlaylistEditor : public Screen, public Filterable, public HasS bool isPrevColumnAvailable(); bool PrevColumn(); + std::shared_ptr contentProxyList(); + NC::Menu *Playlists; NC::Menu *Content; diff --git a/src/proxy_song_list.h b/src/proxy_song_list.h index 0734ff04..df31917e 100644 --- a/src/proxy_song_list.h +++ b/src/proxy_song_list.h @@ -48,6 +48,9 @@ class ProxySongList virtual bool isSelected(size_t pos) = 0; virtual void setSelected(size_t pos, bool selected) = 0; + virtual bool isBold(size_t pos) = 0; + virtual void setBold(size_t pos, bool bold) = 0; + virtual MPD::Song *getSong(size_t pos) = 0; virtual MPD::Song *currentSong() = 0; }; @@ -67,15 +70,20 @@ class ProxySongList virtual bool isSelected(size_t pos) { return m_menu[pos].isSelected(); } - virtual void setSelected(size_t pos, bool selected) { m_menu[pos].setSelected(selected); } + virtual bool isBold(size_t pos) { + return m_menu[pos].isBold(); + } + virtual void setBold(size_t pos, bool bold) { + m_menu[pos].setBold(bold); + } + virtual MPD::Song *getSong(size_t pos) { return m_song_getter(m_menu[pos]); } - virtual MPD::Song *currentSong() { if (!m_menu.empty()) return getSong(m_menu.choice()); @@ -102,6 +110,9 @@ public: bool isSelected(size_t pos) { return m_impl->isSelected(pos); } void setSelected(size_t pos, bool selected) { 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); } + MPD::Song *getSong(size_t pos) { return m_impl->getSong(pos); } MPD::Song *currentSong() { return m_impl->currentSong(); } }; diff --git a/src/search_engine.cpp b/src/search_engine.cpp index cf4d511b..2b05eac7 100644 --- a/src/search_engine.cpp +++ b/src/search_engine.cpp @@ -150,11 +150,7 @@ void SearchEngine::SwitchTo() myScreen = this; Global::RedrawHeader = true; - if (!w->back().value().isSong()) - { - *w << NC::XY(0, 0) << "Updating list..."; - UpdateFoundList(); - } + markSongsInPlaylist(getProxySongList()); } std::basic_string SearchEngine::Title() @@ -208,7 +204,7 @@ void SearchEngine::EnterPressed() w->insertItem(ResetButton+2, SEItem(), 1, 1); w->at(ResetButton+2).value().mkBuffer() << Config.color1 << "Search results: " << Config.color2 << "Found " << found << (found > 1 ? " songs" : " song") << NC::clDefault; w->insertSeparator(ResetButton+3); - UpdateFoundList(); + markSongsInPlaylist(getProxySongList()); ShowMessage("Searching finished"); if (Config.block_search_constraints_change) for (size_t i = 0; i < StaticOptions-4; ++i) @@ -362,13 +358,6 @@ MPD::SongList SearchEngine::getSelectedSongs() /***********************************************************************/ -void SearchEngine::UpdateFoundList() -{ - for (auto it = w->begin(); it != w->end(); ++it) - if (it->value().isSong()) - it->setBold(myPlaylist->checkForSong(it->value().song())); -} - void SearchEngine::Prepare() { w->setTitle(""); diff --git a/src/search_engine.h b/src/search_engine.h index 33fe0e2c..2d4a65eb 100644 --- a/src/search_engine.h +++ b/src/search_engine.h @@ -106,8 +106,6 @@ class SearchEngine : public Screen< NC::Menu >, public Filterable, publi virtual bool isMergable() { return true; } - void UpdateFoundList(); - static size_t StaticOptions; static size_t SearchButton; static size_t ResetButton; diff --git a/src/status.cpp b/src/status.cpp index 649c1973..97ca04c1 100644 --- a/src/status.cpp +++ b/src/status.cpp @@ -260,13 +260,13 @@ void NcmpcppStatusChanged(MPD::Connection *, MPD::StatusChanges changed, void *) Playlist::ReloadRemaining = true; if (isVisible(myBrowser)) - myBrowser->UpdateItemList(); + markSongsInPlaylist(myBrowser->getProxySongList()); if (isVisible(mySearcher)) - mySearcher->UpdateFoundList(); + markSongsInPlaylist(myLibrary->getProxySongList()); if (isVisible(myLibrary)) - UpdateSongList(myLibrary->Songs); + markSongsInPlaylist(myLibrary->songsProxyList()); if (isVisible(myPlaylistEditor)) - UpdateSongList(myPlaylistEditor->Content); + markSongsInPlaylist(myPlaylistEditor->contentProxyList()); } if (changed.StoredPlaylists) {