From e108604641775e620506e97137d49c46ae0c1087 Mon Sep 17 00:00:00 2001 From: Andrzej Rybczak Date: Tue, 18 Sep 2012 21:17:04 +0200 Subject: [PATCH] playlist: make reverse operate on iterator range --- src/helpers.h | 15 +++++++++++++++ src/playlist.cpp | 23 ++++------------------- src/sort_playlist.cpp | 9 +-------- 3 files changed, 20 insertions(+), 27 deletions(-) diff --git a/src/helpers.h b/src/helpers.h index f0aed4f4..0cea0a9e 100644 --- a/src/helpers.h +++ b/src/helpers.h @@ -75,6 +75,21 @@ std::vector getSelected(Iterator first, Iterator last) return result; } +/// @return selected range within given range or original range if no item is selected +template +std::pair 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 void selectCurrentIfNoneSelected(NC::Menu &m) { diff --git a/src/playlist.cpp b/src/playlist.cpp index 6ad07437..086959fb 100644 --- a/src/playlist.cpp +++ b/src/playlist.cpp @@ -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"); } diff --git a/src/sort_playlist.cpp b/src/sort_playlist.cpp index 0afd0962..2ccb8870 100644 --- a/src/sort_playlist.cpp +++ b/src/sort_playlist.cpp @@ -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;