From d430e09a59f6fcabf7d6a73dde50221e32894cdc Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Sun, 26 Jan 2014 13:44:25 -0500 Subject: [PATCH] playqueue: Generic sorting I don't save the sort order yet. Signed-off-by: Anna Schumaker --- include/callback.h | 1 + lib/callback.cpp | 1 + lib/playqueue.cpp | 20 ++++++++++++++++++++ 3 files changed, 22 insertions(+) diff --git a/include/callback.h b/include/callback.h index 505af9f9..8ebb7b5d 100644 --- a/include/callback.h +++ b/include/callback.h @@ -24,6 +24,7 @@ struct Callbacks { /* Playqueue callbacks */ void (*on_queue_track_add)(Playqueue *, unsigned int); void (*on_queue_track_del)(Playqueue *, unsigned int); + void (*on_queue_track_changed)(Playqueue *, unsigned int); void (*on_queue_changed)(); }; diff --git a/lib/callback.cpp b/lib/callback.cpp index 21683a9c..0ce97be9 100644 --- a/lib/callback.cpp +++ b/lib/callback.cpp @@ -25,6 +25,7 @@ static struct Callbacks callbacks = { .on_queue_track_add = no_op, .on_queue_track_del = no_op, + .on_queue_track_changed = no_op, .on_queue_changed = no_op, }; diff --git a/lib/playqueue.cpp b/lib/playqueue.cpp index f4a9f005..92631cbe 100644 --- a/lib/playqueue.cpp +++ b/lib/playqueue.cpp @@ -6,6 +6,7 @@ #include #include +#include #include #define O_MINUTES (60) @@ -241,12 +242,31 @@ unsigned int Playqueue :: size() return tracks.size(); } + +/* Sorting function */ +class SortTracks { +private: + std::list fields; +public: + SortTracks(std::list f) : fields(f) {} + bool operator()(unsigned int a, unsigned int b) + { + library::Song lhs, rhs; + library :: lookup(a, &lhs); + library :: lookup(b, &rhs); + return track_less_than(lhs, rhs, fields); + } +}; + void Playqueue :: add_sort(sort_t field) { sort_order.remove(field); sort_order.push_back(field); if (sort_order.size() >= 4) sort_order.erase(sort_order.begin()); + std::stable_sort(tracks.begin(), tracks.end(), SortTracks(sort_order)); + for (unsigned int i = 0; i < tracks.size(); i++) + get_callbacks()->on_queue_track_changed(this, i); } void Playqueue :: reset_sort(sort_t field)