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) 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) if (Config.titles_visibility)
myPlaylist->main().setTitle(Display::Columns(myPlaylist->main().getWidth())); myPlaylist->main().setTitle(Display::Columns(myPlaylist->main().getWidth()));
else else
@@ -1127,7 +1127,7 @@ void ToggleDisplayMode::Run()
} }
else 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(""); myPlaylist->main().setTitle("");
} }
} }
@@ -1149,9 +1149,9 @@ void ToggleDisplayMode::Run()
Config.columns_in_playlist_editor = !Config.columns_in_playlist_editor; Config.columns_in_playlist_editor = !Config.columns_in_playlist_editor;
Statusbar::msg("Playlist editor display mode: %s", Config.columns_in_playlist_editor ? "Columns" : "Classic"); Statusbar::msg("Playlist editor display mode: %s", Config.columns_in_playlist_editor ? "Columns" : "Classic");
if (Config.columns_in_playlist_editor) 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 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.centeredCursor(Config.centered_cursor);
w.setSelectedPrefix(Config.selected_item_prefix); w.setSelectedPrefix(Config.selected_item_prefix);
w.setSelectedSuffix(Config.selected_item_suffix); w.setSelectedSuffix(Config.selected_item_suffix);
w.setItemDisplayer(Display::Items); w.setItemDisplayer(std::bind(Display::Items, _1, proxySongList()));
if (SupportedExtensions.empty()) if (SupportedExtensions.empty())
Mpd.GetSupportedExtensions(SupportedExtensions); Mpd.GetSupportedExtensions(SupportedExtensions);

View File

@@ -73,16 +73,15 @@ const wchar_t *toColumnName(char c)
} }
template <typename T> 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) bool &is_now_playing, bool &is_selected, 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;
if (Config.playlist_separate_albums) if (Config.playlist_separate_albums)
{ {
auto pl = screen.proxySongList(); size_t next_pos = drawn_pos+1;
assert(pl); auto next = next_pos < pl.size() ? pl.getSong(next_pos) : 0;
auto next = pl.getSong(drawn_pos+1);
if (next && next->getAlbum() != s.getAlbum()) if (next && next->getAlbum() != s.getAlbum())
separate_albums = true; separate_albums = true;
} }
@@ -103,10 +102,10 @@ void setProperties(NC::Menu<T> &menu, const MPD::Song &s, HasSongs &screen, bool
} }
template <typename T> 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; 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(); size_t y = menu.getY();
std::string line = s.toString(format, Config.tags_separator, "$"); 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> 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()) if (Config.columns.empty())
return; return;
bool separate_albums, is_now_playing, is_selected, discard_colors; 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 width;
int y = menu.getY(); int y = menu.getY();
@@ -346,14 +345,14 @@ std::string Display::Columns(size_t list_width)
return result; 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 #ifdef HAVE_TAGLIB_H
@@ -382,7 +381,7 @@ void Display::Outputs(NC::Menu<MPD::Output> &menu)
menu << menu.drawn()->value().name(); 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(); const MPD::Item &item = menu.drawn()->value();
switch (item.type) switch (item.type)
@@ -392,9 +391,9 @@ void Display::Items(NC::Menu<MPD::Item> &menu)
break; break;
case MPD::itSong: case MPD::itSong:
if (!Config.columns_in_browser) if (!Config.columns_in_browser)
showSongs(menu, *item.song, *myBrowser, Config.song_list_format); showSongs(menu, *item.song, pl, Config.song_list_format);
else else
showSongsInColumns(menu, *item.song, *myBrowser); showSongsInColumns(menu, *item.song, pl);
break; break;
case MPD::itPlaylist: case MPD::itPlaylist:
menu << Config.browser_playlist_prefix << getBasename(item.name); 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(); const SEItem &si = menu.drawn()->value();
if (si.isSong()) if (si.isSong())
{ {
if (!Config.columns_in_search_engine) 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 else
showSongsInColumns(menu, si.song(), *mySearcher); showSongsInColumns(menu, si.song(), pl);
} }
else else
menu << si.buffer(); menu << si.buffer();

View File

@@ -36,17 +36,17 @@ void Default(NC::Menu<ItemT> &menu) { menu << menu.drawn()->value(); }
template <typename A, typename B> template <typename A, typename B>
void Pair(NC::Menu< std::pair<A, B> > &menu) { menu << menu.drawn()->value().first; } 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 Tags(NC::Menu<MPD::MutableSong> &menu);
void Outputs(NC::Menu<MPD::Output> &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.centeredCursor(Config.centered_cursor);
Songs.setSelectedPrefix(Config.selected_item_prefix); Songs.setSelectedPrefix(Config.selected_item_prefix);
Songs.setSelectedSuffix(Config.selected_item_suffix); 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; 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) template <typename T> void Menu<T>::highlight(size_t pos)
{ {
assert(pos < m_options_ptr->size());
m_highlight = pos; m_highlight = pos;
size_t half_height = m_height/2; size_t half_height = m_height/2;
if (pos < half_height) 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.setSelectedPrefix(Config.selected_item_prefix);
w.setSelectedSuffix(Config.selected_item_suffix); w.setSelectedSuffix(Config.selected_item_suffix);
if (Config.columns_in_playlist) if (Config.columns_in_playlist)
w.setItemDisplayer(std::bind(Display::SongsInColumns, _1, this)); w.setItemDisplayer(std::bind(Display::SongsInColumns, _1, proxySongList()));
else 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() void Playlist::switchTo()

View File

@@ -77,9 +77,9 @@ PlaylistEditor::PlaylistEditor()
Content.setSelectedPrefix(Config.selected_item_prefix); Content.setSelectedPrefix(Config.selected_item_prefix);
Content.setSelectedSuffix(Config.selected_item_suffix); Content.setSelectedSuffix(Config.selected_item_suffix);
if (Config.columns_in_playlist_editor) if (Config.columns_in_playlist_editor)
Content.setItemDisplayer(std::bind(Display::SongsInColumns, _1, this)); Content.setItemDisplayer(std::bind(Display::SongsInColumns, _1, contentProxyList()));
else 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; w = &Playlists;
} }

View File

@@ -68,20 +68,25 @@ class ProxySongList
virtual void highlight(size_t pos) { m_menu.highlight(pos); } virtual void highlight(size_t pos) { m_menu.highlight(pos); }
virtual bool isSelected(size_t pos) { virtual bool isSelected(size_t pos) {
assert(pos < m_menu.size());
return m_menu[pos].isSelected(); return m_menu[pos].isSelected();
} }
virtual void setSelected(size_t pos, bool selected) { virtual void setSelected(size_t pos, bool selected) {
assert(pos < m_menu.size());
m_menu[pos].setSelected(selected); m_menu[pos].setSelected(selected);
} }
virtual bool isBold(size_t pos) { virtual bool isBold(size_t pos) {
assert(pos < m_menu.size());
return m_menu[pos].isBold(); return m_menu[pos].isBold();
} }
virtual void setBold(size_t pos, bool bold) { virtual void setBold(size_t pos, bool bold) {
assert(pos < m_menu.size());
m_menu[pos].setBold(bold); m_menu[pos].setBold(bold);
} }
virtual MPD::Song *getSong(size_t pos) { virtual MPD::Song *getSong(size_t pos) {
assert(pos < m_menu.size());
return m_song_getter(m_menu[pos]); return m_song_getter(m_menu[pos]);
} }
virtual MPD::Song *currentSong() { virtual MPD::Song *currentSong() {
@@ -104,19 +109,19 @@ public:
template <typename T, typename F> template <typename T, typename F>
ProxySongList(typename NC::Menu<T> &menu, F f) : m_impl(new Impl<T, F>(menu, f)) { } ProxySongList(typename NC::Menu<T> &menu, F f) : m_impl(new Impl<T, F>(menu, f)) { }
bool empty() { return m_impl->empty(); } bool empty() const { return m_impl->empty(); }
size_t size() { return m_impl->size(); } size_t size() const { return m_impl->size(); }
size_t choice() { return m_impl->choice(); } size_t choice() const { return m_impl->choice(); }
void highlight(size_t pos) { m_impl->highlight(pos); } void highlight(size_t pos) const { m_impl->highlight(pos); }
bool isSelected(size_t pos) { return m_impl->isSelected(pos); } bool isSelected(size_t pos) const { return m_impl->isSelected(pos); }
void setSelected(size_t pos, bool selected) { m_impl->setSelected(pos, selected); } void setSelected(size_t pos, bool selected) const { m_impl->setSelected(pos, selected); }
bool isBold(size_t pos) { return m_impl->isBold(pos); } bool isBold(size_t pos) const { return m_impl->isBold(pos); }
void setBold(size_t pos, bool bold) { m_impl->setBold(pos, bold); } 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 *getSong(size_t pos) const { return m_impl->getSong(pos); }
MPD::Song *currentSong() { return m_impl->currentSong(); } MPD::Song *currentSong() const { return m_impl->currentSong(); }
/// @return true if there is no underlying menu object, false otherwise /// @return true if there is no underlying menu object, false otherwise
operator bool() const { return m_impl.get() != 0; } operator bool() const { return m_impl.get() != 0; }

View File

@@ -108,7 +108,7 @@ SearchEngine::SearchEngine()
w.setHighlightColor(Config.main_highlight_color); w.setHighlightColor(Config.main_highlight_color);
w.cyclicScrolling(Config.use_cyclic_scrolling); w.cyclicScrolling(Config.use_cyclic_scrolling);
w.centeredCursor(Config.centered_cursor); w.centeredCursor(Config.centered_cursor);
w.setItemDisplayer(Display::SearchEngine); w.setItemDisplayer(std::bind(Display::SearchEngine, _1, proxySongList()));
w.setSelectedPrefix(Config.selected_item_prefix); w.setSelectedPrefix(Config.selected_item_prefix);
w.setSelectedSuffix(Config.selected_item_suffix); w.setSelectedSuffix(Config.selected_item_suffix);
SearchMode = &SearchModes[Config.search_engine_default_search_mode]; SearchMode = &SearchModes[Config.search_engine_default_search_mode];