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 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>
void selectCurrentIfNoneSelected(NC::Menu<T> &m)
{

View File

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

View File

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