Check if songs are in playlist when displaying them, not up-front

This commit is contained in:
Andrzej Rybczak
2017-01-06 13:58:22 +01:00
parent e191959976
commit 7d502e42ba
11 changed files with 55 additions and 104 deletions

View File

@@ -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(); }

View File

@@ -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();
}

View File

@@ -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);
}
}

View File

@@ -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)
{

View File

@@ -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;
}
}

View File

@@ -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);

View File

@@ -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()

View File

@@ -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);

View File

@@ -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);

View File

@@ -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);

View File

@@ -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
}