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 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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user