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 {
|
enum Type {
|
||||||
None = 0,
|
None = 0,
|
||||||
Bold = (1 << 0),
|
Selectable = (1 << 0),
|
||||||
Selectable = (1 << 1),
|
Selected = (1 << 1),
|
||||||
Selected = (1 << 2),
|
Inactive = (1 << 2),
|
||||||
Inactive = (1 << 3),
|
Separator = (1 << 3)
|
||||||
Separator = (1 << 4)
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Properties(Type properties = Selectable)
|
Properties(Type properties = Selectable)
|
||||||
: m_properties(properties)
|
: m_properties(properties)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
void setBold(bool is_bold)
|
|
||||||
{
|
|
||||||
if (is_bold)
|
|
||||||
m_properties |= Bold;
|
|
||||||
else
|
|
||||||
m_properties &= ~Bold;
|
|
||||||
}
|
|
||||||
void setSelectable(bool is_selectable)
|
void setSelectable(bool is_selectable)
|
||||||
{
|
{
|
||||||
if (is_selectable)
|
if (is_selectable)
|
||||||
@@ -90,7 +82,6 @@ struct List
|
|||||||
m_properties &= ~Separator;
|
m_properties &= ~Separator;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isBold() const { return m_properties & Bold; }
|
|
||||||
bool isSelectable() const { return m_properties & Selectable; }
|
bool isSelectable() const { return m_properties & Selectable; }
|
||||||
bool isSelected() const { return m_properties & Selected; }
|
bool isSelected() const { return m_properties & Selected; }
|
||||||
bool isInactive() const { return m_properties & Inactive; }
|
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); }
|
const Properties &properties() const { return std::get<1>(*m_impl); }
|
||||||
|
|
||||||
// Forward methods to List::Properties.
|
// Forward methods to List::Properties.
|
||||||
void setBold (bool is_bold) { properties().setBold(is_bold); }
|
|
||||||
void setSelectable(bool is_selectable) { properties().setSelectable(is_selectable); }
|
void setSelectable(bool is_selectable) { properties().setSelectable(is_selectable); }
|
||||||
void setSelected (bool is_selected) { properties().setSelected(is_selected); }
|
void setSelected (bool is_selected) { properties().setSelected(is_selected); }
|
||||||
void setInactive (bool is_inactive) { properties().setInactive(is_inactive); }
|
void setInactive (bool is_inactive) { properties().setInactive(is_inactive); }
|
||||||
void setSeparator (bool is_separator) { properties().setSeparator(is_separator); }
|
void setSeparator (bool is_separator) { properties().setSeparator(is_separator); }
|
||||||
|
|
||||||
bool isBold() const { return properties().isBold(); }
|
|
||||||
bool isSelectable() const { return properties().isSelectable(); }
|
bool isSelectable() const { return properties().isSelectable(); }
|
||||||
bool isSelected() const { return properties().isSelected(); }
|
bool isSelected() const { return properties().isSelected(); }
|
||||||
bool isInactive() const { return properties().isInactive(); }
|
bool isInactive() const { return properties().isInactive(); }
|
||||||
|
|||||||
@@ -210,8 +210,6 @@ void Menu<ItemT>::refresh()
|
|||||||
mvwhline(m_window, line, 0, 0, m_width);
|
mvwhline(m_window, line, 0, 0, m_width);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if ((*m_items)[m_drawn_position].isBold())
|
|
||||||
*this << Format::Bold;
|
|
||||||
if (m_highlight_enabled && m_drawn_position == m_highlight)
|
if (m_highlight_enabled && m_drawn_position == m_highlight)
|
||||||
{
|
{
|
||||||
*this << Format::Reverse;
|
*this << Format::Reverse;
|
||||||
@@ -229,8 +227,6 @@ void Menu<ItemT>::refresh()
|
|||||||
*this << Color::End;
|
*this << Color::End;
|
||||||
*this << Format::NoReverse;
|
*this << Format::NoReverse;
|
||||||
}
|
}
|
||||||
if ((*m_items)[m_drawn_position].isBold())
|
|
||||||
*this << Format::NoBold;
|
|
||||||
}
|
}
|
||||||
Window::refresh();
|
Window::refresh();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -78,7 +78,8 @@ const wchar_t *toColumnName(char c)
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
void setProperties(NC::Menu<T> &menu, const MPD::Song &s, const SongList &list,
|
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();
|
size_t drawn_pos = menu.drawn() - menu.begin();
|
||||||
separate_albums = false;
|
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());
|
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();
|
int song_pos = s.getPosition();
|
||||||
is_now_playing = Status::State::player() != MPD::psStop
|
is_now_playing = Status::State::player() != MPD::psStop
|
||||||
&& myPlaylist->isActiveWindow(menu)
|
&& myPlaylist->isActiveWindow(menu)
|
||||||
&& song_pos == Status::State::currentSongPosition();
|
&& song_pos == Status::State::currentSongPosition();
|
||||||
if (is_now_playing)
|
if (is_now_playing)
|
||||||
menu << Config.now_playing_prefix;
|
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>
|
template <typename T>
|
||||||
void showSongs(NC::Menu<T> &menu, const MPD::Song &s, const SongList &list, const Format::AST<char> &ast)
|
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;
|
bool separate_albums, is_now_playing, is_selected, is_in_playlist, discard_colors;
|
||||||
setProperties(menu, s, list, separate_albums, is_now_playing, is_selected, discard_colors);
|
setProperties(menu, s, list, separate_albums, is_now_playing, is_selected,
|
||||||
|
is_in_playlist, discard_colors);
|
||||||
|
|
||||||
const size_t y = menu.getY();
|
const size_t y = menu.getY();
|
||||||
NC::Buffer right_aligned;
|
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;
|
menu << NC::TermManip::ClearToEOL << NC::XY(x_off, y) << right_aligned;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_now_playing)
|
unsetProperties(menu, separate_albums, is_now_playing, is_in_playlist);
|
||||||
menu << Config.now_playing_suffix;
|
|
||||||
if (separate_albums)
|
|
||||||
menu << NC::Format::NoUnderline;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
@@ -141,8 +159,9 @@ void showSongsInColumns(NC::Menu<T> &menu, const MPD::Song &s, const SongList &l
|
|||||||
if (Config.columns.empty())
|
if (Config.columns.empty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
bool 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, discard_colors);
|
setProperties(menu, s, list, separate_albums, is_now_playing, is_selected,
|
||||||
|
is_in_playlist, discard_colors);
|
||||||
|
|
||||||
int menu_width = menu.getWidth();
|
int menu_width = menu.getWidth();
|
||||||
if (is_now_playing)
|
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;
|
menu << NC::Color::End;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_now_playing)
|
unsetProperties(menu, separate_albums, is_now_playing, is_in_playlist);
|
||||||
menu << Config.now_playing_suffix;
|
|
||||||
if (separate_albums)
|
|
||||||
menu << NC::Format::NoUnderline;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -398,17 +398,6 @@ std::string getSharedDirectory(Iterator first, Iterator last)
|
|||||||
return result;
|
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>
|
template <typename Iterator>
|
||||||
bool addSongsToPlaylist(Iterator first, Iterator last, bool play, int position)
|
bool addSongsToPlaylist(Iterator first, Iterator last, bool play, int position)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -165,7 +165,6 @@ void Browser::resize()
|
|||||||
void Browser::switchTo()
|
void Browser::switchTo()
|
||||||
{
|
{
|
||||||
SwitchTo::execute(this);
|
SwitchTo::execute(this);
|
||||||
markSongsInPlaylist(w);
|
|
||||||
drawHeader();
|
drawHeader();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -527,10 +526,7 @@ void Browser::getDirectory(std::string directory)
|
|||||||
}
|
}
|
||||||
case MPD::Item::Type::Song:
|
case MPD::Item::Type::Song:
|
||||||
{
|
{
|
||||||
auto properties = NC::List::Properties::Selectable;
|
w.addItem(std::move(item));
|
||||||
if (myPlaylist->checkForSong(item.song()))
|
|
||||||
properties |= NC::List::Properties::Bold;
|
|
||||||
w.addItem(std::move(item), properties);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -265,7 +265,6 @@ void MediaLibrary::refresh()
|
|||||||
void MediaLibrary::switchTo()
|
void MediaLibrary::switchTo()
|
||||||
{
|
{
|
||||||
SwitchTo::execute(this);
|
SwitchTo::execute(this);
|
||||||
markSongsInPlaylist(Songs);
|
|
||||||
drawHeader();
|
drawHeader();
|
||||||
refresh();
|
refresh();
|
||||||
}
|
}
|
||||||
@@ -433,19 +432,10 @@ void MediaLibrary::update()
|
|||||||
size_t idx = 0;
|
size_t idx = 0;
|
||||||
for (MPD::SongIterator s = Mpd.CommitSearchSongs(), end; s != end; ++s, ++idx)
|
for (MPD::SongIterator s = Mpd.CommitSearchSongs(), end; s != end; ++s, ++idx)
|
||||||
{
|
{
|
||||||
bool in_playlist = myPlaylist->checkForSong(*s);
|
|
||||||
if (idx < Songs.size())
|
if (idx < Songs.size())
|
||||||
{
|
|
||||||
Songs[idx].value() = std::move(*s);
|
Songs[idx].value() = std::move(*s);
|
||||||
Songs[idx].setBold(in_playlist);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
Songs.addItem(std::move(*s));
|
||||||
auto properties = NC::List::Properties::Selectable;
|
|
||||||
if (in_playlist)
|
|
||||||
properties |= NC::List::Properties::Bold;
|
|
||||||
Songs.addItem(std::move(*s), properties);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
if (idx < Songs.size())
|
if (idx < Songs.size())
|
||||||
Songs.resizeList(idx);
|
Songs.resizeList(idx);
|
||||||
|
|||||||
@@ -45,7 +45,12 @@ Outputs::Outputs()
|
|||||||
w.centeredCursor(Config.centered_cursor);
|
w.centeredCursor(Config.centered_cursor);
|
||||||
w.setHighlightColor(Config.main_highlight_color);
|
w.setHighlightColor(Config.main_highlight_color);
|
||||||
w.setItemDisplayer([](NC::Menu<MPD::Output> &menu) {
|
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();
|
w.clear();
|
||||||
for (MPD::OutputIterator out = Mpd.GetOutputs(), end; out != end; ++out)
|
for (MPD::OutputIterator out = Mpd.GetOutputs(), end; out != end; ++out)
|
||||||
{
|
w.addItem(std::move(*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();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Outputs::toggleOutput()
|
void Outputs::toggleOutput()
|
||||||
|
|||||||
@@ -136,7 +136,6 @@ void PlaylistEditor::refresh()
|
|||||||
void PlaylistEditor::switchTo()
|
void PlaylistEditor::switchTo()
|
||||||
{
|
{
|
||||||
SwitchTo::execute(this);
|
SwitchTo::execute(this);
|
||||||
markSongsInPlaylist(Content);
|
|
||||||
drawHeader();
|
drawHeader();
|
||||||
refresh();
|
refresh();
|
||||||
}
|
}
|
||||||
@@ -186,19 +185,10 @@ void PlaylistEditor::update()
|
|||||||
MPD::SongIterator s = Mpd.GetPlaylistContent(Playlists.current()->value().path()), end;
|
MPD::SongIterator s = Mpd.GetPlaylistContent(Playlists.current()->value().path()), end;
|
||||||
for (; s != end; ++s, ++idx)
|
for (; s != end; ++s, ++idx)
|
||||||
{
|
{
|
||||||
bool in_playlist = myPlaylist->checkForSong(*s);
|
|
||||||
if (idx < Content.size())
|
if (idx < Content.size())
|
||||||
{
|
|
||||||
Content[idx].setBold(in_playlist);
|
|
||||||
Content[idx].value() = std::move(*s);
|
Content[idx].value() = std::move(*s);
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
Content.addItem(std::move(*s));
|
||||||
auto properties = NC::List::Properties::Selectable;
|
|
||||||
if (in_playlist)
|
|
||||||
properties |= NC::List::Properties::Bold;
|
|
||||||
Content.addItem(std::move(*s), properties);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (idx < Content.size())
|
if (idx < Content.size())
|
||||||
Content.resizeList(idx);
|
Content.resizeList(idx);
|
||||||
|
|||||||
@@ -208,7 +208,6 @@ void SearchEngine::switchTo()
|
|||||||
SwitchTo::execute(this);
|
SwitchTo::execute(this);
|
||||||
if (w.empty())
|
if (w.empty())
|
||||||
Prepare();
|
Prepare();
|
||||||
markSongsInPlaylist(w);
|
|
||||||
drawHeader();
|
drawHeader();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -346,17 +345,18 @@ void SearchEngine::runAction()
|
|||||||
size_t found = w.size()-SearchEngine::StaticOptions;
|
size_t found = w.size()-SearchEngine::StaticOptions;
|
||||||
found += 3; // don't count options inserted below
|
found += 3; // don't count options inserted below
|
||||||
w.insertSeparator(ResetButton+1);
|
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()
|
w.at(ResetButton+2).value().mkBuffer()
|
||||||
|
<< NC::Format::Bold
|
||||||
<< Config.color1
|
<< Config.color1
|
||||||
<< "Search results: "
|
<< "Search results: "
|
||||||
<< NC::FormattedColor::End(Config.color1)
|
<< NC::FormattedColor::End(Config.color1)
|
||||||
<< Config.color2
|
<< Config.color2
|
||||||
<< "Found " << found << (found > 1 ? " songs" : " song")
|
<< "Found " << found << (found > 1 ? " songs" : " song")
|
||||||
<< NC::FormattedColor::End(Config.color2);
|
<< NC::FormattedColor::End(Config.color2)
|
||||||
|
<< NC::Format::NoBold;
|
||||||
w.insertSeparator(ResetButton+3);
|
w.insertSeparator(ResetButton+3);
|
||||||
markSongsInPlaylist(w);
|
Statusbar::print("Searching finished");
|
||||||
Statusbar::print("Searching finished");
|
|
||||||
if (Config.block_search_constraints_change)
|
if (Config.block_search_constraints_change)
|
||||||
for (size_t i = 0; i < StaticOptions-4; ++i)
|
for (size_t i = 0; i < StaticOptions-4; ++i)
|
||||||
w.at(i).setInactive(true);
|
w.at(i).setInactive(true);
|
||||||
|
|||||||
@@ -154,7 +154,7 @@ TagEditor::TagEditor() : FParser(0), FParserHelper(0), FParserLegend(0), FParser
|
|||||||
TagTypes->addSeparator();
|
TagTypes->addSeparator();
|
||||||
if (Config.titles_visibility)
|
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->addSeparator();
|
||||||
}
|
}
|
||||||
TagTypes->addItem("Capitalize First Letters");
|
TagTypes->addItem("Capitalize First Letters");
|
||||||
@@ -571,7 +571,7 @@ void TagEditor::runAction()
|
|||||||
if (!Patterns.empty())
|
if (!Patterns.empty())
|
||||||
{
|
{
|
||||||
FParser->addSeparator();
|
FParser->addSeparator();
|
||||||
FParser->addItem("Recent patterns", NC::List::Properties::Bold | NC::List::Properties::Inactive);
|
FParser->addItem("Recent patterns", NC::List::Properties::Inactive);
|
||||||
FParser->addSeparator();
|
FParser->addSeparator();
|
||||||
for (std::list<std::string>::const_iterator it = Patterns.begin(); it != Patterns.end(); ++it)
|
for (std::list<std::string>::const_iterator it = Patterns.begin(); it != Patterns.end(); ++it)
|
||||||
FParser->addItem(*it);
|
FParser->addItem(*it);
|
||||||
|
|||||||
@@ -439,21 +439,6 @@ void Status::Changes::playlist(unsigned previous_version)
|
|||||||
|
|
||||||
myPlaylist->reloadTotalLength();
|
myPlaylist->reloadTotalLength();
|
||||||
myPlaylist->reloadRemaining();
|
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()
|
void Status::Changes::storedPlaylists()
|
||||||
@@ -815,5 +800,7 @@ void Status::Changes::outputs()
|
|||||||
{
|
{
|
||||||
# ifdef ENABLE_OUTPUTS
|
# ifdef ENABLE_OUTPUTS
|
||||||
myOutputs->fetchList();
|
myOutputs->fetchList();
|
||||||
|
if (isVisible(myOutputs))
|
||||||
|
myOutputs->refreshWindow();
|
||||||
# endif // ENABLE_OUTPUTS
|
# endif // ENABLE_OUTPUTS
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user