diff --git a/DESIGN b/DESIGN index 4ae018fe..89e56d07 100644 --- a/DESIGN +++ b/DESIGN @@ -1176,15 +1176,29 @@ Playlist: Deck: The deck is used to hold temporary queues created by the user. This layer is also in charge of maintaining a "recently played" queue of - tracks. The function deck :: write() must be called whenever a queue - is modified to save the changes to disk. + tracks. The deck will be saved to the file "deck". When upgrading from file version V0 to V1, use the saved random flag and sort order to set up the library_q. +- TempQueue: + class TempQueue : public Queue { + public: + TempQueue(bool); + + void set_flag(queue_flag); + void unset_flag(queue_flag); + + unsigned int add(Track *); + void del(Track *); + void del(unsigned int); + + void sort(sort_t, bool); + }; + - Deck: - list deck; + list deck; V0: File << library_q.random << library_q.sort_order().size(); @@ -1205,6 +1219,23 @@ Deck: unsigned int add(Track *); }; +- TempQueue API: + TempQueue :: TempQueue(bool random); + Initialize a new TempQueue with the flag Q_ENABLED set. + If random is True then also set the Q_RANDOM flag. + + void TempQueue :: set_flag(queue_flag flag); + void TempQueue :: unset_flag(queue_flag flag); + unsigned int TempQueue :: add(Track *track); + void TempQueue :: del(Track *track); + void TempQueue :: del(unsigned int index); + void TempQueue :: sort(sort_t field, bool ascending); + These functions are all wrappers around the basic Queue + functions of the same name. First, call the corresponding + Queue :: () function to make the correct Queue + modification. Then, call deck :: write() to save changes to + disk. + - RecentQueue API: RecentQueue :: RecentQueue(); Initialize a Queue with the flags Q_ENABLED, Q_REPEAT, and diff --git a/include/deck.h b/include/deck.h index 421e434a..7deae73d 100644 --- a/include/deck.h +++ b/include/deck.h @@ -7,6 +7,23 @@ #include #include + +class TempQueue : public Queue +{ +public: + TempQueue(); + TempQueue(bool random); + + void set_flag(queue_flags); + void unset_flag(queue_flags); + + unsigned int add(Track *); + void del(Track *); + void del(unsigned int); + + void sort(sort_t, bool); +}; + namespace deck { @@ -21,7 +38,7 @@ namespace deck Track *next(); Track *prev(); - std::list &get_queues(); + std::list &get_queues(); Queue *get_queue(); }; diff --git a/include/queue.h b/include/queue.h index f595ce68..451200be 100644 --- a/include/queue.h +++ b/include/queue.h @@ -49,8 +49,8 @@ public: bool has_flag(queue_flags); virtual unsigned int add(Track *); - void del(Track *); - void del(unsigned int); + virtual void del(Track *); + virtual void del(unsigned int); void updated(Track *); Track *next(); diff --git a/lib/deck.cpp b/lib/deck.cpp index b95fecb6..db2c284f 100644 --- a/lib/deck.cpp +++ b/lib/deck.cpp @@ -21,11 +21,53 @@ public: }; -static std::list queue_deck; +static std::list queue_deck; static RecentQueue recent_queue; static File deck_file("deck", 1); +TempQueue :: TempQueue() {} +TempQueue :: TempQueue(bool random) + : Queue(Q_ENABLED | (random ? Q_RANDOM : 0)) {} + +void TempQueue :: set_flag(queue_flags flag) +{ + Queue :: set_flag(flag); + deck :: write(); +} + +void TempQueue :: unset_flag(queue_flags flag) +{ + Queue :: unset_flag(flag); + deck :: write(); +} + +unsigned int TempQueue :: add(Track *track) +{ + unsigned int res = Queue :: add(track); + deck :: write(); + return res; +} + +void TempQueue :: del(Track *track) +{ + Queue :: del(track); + deck :: write(); +} + +void TempQueue :: del(unsigned int id) +{ + Queue :: del(id); + deck :: write(); +} + +void TempQueue :: sort(sort_t field, bool ascending) +{ + Queue :: sort(field, ascending); + deck :: write(); +} + + static void upgrade_v0() { int random, ascending; @@ -48,7 +90,7 @@ void deck :: init() { unsigned int num; bool upgraded = false; - std::list::iterator it; + std::list::iterator it; if (!deck_file.open(OPEN_READ)) return; @@ -71,7 +113,7 @@ void deck :: init() void deck :: write() { - std::list::iterator it; + std::list::iterator it; if (!deck_file.open(OPEN_WRITE)) return; @@ -87,12 +129,11 @@ void deck :: write() Queue *deck :: create(bool random) { - unsigned int flag = (random ? Q_RANDOM : 0); - queue_deck.push_back(Queue(Q_ENABLED | flag)); + queue_deck.push_back(TempQueue(random)); return &queue_deck.back(); } -static void _destroy(std::list::iterator &it) +static void _destroy(std::list::iterator &it) { get_callbacks()->on_pq_removed(&(*it)); queue_deck.erase(it); @@ -101,7 +142,7 @@ static void _destroy(std::list::iterator &it) void deck :: destroy(Queue *queue) { - std::list::iterator it; + std::list::iterator it; for (it = queue_deck.begin(); it != queue_deck.end(); it++) { if (&(*it) == queue) { @@ -114,8 +155,8 @@ void deck :: destroy(Queue *queue) void deck :: move(Queue *queue, unsigned int new_pos) { unsigned int old_pos = deck :: index(queue); - std::list::iterator it_old = queue_deck.begin(); - std::list::iterator it_new = queue_deck.begin(); + std::list::iterator it_old = queue_deck.begin(); + std::list::iterator it_new = queue_deck.begin(); for (unsigned int i = 0; i < queue_deck.size(); i++) { if (i < old_pos) @@ -129,12 +170,13 @@ void deck :: move(Queue *queue, unsigned int new_pos) it_new++; queue_deck.splice(it_new, queue_deck, it_old); + write(); } unsigned int deck :: index(Queue *queue) { unsigned int i = 0; - std::list::iterator it; + std::list::iterator it; for (it = queue_deck.begin(); it != queue_deck.end(); it++) { if (&(*it) == queue) @@ -148,7 +190,7 @@ unsigned int deck :: index(Queue *queue) Track *deck :: next() { Track *track = NULL; - std::list::iterator it; + std::list::iterator it; for (it = queue_deck.begin(); it != queue_deck.end(); it++) { if (it->has_flag(Q_ENABLED) == false) @@ -157,8 +199,6 @@ Track *deck :: next() track = it->next(); if (it->size() == 0) _destroy(it); - else - write(); break; } @@ -174,7 +214,7 @@ Track *deck :: prev() return recent_queue.next(); } -std::list &deck :: get_queues() +std::list &deck :: get_queues() { return queue_deck; } diff --git a/lib/tags.cpp b/lib/tags.cpp index df9b5c71..b2e0ed47 100644 --- a/lib/tags.cpp +++ b/lib/tags.cpp @@ -165,7 +165,7 @@ Track :: Track(const std::string &f, Library *l) Track :: ~Track() { - library->count--; + //library->count--; } const std::string Track :: primary_key() const diff --git a/tests/deck.cpp b/tests/deck.cpp index 6944bc79..21f82b14 100644 --- a/tests/deck.cpp +++ b/tests/deck.cpp @@ -13,7 +13,7 @@ static void test_init() { unsigned int val; File f("deck", 0); - std::list::iterator it; + std::list::iterator it; deck :: init(); test_equal(library :: get_queue()->has_flag(Q_RANDOM), true); @@ -96,7 +96,7 @@ static void test_create_mv_destroy() static void test_next_prev() { - std::list::iterator it = deck :: get_queues().begin(); + std::list::iterator it = deck :: get_queues().begin(); Queue *q = deck :: get_queue(); Queue *q0 = &(*it++); Queue *q1 = &(*it++);