From 28e504597545937ed32636262e61cf394ad3e516 Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Fri, 5 Aug 2016 08:49:48 -0400 Subject: [PATCH] core/queue: Give queues the option to save and load iterator positions Signed-off-by: Anna Schumaker --- core/playlists/system.c | 4 ++-- core/queue.c | 25 ++++++++++++++++++++++--- include/core/queue.h | 8 ++++---- 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/core/playlists/system.c b/core/playlists/system.c index 868f1ccc..959e648b 100644 --- a/core/playlists/system.c +++ b/core/playlists/system.c @@ -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); diff --git a/core/queue.c b/core/queue.c index 28d2a822..ac45ce92 100644 --- a/core/queue.c +++ b/core/queue.c @@ -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); } diff --git a/include/core/queue.h b/include/core/queue.h index 3bf28b31..ba77e63f 100644 --- a/include/core/queue.h +++ b/include/core/queue.h @@ -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 *);