core/queue: Give queues the option to save and load iterator positions

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
Anna Schumaker 2016-08-05 08:49:48 -04:00
parent 84661c4797
commit 28e5045975
3 changed files with 28 additions and 9 deletions

View File

@ -235,7 +235,7 @@ static struct sys_playlist sys_queued = {
static void sys_pl_collection_save(struct playlist *playlist)
{
if (file_open(&sys_collection_f, OPEN_WRITE)) {
queue_save_flags(&playlist->pl_queue, &sys_collection_f);
queue_save_flags(&playlist->pl_queue, &sys_collection_f, false);
file_close(&sys_collection_f);
}
}
@ -245,7 +245,7 @@ static bool sys_pl_collection_load()
struct playlist *playlist = &sys_playlists[SYS_PL_COLLECTION]->spl_playlist;
if (file_open(&sys_collection_f, OPEN_READ)) {
queue_load_flags(&playlist->pl_queue, &sys_collection_f);
queue_load_flags(&playlist->pl_queue, &sys_collection_f, false);
queue_unset_flag(&playlist->pl_queue, Q_SAVE_FLAGS);
queue_unset_flag(&playlist->pl_queue, Q_SAVE_SORT);
file_close(&sys_collection_f);

View File

@ -154,11 +154,14 @@ void queue_deinit(struct queue *queue)
queue->q_sort = NULL;
}
void queue_save_flags(struct queue *queue, struct file *file)
void queue_save_flags(struct queue *queue, struct file *file, bool iter)
{
GSList *cur = queue->q_sort;
int field;
if (iter)
file_writef(file, "%u ", queue->q_cur.it_pos);
file_writef(file, "%u %u", queue->q_flags, g_slist_length(cur));
while (cur) {
field = GPOINTER_TO_INT(cur->data);
@ -175,12 +178,18 @@ void queue_save_tracks(struct queue *queue, struct file *file)
file_writef(file, "%u", queue_size(queue));
queue_for_each(queue, &it)
file_writef(file, " %u", track_index(queue_iter_val(&it)));
file_writef(file, "\n");
}
void queue_load_flags(struct queue *queue, struct file *file)
void queue_load_flags(struct queue *queue, struct file *file, bool iter)
{
unsigned int flags, n, i;
int field, ascending;
unsigned int it = 0;
gchar *line;
if (iter)
file_readf(file, "%u", &it);
file_readf(file, "%u %u", &flags, &n);
for (i = 0; i < n; i++) {
@ -191,17 +200,25 @@ void queue_load_flags(struct queue *queue, struct file *file)
}
queue->q_flags |= flags;
queue->q_cur.it_pos = it;
if (file_readf(file, "%m\n", &line))
g_free(line);
}
void queue_load_tracks(struct queue *queue, struct file *file)
{
unsigned int i, n, t;
gchar *line;
file_readf(file, "%u ", &n);
for (i = 0; i < n; i++) {
file_readf(file, "%u", &t);
queue_add(queue, track_get(t));
}
if (file_readf(file, "%m\n", &line))
g_free(line);
}
void queue_set_flag(struct queue *queue, enum queue_flags flag)
@ -215,8 +232,10 @@ void queue_unset_flag(struct queue *queue, enum queue_flags flag)
if (!queue_has_flag(queue, flag))
return;
queue->q_flags &= ~flag;
if (flag == Q_ADD_FRONT)
if (flag == Q_ADD_FRONT) {
queue_resort(queue);
queue_iter_set(queue, &queue->q_cur, queue->q_cur.it_pos);
}
__queue_save(queue, Q_SAVE_FLAGS);
}

View File

@ -118,14 +118,14 @@ void queue_init(struct queue *, unsigned int, const struct queue_ops *, void *);
void queue_deinit(struct queue *);
/* Called to save queue flags */
void queue_save_flags(struct queue *, struct file *);
/* Called to save queue flags, sort order, and (optionally) iterator pos. */
void queue_save_flags(struct queue *, struct file *, bool);
/* Called to save the list of queued tracks. */
void queue_save_tracks(struct queue *, struct file *);
/* Called to load queue flags from file. */
void queue_load_flags(struct queue *, struct file *);
/* Called to load flags, sort order, and (optionally) iterator pos from file. */
void queue_load_flags(struct queue *, struct file *, bool);
/* Called to load queued tracks from file. */
void queue_load_tracks(struct queue *, struct file *);