playqueue: Generic sorting

I don't save the sort order yet.

Signed-off-by: Anna Schumaker <schumaker.anna@gmail.com>
This commit is contained in:
Anna Schumaker 2014-01-26 13:44:25 -05:00 committed by Anna Schumaker
parent 8ab973cd85
commit d430e09a59
3 changed files with 22 additions and 0 deletions

View File

@ -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)();
};

View File

@ -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,
};

View File

@ -6,6 +6,7 @@
#include <playqueue.h>
#include <stdlib.h>
#include <algorithm>
#include <sstream>
#define O_MINUTES (60)
@ -241,12 +242,31 @@ unsigned int Playqueue :: size()
return tracks.size();
}
/* Sorting function */
class SortTracks {
private:
std::list<sort_t> fields;
public:
SortTracks(std::list<sort_t> 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)