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:
parent
84661c4797
commit
28e5045975
|
@ -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);
|
||||
|
|
25
core/queue.c
25
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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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 *);
|
||||
|
|
Loading…
Reference in New Issue