playqueue: Write library sort order to disk
Signed-off-by: Anna Schumaker <schumaker.anna@gmail.com>
This commit is contained in:
parent
f83f8d47fa
commit
6a227df41b
|
@ -28,15 +28,21 @@ enum sort_t {
|
|||
SORT_YEAR,
|
||||
};
|
||||
|
||||
struct sort_info {
|
||||
sort_t field;
|
||||
bool ascending;
|
||||
};
|
||||
|
||||
class Playqueue {
|
||||
private:
|
||||
std :: vector <unsigned int> tracks;
|
||||
std :: list <sort_t> sort_order;
|
||||
std :: list <sort_info> sort_order;
|
||||
unsigned int flags;
|
||||
unsigned int cur;
|
||||
unsigned int length;
|
||||
|
||||
unsigned int add_sorted(unsigned int, library :: Song &);
|
||||
void _add_sort(sort_t);
|
||||
|
||||
public:
|
||||
Playqueue();
|
||||
|
@ -59,6 +65,7 @@ public:
|
|||
|
||||
void add_sort(sort_t);
|
||||
void reset_sort(sort_t);
|
||||
std::list <sort_info> &get_sort_order();
|
||||
|
||||
unsigned int operator[](unsigned int);
|
||||
unsigned int next();
|
||||
|
|
21
lib/deck.cpp
21
lib/deck.cpp
|
@ -41,6 +41,8 @@ void deck :: read()
|
|||
{
|
||||
unsigned int num;
|
||||
int random;
|
||||
unsigned int field;
|
||||
bool ascending;
|
||||
std::list<Playqueue>::iterator it;
|
||||
|
||||
if (!deck_file.exists())
|
||||
|
@ -48,7 +50,17 @@ void deck :: read()
|
|||
|
||||
deck_file.open(OPEN_READ);
|
||||
deck_file >> random >> num;
|
||||
for (unsigned int i = 0; i < num; i++) {
|
||||
deck_file >> field >> ascending;
|
||||
if (i == 0)
|
||||
library_playqueue.reset_sort((sort_t)field);
|
||||
else
|
||||
library_playqueue.add_sort((sort_t)field);
|
||||
if (ascending == false)
|
||||
library_playqueue.add_sort((sort_t)field);
|
||||
}
|
||||
|
||||
deck_file >> num;
|
||||
if (random)
|
||||
library_playqueue.set_flag(PQ_RANDOM);
|
||||
|
||||
|
@ -62,9 +74,18 @@ void deck :: read()
|
|||
void deck :: write()
|
||||
{
|
||||
std::list<Playqueue>::iterator it;
|
||||
std::list<sort_info>::iterator st;
|
||||
std::list<sort_info> sort_order;
|
||||
|
||||
deck_file.open(OPEN_WRITE);
|
||||
|
||||
/* Save library playqueue */
|
||||
sort_order = library_playqueue.get_sort_order();
|
||||
deck_file << (library_playqueue.get_flags() & PQ_RANDOM) << " ";
|
||||
deck_file << sort_order.size() << " ";
|
||||
for (st = sort_order.begin(); st != sort_order.end(); st++)
|
||||
deck_file << st->field << " " << st->ascending << " ";
|
||||
|
||||
deck_file << playqueue_deck.size() << std :: endl;
|
||||
for (it = playqueue_deck.begin(); it != playqueue_deck.end(); it++) {
|
||||
it->write(deck_file);
|
||||
|
|
|
@ -144,13 +144,16 @@ static inline int track_compare(library :: Song &lhs, library :: Song &rhs,
|
|||
}
|
||||
|
||||
static bool track_less_than(library :: Song &lhs, library :: Song &rhs,
|
||||
std::list<sort_t> &order)
|
||||
std::list<sort_info> &order)
|
||||
{
|
||||
std::list<sort_t>::iterator it;
|
||||
std::list<sort_info>::iterator it;
|
||||
int res;
|
||||
|
||||
for (it = order.begin(); it != order.end(); it++) {
|
||||
res = track_compare(lhs, rhs, *it);
|
||||
if (it->ascending == true)
|
||||
res = track_compare(lhs, rhs, it->field);
|
||||
else
|
||||
res = track_compare(rhs, lhs, it->field);
|
||||
if (res != 0)
|
||||
return res < 0;
|
||||
}
|
||||
|
@ -246,9 +249,9 @@ unsigned int Playqueue :: size()
|
|||
/* Sorting function */
|
||||
class SortTracks {
|
||||
private:
|
||||
std::list<sort_t> fields;
|
||||
std::list<sort_info> fields;
|
||||
public:
|
||||
SortTracks(std::list<sort_t> f) : fields(f) {}
|
||||
SortTracks(std::list<sort_info> f) : fields(f) {}
|
||||
bool operator()(unsigned int a, unsigned int b)
|
||||
{
|
||||
library::Song lhs, rhs;
|
||||
|
@ -258,15 +261,34 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
void Playqueue :: add_sort(sort_t field)
|
||||
void Playqueue :: _add_sort(sort_t field)
|
||||
{
|
||||
sort_order.remove(field);
|
||||
sort_order.push_back(field);
|
||||
struct sort_info info;
|
||||
std::list<sort_info>::iterator it;
|
||||
|
||||
/* Is field already in the sort_order? */
|
||||
for (it = sort_order.begin(); it != sort_order.end(); it++) {
|
||||
if (it->field == field) {
|
||||
it->ascending = !it->ascending;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
info.field = field;
|
||||
info.ascending = true;
|
||||
sort_order.push_back(info);
|
||||
if (sort_order.size() >= 4)
|
||||
sort_order.erase(sort_order.begin());
|
||||
}
|
||||
|
||||
void Playqueue :: add_sort(sort_t field)
|
||||
{
|
||||
_add_sort(field);
|
||||
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);
|
||||
get_callbacks()->on_queue_changed();
|
||||
}
|
||||
|
||||
void Playqueue :: reset_sort(sort_t field)
|
||||
|
@ -275,6 +297,11 @@ void Playqueue :: reset_sort(sort_t field)
|
|||
add_sort(field);
|
||||
}
|
||||
|
||||
std::list<sort_info> &Playqueue :: get_sort_order()
|
||||
{
|
||||
return sort_order;
|
||||
}
|
||||
|
||||
unsigned int Playqueue :: operator[](unsigned int i)
|
||||
{
|
||||
return tracks[i];
|
||||
|
|
Loading…
Reference in New Issue