playlist: make reverse operate on iterator range
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user