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:
parent
8ab973cd85
commit
d430e09a59
|
@ -24,6 +24,7 @@ struct Callbacks {
|
||||||
/* Playqueue callbacks */
|
/* Playqueue callbacks */
|
||||||
void (*on_queue_track_add)(Playqueue *, unsigned int);
|
void (*on_queue_track_add)(Playqueue *, unsigned int);
|
||||||
void (*on_queue_track_del)(Playqueue *, unsigned int);
|
void (*on_queue_track_del)(Playqueue *, unsigned int);
|
||||||
|
void (*on_queue_track_changed)(Playqueue *, unsigned int);
|
||||||
void (*on_queue_changed)();
|
void (*on_queue_changed)();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -25,6 +25,7 @@ static struct Callbacks callbacks = {
|
||||||
|
|
||||||
.on_queue_track_add = no_op,
|
.on_queue_track_add = no_op,
|
||||||
.on_queue_track_del = no_op,
|
.on_queue_track_del = no_op,
|
||||||
|
.on_queue_track_changed = no_op,
|
||||||
.on_queue_changed = no_op,
|
.on_queue_changed = no_op,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
#include <playqueue.h>
|
#include <playqueue.h>
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <algorithm>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
#define O_MINUTES (60)
|
#define O_MINUTES (60)
|
||||||
|
@ -241,12 +242,31 @@ unsigned int Playqueue :: size()
|
||||||
return tracks.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)
|
void Playqueue :: add_sort(sort_t field)
|
||||||
{
|
{
|
||||||
sort_order.remove(field);
|
sort_order.remove(field);
|
||||||
sort_order.push_back(field);
|
sort_order.push_back(field);
|
||||||
if (sort_order.size() >= 4)
|
if (sort_order.size() >= 4)
|
||||||
sort_order.erase(sort_order.begin());
|
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)
|
void Playqueue :: reset_sort(sort_t field)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user