deck: Create TempQueues

TempQueues create a way to trigger deck :: write() whenever a queue
changes.  This means higher layers don't need to remember to save after
changes!

Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This commit is contained in:
Anna Schumaker 2014-05-31 09:09:44 -04:00
parent 36322a6ff8
commit f8f389c7ed
6 changed files with 111 additions and 23 deletions

37
DESIGN
View File

@ -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<Queue> deck;
list<TempQueue> 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 :: <whatever>() 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

View File

@ -7,6 +7,23 @@
#include <queue.h>
#include <list>
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<Queue> &get_queues();
std::list<TempQueue> &get_queues();
Queue *get_queue();
};

View File

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

View File

@ -21,11 +21,53 @@ public:
};
static std::list<Queue> queue_deck;
static std::list<TempQueue> 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<Queue>::iterator it;
std::list<TempQueue>::iterator it;
if (!deck_file.open(OPEN_READ))
return;
@ -71,7 +113,7 @@ void deck :: init()
void deck :: write()
{
std::list<Queue>::iterator it;
std::list<TempQueue>::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<Queue>::iterator &it)
static void _destroy(std::list<TempQueue>::iterator &it)
{
get_callbacks()->on_pq_removed(&(*it));
queue_deck.erase(it);
@ -101,7 +142,7 @@ static void _destroy(std::list<Queue>::iterator &it)
void deck :: destroy(Queue *queue)
{
std::list<Queue>::iterator it;
std::list<TempQueue>::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<Queue>::iterator it_old = queue_deck.begin();
std::list<Queue>::iterator it_new = queue_deck.begin();
std::list<TempQueue>::iterator it_old = queue_deck.begin();
std::list<TempQueue>::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<Queue>::iterator it;
std::list<TempQueue>::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<Queue>::iterator it;
std::list<TempQueue>::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<Queue> &deck :: get_queues()
std::list<TempQueue> &deck :: get_queues()
{
return queue_deck;
}

View File

@ -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

View File

@ -13,7 +13,7 @@ static void test_init()
{
unsigned int val;
File f("deck", 0);
std::list<Queue>::iterator it;
std::list<TempQueue>::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<Queue>::iterator it = deck :: get_queues().begin();
std::list<TempQueue>::iterator it = deck :: get_queues().begin();
Queue *q = deck :: get_queue();
Queue *q0 = &(*it++);
Queue *q1 = &(*it++);