Check if songs are in playlist when displaying them, not up-front
This commit is contained in:
@@ -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(); }
|
||||
|
||||
@@ -210,8 +210,6 @@ void Menu<ItemT>::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<ItemT>::refresh()
|
||||
*this << Color::End;
|
||||
*this << Format::NoReverse;
|
||||
}
|
||||
if ((*m_items)[m_drawn_position].isBold())
|
||||
*this << Format::NoBold;
|
||||
}
|
||||
Window::refresh();
|
||||
}
|
||||
|
||||
@@ -78,7 +78,8 @@ const wchar_t *toColumnName(char c)
|
||||
|
||||
template <typename T>
|
||||
void setProperties(NC::Menu<T> &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<T> &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 <typename T>
|
||||
void unsetProperties(NC::Menu<T> &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 <typename T>
|
||||
void showSongs(NC::Menu<T> &menu, const MPD::Song &s, const SongList &list, const Format::AST<char> &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<T> &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 <typename T>
|
||||
@@ -141,8 +159,9 @@ void showSongsInColumns(NC::Menu<T> &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<T> &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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -398,17 +398,6 @@ std::string getSharedDirectory(Iterator first, Iterator last)
|
||||
return result;
|
||||
}
|
||||
|
||||
template <typename ListT>
|
||||
void markSongsInPlaylist(ListT &list)
|
||||
{
|
||||
ScopedUnfilteredMenu<typename ListT::Item::Type> sunfilter(ReapplyFilter::No, list);
|
||||
for (auto &p : static_cast<SongList &>(list))
|
||||
{
|
||||
if (p.song() != nullptr)
|
||||
p.properties().setBold(myPlaylist->checkForSong(*p.song()));
|
||||
}
|
||||
}
|
||||
|
||||
template <typename Iterator>
|
||||
bool addSongsToPlaylist(Iterator first, Iterator last, bool play, int position)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -45,7 +45,12 @@ Outputs::Outputs()
|
||||
w.centeredCursor(Config.centered_cursor);
|
||||
w.setHighlightColor(Config.main_highlight_color);
|
||||
w.setItemDisplayer([](NC::Menu<MPD::Output> &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()
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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<std::string>::const_iterator it = Patterns.begin(); it != Patterns.end(); ++it)
|
||||
FParser->addItem(*it);
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user