playlist: make reverse operate on iterator range

This commit is contained in:
Andrzej Rybczak
2012-09-18 21:17:04 +02:00
parent 059592e28e
commit e108604641
3 changed files with 20 additions and 27 deletions

View File

@@ -75,6 +75,21 @@ std::vector<Iterator> getSelected(Iterator first, Iterator last)
return result; return result;
} }
/// @return selected range within given range or original range if no item is selected
template <typename Iterator>
std::pair<Iterator, Iterator> getSelectedRange(Iterator first, Iterator second)
{
auto result = std::make_pair(first, second);
if (hasSelected(first, second))
{
while (!result.first->isSelected())
++result.first;
while (!(result.second-1)->isSelected())
--result.second;
}
return result;
}
template <typename T> template <typename T>
void selectCurrentIfNoneSelected(NC::Menu<T> &m) void selectCurrentIfNoneSelected(NC::Menu<T> &m)
{ {

View File

@@ -223,27 +223,12 @@ bool Playlist::isFiltered()
void Playlist::Reverse() void Playlist::Reverse()
{ {
if (isFiltered())
return;
Statusbar::msg("Reversing playlist order..."); Statusbar::msg("Reversing playlist order...");
size_t beginning = -1, end = -1; auto begin = w.begin(), end = w.end();
for (size_t i = 0; i < w.size(); ++i) std::tie(begin, end) = getSelectedRange(begin, end);
{
if (w.at(i).isSelected())
{
if (beginning == size_t(-1))
beginning = i;
end = i;
}
}
if (beginning == size_t(-1)) // no selected items
{
beginning = 0;
end = w.size();
}
Mpd.StartCommandsList(); Mpd.StartCommandsList();
for (size_t i = beginning, j = end-1; i < (beginning+end)/2; ++i, --j) for (--end; begin < end; ++begin, --end)
Mpd.Swap(i, j); Mpd.Swap(begin->value().getPosition(), end->value().getPosition());
if (Mpd.CommitCommandsList()) if (Mpd.CommitCommandsList())
Statusbar::msg("Playlist reversed"); Statusbar::msg("Playlist reversed");
} }

View File

@@ -155,14 +155,7 @@ void SortPlaylistDialog::sort() const
{ {
auto &pl = myPlaylist->main(); auto &pl = myPlaylist->main();
auto begin = pl.begin(), end = pl.end(); auto begin = pl.begin(), end = pl.end();
// if songs are selected, sort range from first selected to last selected std::tie(begin, end) = getSelectedRange(begin, end);
if (hasSelected(pl.begin(), pl.end()))
{
while (!begin->isSelected())
++begin;
while (!(end-1)->isSelected())
--end;
}
size_t start_pos = begin - pl.begin(); size_t start_pos = begin - pl.begin();
MPD::SongList playlist; MPD::SongList playlist;