diff --git a/src/curses/menu.h b/src/curses/menu.h index b178c049..747acf52 100644 --- a/src/curses/menu.h +++ b/src/curses/menu.h @@ -41,24 +41,16 @@ struct List { enum Type { None = 0, - Bold = (1 << 0), - Selectable = (1 << 1), - Selected = (1 << 2), - Inactive = (1 << 3), - Separator = (1 << 4) + Selectable = (1 << 0), + Selected = (1 << 1), + Inactive = (1 << 2), + Separator = (1 << 3) }; Properties(Type properties = Selectable) : m_properties(properties) { } - void setBold(bool is_bold) - { - if (is_bold) - m_properties |= Bold; - else - m_properties &= ~Bold; - } void setSelectable(bool is_selectable) { if (is_selectable) @@ -90,7 +82,6 @@ struct List m_properties &= ~Separator; } - bool isBold() const { return m_properties & Bold; } bool isSelectable() const { return m_properties & Selectable; } bool isSelected() const { return m_properties & Selected; } bool isInactive() const { return m_properties & Inactive; } @@ -180,13 +171,11 @@ struct Menu: Window, List const Properties &properties() const { return std::get<1>(*m_impl); } // Forward methods to List::Properties. - void setBold (bool is_bold) { properties().setBold(is_bold); } void setSelectable(bool is_selectable) { properties().setSelectable(is_selectable); } void setSelected (bool is_selected) { properties().setSelected(is_selected); } void setInactive (bool is_inactive) { properties().setInactive(is_inactive); } void setSeparator (bool is_separator) { properties().setSeparator(is_separator); } - bool isBold() const { return properties().isBold(); } bool isSelectable() const { return properties().isSelectable(); } bool isSelected() const { return properties().isSelected(); } bool isInactive() const { return properties().isInactive(); } diff --git a/src/curses/menu_impl.h b/src/curses/menu_impl.h index 9e2cbc46..ee5c6288 100644 --- a/src/curses/menu_impl.h +++ b/src/curses/menu_impl.h @@ -210,8 +210,6 @@ void Menu::refresh() mvwhline(m_window, line, 0, 0, m_width); continue; } - if ((*m_items)[m_drawn_position].isBold()) - *this << Format::Bold; if (m_highlight_enabled && m_drawn_position == m_highlight) { *this << Format::Reverse; @@ -229,8 +227,6 @@ void Menu::refresh() *this << Color::End; *this << Format::NoReverse; } - if ((*m_items)[m_drawn_position].isBold()) - *this << Format::NoBold; } Window::refresh(); } diff --git a/src/display.cpp b/src/display.cpp index 4f91290f..1d789a72 100644 --- a/src/display.cpp +++ b/src/display.cpp @@ -78,7 +78,8 @@ const wchar_t *toColumnName(char c) template void setProperties(NC::Menu &menu, const MPD::Song &s, const SongList &list, - bool &separate_albums, bool &is_now_playing, bool &is_selected, bool &discard_colors) + bool &separate_albums, bool &is_now_playing, bool &is_selected, + bool &is_in_playlist, bool &discard_colors) { size_t drawn_pos = menu.drawn() - menu.begin(); separate_albums = false; @@ -97,22 +98,42 @@ void setProperties(NC::Menu &menu, const MPD::Song &s, const SongList &list, mvwhline(menu.raw(), menu.getY(), 0, NC::Key::Space, menu.getWidth()); } - is_selected = menu.drawn()->isSelected(); - discard_colors = Config.discard_colors_if_item_is_selected && is_selected; - int song_pos = s.getPosition(); is_now_playing = Status::State::player() != MPD::psStop && myPlaylist->isActiveWindow(menu) && song_pos == Status::State::currentSongPosition(); if (is_now_playing) menu << Config.now_playing_prefix; + + is_in_playlist = !myPlaylist->isActiveWindow(menu) + && myPlaylist->checkForSong(s); + if (is_in_playlist) + menu << NC::Format::Bold; + + is_selected = menu.drawn()->isSelected(); + discard_colors = Config.discard_colors_if_item_is_selected && is_selected; +} + +template +void unsetProperties(NC::Menu &menu, bool separate_albums, bool is_now_playing, + bool is_in_playlist) +{ + if (is_in_playlist) + menu << NC::Format::NoBold; + + if (is_now_playing) + menu << Config.now_playing_suffix; + + if (separate_albums) + menu << NC::Format::NoUnderline; } template void showSongs(NC::Menu &menu, const MPD::Song &s, const SongList &list, const Format::AST &ast) { - bool separate_albums, is_now_playing, is_selected, discard_colors; - setProperties(menu, s, list, separate_albums, is_now_playing, is_selected, discard_colors); + bool separate_albums, is_now_playing, is_selected, is_in_playlist, discard_colors; + setProperties(menu, s, list, separate_albums, is_now_playing, is_selected, + is_in_playlist, discard_colors); const size_t y = menu.getY(); NC::Buffer right_aligned; @@ -129,10 +150,7 @@ void showSongs(NC::Menu &menu, const MPD::Song &s, const SongList &list, cons menu << NC::TermManip::ClearToEOL << NC::XY(x_off, y) << right_aligned; } - if (is_now_playing) - menu << Config.now_playing_suffix; - if (separate_albums) - menu << NC::Format::NoUnderline; + unsetProperties(menu, separate_albums, is_now_playing, is_in_playlist); } template @@ -141,8 +159,9 @@ void showSongsInColumns(NC::Menu &menu, const MPD::Song &s, const SongList &l if (Config.columns.empty()) return; - bool separate_albums, is_now_playing, is_selected, discard_colors; - setProperties(menu, s, list, separate_albums, is_now_playing, is_selected, discard_colors); + bool separate_albums, is_now_playing, is_selected, is_in_playlist, discard_colors; + setProperties(menu, s, list, separate_albums, is_now_playing, is_selected, + is_in_playlist, discard_colors); int menu_width = menu.getWidth(); if (is_now_playing) @@ -220,10 +239,7 @@ void showSongsInColumns(NC::Menu &menu, const MPD::Song &s, const SongList &l menu << NC::Color::End; } - if (is_now_playing) - menu << Config.now_playing_suffix; - if (separate_albums) - menu << NC::Format::NoUnderline; + unsetProperties(menu, separate_albums, is_now_playing, is_in_playlist); } } diff --git a/src/helpers.h b/src/helpers.h index 12618880..8072b99b 100644 --- a/src/helpers.h +++ b/src/helpers.h @@ -398,17 +398,6 @@ std::string getSharedDirectory(Iterator first, Iterator last) return result; } -template -void markSongsInPlaylist(ListT &list) -{ - ScopedUnfilteredMenu sunfilter(ReapplyFilter::No, list); - for (auto &p : static_cast(list)) - { - if (p.song() != nullptr) - p.properties().setBold(myPlaylist->checkForSong(*p.song())); - } -} - template bool addSongsToPlaylist(Iterator first, Iterator last, bool play, int position) { diff --git a/src/screens/browser.cpp b/src/screens/browser.cpp index 1b790d80..e2176c76 100644 --- a/src/screens/browser.cpp +++ b/src/screens/browser.cpp @@ -165,7 +165,6 @@ void Browser::resize() void Browser::switchTo() { SwitchTo::execute(this); - markSongsInPlaylist(w); drawHeader(); } @@ -527,10 +526,7 @@ void Browser::getDirectory(std::string directory) } case MPD::Item::Type::Song: { - auto properties = NC::List::Properties::Selectable; - if (myPlaylist->checkForSong(item.song())) - properties |= NC::List::Properties::Bold; - w.addItem(std::move(item), properties); + w.addItem(std::move(item)); break; } } diff --git a/src/screens/media_library.cpp b/src/screens/media_library.cpp index 115d88ee..5510c7cb 100644 --- a/src/screens/media_library.cpp +++ b/src/screens/media_library.cpp @@ -265,7 +265,6 @@ void MediaLibrary::refresh() void MediaLibrary::switchTo() { SwitchTo::execute(this); - markSongsInPlaylist(Songs); drawHeader(); refresh(); } @@ -433,19 +432,10 @@ void MediaLibrary::update() size_t idx = 0; for (MPD::SongIterator s = Mpd.CommitSearchSongs(), end; s != end; ++s, ++idx) { - bool in_playlist = myPlaylist->checkForSong(*s); if (idx < Songs.size()) - { Songs[idx].value() = std::move(*s); - Songs[idx].setBold(in_playlist); - } else - { - auto properties = NC::List::Properties::Selectable; - if (in_playlist) - properties |= NC::List::Properties::Bold; - Songs.addItem(std::move(*s), properties); - } + Songs.addItem(std::move(*s)); }; if (idx < Songs.size()) Songs.resizeList(idx); diff --git a/src/screens/outputs.cpp b/src/screens/outputs.cpp index a1e49dbe..44d5a10c 100644 --- a/src/screens/outputs.cpp +++ b/src/screens/outputs.cpp @@ -45,7 +45,12 @@ Outputs::Outputs() w.centeredCursor(Config.centered_cursor); w.setHighlightColor(Config.main_highlight_color); w.setItemDisplayer([](NC::Menu &menu) { - menu << Charset::utf8ToLocale(menu.drawn()->value().name()); + auto &output = menu.drawn()->value(); + if (output.enabled()) + menu << NC::Format::Bold; + menu << Charset::utf8ToLocale(output.name()); + if (output.enabled()) + menu << NC::Format::NoBold; }); } @@ -87,14 +92,7 @@ void Outputs::fetchList() { w.clear(); for (MPD::OutputIterator out = Mpd.GetOutputs(), end; out != end; ++out) - { - auto properties = NC::List::Properties::Selectable; - if (out->enabled()) - properties |= NC::List::Properties::Bold; - w.addItem(std::move(*out), properties); - } - if (myScreen == this) - w.refresh(); + w.addItem(std::move(*out)); } void Outputs::toggleOutput() diff --git a/src/screens/playlist_editor.cpp b/src/screens/playlist_editor.cpp index d8a668c6..8f00e165 100644 --- a/src/screens/playlist_editor.cpp +++ b/src/screens/playlist_editor.cpp @@ -136,7 +136,6 @@ void PlaylistEditor::refresh() void PlaylistEditor::switchTo() { SwitchTo::execute(this); - markSongsInPlaylist(Content); drawHeader(); refresh(); } @@ -186,19 +185,10 @@ void PlaylistEditor::update() MPD::SongIterator s = Mpd.GetPlaylistContent(Playlists.current()->value().path()), end; for (; s != end; ++s, ++idx) { - bool in_playlist = myPlaylist->checkForSong(*s); if (idx < Content.size()) - { - Content[idx].setBold(in_playlist); Content[idx].value() = std::move(*s); - } else - { - auto properties = NC::List::Properties::Selectable; - if (in_playlist) - properties |= NC::List::Properties::Bold; - Content.addItem(std::move(*s), properties); - } + Content.addItem(std::move(*s)); } if (idx < Content.size()) Content.resizeList(idx); diff --git a/src/screens/search_engine.cpp b/src/screens/search_engine.cpp index 38eea923..592ef8a3 100644 --- a/src/screens/search_engine.cpp +++ b/src/screens/search_engine.cpp @@ -208,7 +208,6 @@ void SearchEngine::switchTo() SwitchTo::execute(this); if (w.empty()) Prepare(); - markSongsInPlaylist(w); drawHeader(); } @@ -346,17 +345,18 @@ void SearchEngine::runAction() size_t found = w.size()-SearchEngine::StaticOptions; found += 3; // don't count options inserted below w.insertSeparator(ResetButton+1); - w.insertItem(ResetButton+2, SEItem(), NC::List::Properties::Bold | NC::List::Properties::Inactive); + w.insertItem(ResetButton+2, SEItem(), NC::List::Properties::Inactive); w.at(ResetButton+2).value().mkBuffer() + << NC::Format::Bold << Config.color1 << "Search results: " << NC::FormattedColor::End(Config.color1) << Config.color2 << "Found " << found << (found > 1 ? " songs" : " song") - << NC::FormattedColor::End(Config.color2); + << NC::FormattedColor::End(Config.color2) + << NC::Format::NoBold; w.insertSeparator(ResetButton+3); - markSongsInPlaylist(w); - Statusbar::print("Searching finished"); + Statusbar::print("Searching finished"); if (Config.block_search_constraints_change) for (size_t i = 0; i < StaticOptions-4; ++i) w.at(i).setInactive(true); diff --git a/src/screens/tag_editor.cpp b/src/screens/tag_editor.cpp index 79da46d7..f0eddcdf 100644 --- a/src/screens/tag_editor.cpp +++ b/src/screens/tag_editor.cpp @@ -154,7 +154,7 @@ TagEditor::TagEditor() : FParser(0), FParserHelper(0), FParserLegend(0), FParser TagTypes->addSeparator(); if (Config.titles_visibility) { - TagTypes->addItem("Options", NC::List::Properties::Bold | NC::List::Properties::Inactive); + TagTypes->addItem("Options", NC::List::Properties::Inactive); TagTypes->addSeparator(); } TagTypes->addItem("Capitalize First Letters"); @@ -571,7 +571,7 @@ void TagEditor::runAction() if (!Patterns.empty()) { FParser->addSeparator(); - FParser->addItem("Recent patterns", NC::List::Properties::Bold | NC::List::Properties::Inactive); + FParser->addItem("Recent patterns", NC::List::Properties::Inactive); FParser->addSeparator(); for (std::list::const_iterator it = Patterns.begin(); it != Patterns.end(); ++it) FParser->addItem(*it); diff --git a/src/status.cpp b/src/status.cpp index eec511e2..761497dc 100644 --- a/src/status.cpp +++ b/src/status.cpp @@ -439,21 +439,6 @@ void Status::Changes::playlist(unsigned previous_version) myPlaylist->reloadTotalLength(); myPlaylist->reloadRemaining(); - - if (isVisible(myBrowser)) - markSongsInPlaylist(myBrowser->main()); - if (isVisible(mySearcher)) - markSongsInPlaylist(mySearcher->main()); - if (isVisible(myLibrary)) - { - markSongsInPlaylist(myLibrary->Songs); - myLibrary->Songs.refresh(); - } - if (isVisible(myPlaylistEditor)) - { - markSongsInPlaylist(myPlaylistEditor->Content); - myPlaylistEditor->Content.refresh(); - } } void Status::Changes::storedPlaylists() @@ -815,5 +800,7 @@ void Status::Changes::outputs() { # ifdef ENABLE_OUTPUTS myOutputs->fetchList(); + if (isVisible(myOutputs)) + myOutputs->refreshWindow(); # endif // ENABLE_OUTPUTS }