fix assertion failures in media library / playlist editor with separators enabled
This commit is contained in:
@@ -1119,7 +1119,7 @@ void ToggleDisplayMode::Run()
|
||||
|
||||
if (Config.columns_in_playlist)
|
||||
{
|
||||
myPlaylist->main().setItemDisplayer(std::bind(Display::SongsInColumns, _1, myPlaylist));
|
||||
myPlaylist->main().setItemDisplayer(std::bind(Display::SongsInColumns, _1, myPlaylist->proxySongList()));
|
||||
if (Config.titles_visibility)
|
||||
myPlaylist->main().setTitle(Display::Columns(myPlaylist->main().getWidth()));
|
||||
else
|
||||
@@ -1127,7 +1127,7 @@ void ToggleDisplayMode::Run()
|
||||
}
|
||||
else
|
||||
{
|
||||
myPlaylist->main().setItemDisplayer(std::bind(Display::Songs, _1, myPlaylist, Config.song_list_format));
|
||||
myPlaylist->main().setItemDisplayer(std::bind(Display::Songs, _1, myPlaylist->proxySongList(), Config.song_list_format));
|
||||
myPlaylist->main().setTitle("");
|
||||
}
|
||||
}
|
||||
@@ -1149,9 +1149,9 @@ void ToggleDisplayMode::Run()
|
||||
Config.columns_in_playlist_editor = !Config.columns_in_playlist_editor;
|
||||
Statusbar::msg("Playlist editor display mode: %s", Config.columns_in_playlist_editor ? "Columns" : "Classic");
|
||||
if (Config.columns_in_playlist_editor)
|
||||
myPlaylistEditor->Content.setItemDisplayer(std::bind(Display::SongsInColumns, _1, myPlaylistEditor));
|
||||
myPlaylistEditor->Content.setItemDisplayer(std::bind(Display::SongsInColumns, _1, myPlaylistEditor->contentProxyList()));
|
||||
else
|
||||
myPlaylistEditor->Content.setItemDisplayer(std::bind(Display::Songs, _1, myPlaylistEditor, Config.song_list_format));
|
||||
myPlaylistEditor->Content.setItemDisplayer(std::bind(Display::Songs, _1, myPlaylistEditor->contentProxyList(), Config.song_list_format));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -70,7 +70,7 @@ Browser::Browser() : itsBrowseLocally(0), itsScrollBeginning(0), itsBrowsedDir("
|
||||
w.centeredCursor(Config.centered_cursor);
|
||||
w.setSelectedPrefix(Config.selected_item_prefix);
|
||||
w.setSelectedSuffix(Config.selected_item_suffix);
|
||||
w.setItemDisplayer(Display::Items);
|
||||
w.setItemDisplayer(std::bind(Display::Items, _1, proxySongList()));
|
||||
|
||||
if (SupportedExtensions.empty())
|
||||
Mpd.GetSupportedExtensions(SupportedExtensions);
|
||||
|
||||
@@ -73,16 +73,15 @@ const wchar_t *toColumnName(char c)
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
void setProperties(NC::Menu<T> &menu, const MPD::Song &s, HasSongs &screen, bool &separate_albums,
|
||||
void setProperties(NC::Menu<T> &menu, const MPD::Song &s, const ProxySongList &pl, bool &separate_albums,
|
||||
bool &is_now_playing, bool &is_selected, bool &discard_colors)
|
||||
{
|
||||
size_t drawn_pos = menu.drawn() - menu.begin();
|
||||
separate_albums = false;
|
||||
if (Config.playlist_separate_albums)
|
||||
{
|
||||
auto pl = screen.proxySongList();
|
||||
assert(pl);
|
||||
auto next = pl.getSong(drawn_pos+1);
|
||||
size_t next_pos = drawn_pos+1;
|
||||
auto next = next_pos < pl.size() ? pl.getSong(next_pos) : 0;
|
||||
if (next && next->getAlbum() != s.getAlbum())
|
||||
separate_albums = true;
|
||||
}
|
||||
@@ -103,10 +102,10 @@ void setProperties(NC::Menu<T> &menu, const MPD::Song &s, HasSongs &screen, bool
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
void showSongs(NC::Menu<T> &menu, const MPD::Song &s, HasSongs &screen, const std::string &format)
|
||||
void showSongs(NC::Menu<T> &menu, const MPD::Song &s, const ProxySongList &pl, const std::string &format)
|
||||
{
|
||||
bool separate_albums, is_now_playing, is_selected, discard_colors;
|
||||
setProperties(menu, s, screen, separate_albums, is_now_playing, is_selected, discard_colors);
|
||||
setProperties(menu, s, pl, separate_albums, is_now_playing, is_selected, discard_colors);
|
||||
|
||||
size_t y = menu.getY();
|
||||
std::string line = s.toString(format, Config.tags_separator, "$");
|
||||
@@ -161,13 +160,13 @@ void showSongs(NC::Menu<T> &menu, const MPD::Song &s, HasSongs &screen, const st
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
void showSongsInColumns(NC::Menu<T> &menu, const MPD::Song &s, HasSongs &screen)
|
||||
void showSongsInColumns(NC::Menu<T> &menu, const MPD::Song &s, const ProxySongList &pl)
|
||||
{
|
||||
if (Config.columns.empty())
|
||||
return;
|
||||
|
||||
bool separate_albums, is_now_playing, is_selected, discard_colors;
|
||||
setProperties(menu, s, screen, separate_albums, is_now_playing, is_selected, discard_colors);
|
||||
setProperties(menu, s, pl, separate_albums, is_now_playing, is_selected, discard_colors);
|
||||
|
||||
int width;
|
||||
int y = menu.getY();
|
||||
@@ -346,14 +345,14 @@ std::string Display::Columns(size_t list_width)
|
||||
return result;
|
||||
}
|
||||
|
||||
void Display::SongsInColumns(NC::Menu<MPD::Song> &menu, HasSongs *screen)
|
||||
void Display::SongsInColumns(NC::Menu< MPD::Song >& menu, const ProxySongList &pl)
|
||||
{
|
||||
showSongsInColumns(menu, menu.drawn()->value(), *screen);
|
||||
showSongsInColumns(menu, menu.drawn()->value(), pl);
|
||||
}
|
||||
|
||||
void Display::Songs(NC::Menu<MPD::Song> &menu, HasSongs *screen, const std::string &format)
|
||||
void Display::Songs(NC::Menu< MPD::Song >& menu, const ProxySongList &pl, const std::string &format)
|
||||
{
|
||||
showSongs(menu, menu.drawn()->value(), *screen, format);
|
||||
showSongs(menu, menu.drawn()->value(), pl, format);
|
||||
}
|
||||
|
||||
#ifdef HAVE_TAGLIB_H
|
||||
@@ -382,7 +381,7 @@ void Display::Outputs(NC::Menu<MPD::Output> &menu)
|
||||
menu << menu.drawn()->value().name();
|
||||
}
|
||||
|
||||
void Display::Items(NC::Menu<MPD::Item> &menu)
|
||||
void Display::Items(NC::Menu<MPD::Item> &menu, const ProxySongList &pl)
|
||||
{
|
||||
const MPD::Item &item = menu.drawn()->value();
|
||||
switch (item.type)
|
||||
@@ -392,9 +391,9 @@ void Display::Items(NC::Menu<MPD::Item> &menu)
|
||||
break;
|
||||
case MPD::itSong:
|
||||
if (!Config.columns_in_browser)
|
||||
showSongs(menu, *item.song, *myBrowser, Config.song_list_format);
|
||||
showSongs(menu, *item.song, pl, Config.song_list_format);
|
||||
else
|
||||
showSongsInColumns(menu, *item.song, *myBrowser);
|
||||
showSongsInColumns(menu, *item.song, pl);
|
||||
break;
|
||||
case MPD::itPlaylist:
|
||||
menu << Config.browser_playlist_prefix << getBasename(item.name);
|
||||
@@ -402,15 +401,15 @@ void Display::Items(NC::Menu<MPD::Item> &menu)
|
||||
}
|
||||
}
|
||||
|
||||
void Display::SearchEngine(NC::Menu<SEItem> &menu)
|
||||
void Display::SearchEngine(NC::Menu<SEItem> &menu, const ProxySongList &pl)
|
||||
{
|
||||
const SEItem &si = menu.drawn()->value();
|
||||
if (si.isSong())
|
||||
{
|
||||
if (!Config.columns_in_search_engine)
|
||||
showSongs(menu, si.song(), *mySearcher, Config.song_list_format);
|
||||
showSongs(menu, si.song(), pl, Config.song_list_format);
|
||||
else
|
||||
showSongsInColumns(menu, si.song(), *mySearcher);
|
||||
showSongsInColumns(menu, si.song(), pl);
|
||||
}
|
||||
else
|
||||
menu << si.buffer();
|
||||
|
||||
@@ -36,17 +36,17 @@ void Default(NC::Menu<ItemT> &menu) { menu << menu.drawn()->value(); }
|
||||
template <typename A, typename B>
|
||||
void Pair(NC::Menu< std::pair<A, B> > &menu) { menu << menu.drawn()->value().first; }
|
||||
|
||||
void SongsInColumns(NC::Menu<MPD::Song> &menu, HasSongs *screen);
|
||||
void SongsInColumns(NC::Menu<MPD::Song> &menu, const ProxySongList &pl);
|
||||
|
||||
void Songs(NC::Menu<MPD::Song> &menu, HasSongs *screen, const std::string &format);
|
||||
void Songs(NC::Menu<MPD::Song> &menu, const ProxySongList &pl, const std::string &format);
|
||||
|
||||
void Tags(NC::Menu<MPD::MutableSong> &menu);
|
||||
|
||||
void Outputs(NC::Menu<MPD::Output> &menu);
|
||||
|
||||
void SearchEngine(NC::Menu<SEItem> &menu);
|
||||
void SearchEngine(NC::Menu<SEItem> &menu, const ProxySongList &pl);
|
||||
|
||||
void Items(NC::Menu<MPD::Item> &menu);
|
||||
void Items(NC::Menu<MPD::Item> &menu, const ProxySongList &pl);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -145,7 +145,7 @@ MediaLibrary::MediaLibrary()
|
||||
Songs.centeredCursor(Config.centered_cursor);
|
||||
Songs.setSelectedPrefix(Config.selected_item_prefix);
|
||||
Songs.setSelectedSuffix(Config.selected_item_suffix);
|
||||
Songs.setItemDisplayer(std::bind(Display::Songs, _1, this, Config.song_library_format));
|
||||
Songs.setItemDisplayer(std::bind(Display::Songs, _1, songsProxyList(), Config.song_library_format));
|
||||
|
||||
w = &Tags;
|
||||
}
|
||||
|
||||
@@ -784,6 +784,7 @@ template <typename T> bool Menu<T>::hasSelected() const
|
||||
|
||||
template <typename T> void Menu<T>::highlight(size_t pos)
|
||||
{
|
||||
assert(pos < m_options_ptr->size());
|
||||
m_highlight = pos;
|
||||
size_t half_height = m_height/2;
|
||||
if (pos < half_height)
|
||||
|
||||
@@ -60,9 +60,9 @@ Playlist::Playlist() : itsTotalLength(0), itsRemainingTime(0), itsScrollBegin(0)
|
||||
w.setSelectedPrefix(Config.selected_item_prefix);
|
||||
w.setSelectedSuffix(Config.selected_item_suffix);
|
||||
if (Config.columns_in_playlist)
|
||||
w.setItemDisplayer(std::bind(Display::SongsInColumns, _1, this));
|
||||
w.setItemDisplayer(std::bind(Display::SongsInColumns, _1, proxySongList()));
|
||||
else
|
||||
w.setItemDisplayer(std::bind(Display::Songs, _1, this, Config.song_list_format));
|
||||
w.setItemDisplayer(std::bind(Display::Songs, _1, proxySongList(), Config.song_list_format));
|
||||
}
|
||||
|
||||
void Playlist::switchTo()
|
||||
|
||||
@@ -77,9 +77,9 @@ PlaylistEditor::PlaylistEditor()
|
||||
Content.setSelectedPrefix(Config.selected_item_prefix);
|
||||
Content.setSelectedSuffix(Config.selected_item_suffix);
|
||||
if (Config.columns_in_playlist_editor)
|
||||
Content.setItemDisplayer(std::bind(Display::SongsInColumns, _1, this));
|
||||
Content.setItemDisplayer(std::bind(Display::SongsInColumns, _1, contentProxyList()));
|
||||
else
|
||||
Content.setItemDisplayer(std::bind(Display::Songs, _1, this, Config.song_list_format));
|
||||
Content.setItemDisplayer(std::bind(Display::Songs, _1, contentProxyList(), Config.song_list_format));
|
||||
|
||||
w = &Playlists;
|
||||
}
|
||||
|
||||
@@ -68,20 +68,25 @@ class ProxySongList
|
||||
virtual void highlight(size_t pos) { m_menu.highlight(pos); }
|
||||
|
||||
virtual bool isSelected(size_t pos) {
|
||||
assert(pos < m_menu.size());
|
||||
return m_menu[pos].isSelected();
|
||||
}
|
||||
virtual void setSelected(size_t pos, bool selected) {
|
||||
assert(pos < m_menu.size());
|
||||
m_menu[pos].setSelected(selected);
|
||||
}
|
||||
|
||||
virtual bool isBold(size_t pos) {
|
||||
assert(pos < m_menu.size());
|
||||
return m_menu[pos].isBold();
|
||||
}
|
||||
virtual void setBold(size_t pos, bool bold) {
|
||||
assert(pos < m_menu.size());
|
||||
m_menu[pos].setBold(bold);
|
||||
}
|
||||
|
||||
virtual MPD::Song *getSong(size_t pos) {
|
||||
assert(pos < m_menu.size());
|
||||
return m_song_getter(m_menu[pos]);
|
||||
}
|
||||
virtual MPD::Song *currentSong() {
|
||||
@@ -104,19 +109,19 @@ public:
|
||||
template <typename T, typename F>
|
||||
ProxySongList(typename NC::Menu<T> &menu, F f) : m_impl(new Impl<T, F>(menu, f)) { }
|
||||
|
||||
bool empty() { return m_impl->empty(); }
|
||||
size_t size() { return m_impl->size(); }
|
||||
size_t choice() { return m_impl->choice(); }
|
||||
void highlight(size_t pos) { m_impl->highlight(pos); }
|
||||
bool empty() const { return m_impl->empty(); }
|
||||
size_t size() const { return m_impl->size(); }
|
||||
size_t choice() const { return m_impl->choice(); }
|
||||
void highlight(size_t pos) const { m_impl->highlight(pos); }
|
||||
|
||||
bool isSelected(size_t pos) { return m_impl->isSelected(pos); }
|
||||
void setSelected(size_t pos, bool selected) { m_impl->setSelected(pos, selected); }
|
||||
bool isSelected(size_t pos) const { return m_impl->isSelected(pos); }
|
||||
void setSelected(size_t pos, bool selected) const { 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); }
|
||||
bool isBold(size_t pos) const { return m_impl->isBold(pos); }
|
||||
void setBold(size_t pos, bool bold) const{ m_impl->setBold(pos, bold); }
|
||||
|
||||
MPD::Song *getSong(size_t pos) { return m_impl->getSong(pos); }
|
||||
MPD::Song *currentSong() { return m_impl->currentSong(); }
|
||||
MPD::Song *getSong(size_t pos) const { return m_impl->getSong(pos); }
|
||||
MPD::Song *currentSong() const { return m_impl->currentSong(); }
|
||||
|
||||
/// @return true if there is no underlying menu object, false otherwise
|
||||
operator bool() const { return m_impl.get() != 0; }
|
||||
|
||||
@@ -108,7 +108,7 @@ SearchEngine::SearchEngine()
|
||||
w.setHighlightColor(Config.main_highlight_color);
|
||||
w.cyclicScrolling(Config.use_cyclic_scrolling);
|
||||
w.centeredCursor(Config.centered_cursor);
|
||||
w.setItemDisplayer(Display::SearchEngine);
|
||||
w.setItemDisplayer(std::bind(Display::SearchEngine, _1, proxySongList()));
|
||||
w.setSelectedPrefix(Config.selected_item_prefix);
|
||||
w.setSelectedSuffix(Config.selected_item_suffix);
|
||||
SearchMode = &SearchModes[Config.search_engine_default_search_mode];
|
||||
|
||||
Reference in New Issue
Block a user