Fix deletion of items in a filtered playlist

This commit is contained in:
Andrzej Rybczak
2017-01-06 01:17:11 +01:00
parent 4cd94cb4b3
commit 401e732056

View File

@@ -341,22 +341,37 @@ void moveSelectedItemsTo(NC::Menu<MPD::Song> &menu, F &&move_fun)
} }
template <typename F> template <typename F>
void deleteSelectedSongs(NC::Menu<MPD::Song> &m, F delete_fun) void deleteSelectedSongs(NC::Menu<MPD::Song> &menu, F &&delete_fun)
{ {
selectCurrentIfNoneSelected(m); selectCurrentIfNoneSelected(menu);
// ok, this is tricky. we need to operate on whole playlist // We need to operate on the whole playlist to get positions right, but at the
// to get positions right, but at the same time we need to // same time we need to ignore all songs that are not filtered. We abuse the
// ignore all songs that are not filtered. we use the fact // fact that both ranges share the same values, i.e. we can compare addresses
// that both ranges share the same values, ie. we can compare // of item values to check whether an item belongs to filtered range. TODO: do
// pointers to check whether an item belongs to filtered range. // something more sane here.
auto begin = ++m.begin(); NC::Menu<MPD::Song>::Iterator begin;
Mpd.StartCommandsList(); NC::Menu<MPD::Song>::ReverseIterator real_begin, real_end;
for (auto it = m.rbegin(); it != m.rend(); ++it)
{ {
if (it->isSelected()) ScopedUnfilteredMenu<MPD::Song> sunfilter(ReapplyFilter::No, menu);
// obtain iterators for unfiltered range
begin = menu.begin() + 1; // cancel reverse iterator's offset
real_begin = menu.rbegin();
real_end = menu.rend();
};
// get iterator to filtered range
auto cur_filtered = menu.rbegin();
Mpd.StartCommandsList();
for (auto it = real_begin; it != real_end; ++it)
{
// current iterator belongs to filtered range, proceed
if (&it->value() == &cur_filtered->value())
{ {
it->setSelected(false); if (it->isSelected())
delete_fun(Mpd, it.base() - begin); {
it->setSelected(false);
delete_fun(Mpd, it.base() - begin);
}
++cur_filtered;
} }
} }
Mpd.CommitCommandsList(); Mpd.CommitCommandsList();