fix assertion failures in media library / playlist editor with separators enabled

This commit is contained in:
Andrzej Rybczak
2012-09-16 08:13:10 +02:00
parent 48cf01f084
commit 43ccedd6d8
10 changed files with 48 additions and 43 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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