diff --git a/include/playqueue.h b/include/playqueue.h index 378c1965..8f30d5cf 100644 --- a/include/playqueue.h +++ b/include/playqueue.h @@ -28,15 +28,21 @@ enum sort_t { SORT_YEAR, }; +struct sort_info { + sort_t field; + bool ascending; +}; + class Playqueue { private: std :: vector tracks; - std :: list sort_order; + std :: list 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 &get_sort_order(); unsigned int operator[](unsigned int); unsigned int next(); diff --git a/lib/deck.cpp b/lib/deck.cpp index 2762b7da..dbc7f7d1 100644 --- a/lib/deck.cpp +++ b/lib/deck.cpp @@ -41,6 +41,8 @@ void deck :: read() { unsigned int num; int random; + unsigned int field; + bool ascending; std::list::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::iterator it; + std::list::iterator st; + std::list 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); diff --git a/lib/playqueue.cpp b/lib/playqueue.cpp index 92631cbe..822017f7 100644 --- a/lib/playqueue.cpp +++ b/lib/playqueue.cpp @@ -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 &order) + std::list &order) { - std::list::iterator it; + std::list::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 fields; + std::list fields; public: - SortTracks(std::list f) : fields(f) {} + SortTracks(std::list 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::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 &Playqueue :: get_sort_order() +{ + return sort_order; +} + unsigned int Playqueue :: operator[](unsigned int i) { return tracks[i];