diff --git a/core/playlist.c b/core/playlist.c index 143f3efd..97f2d00d 100644 --- a/core/playlist.c +++ b/core/playlist.c @@ -209,12 +209,12 @@ bool playlist_get_random(struct playlist *playlist) return playlist ? queue_has_flag(&playlist->pl_queue, Q_RANDOM) : false; } -bool playlist_sort(struct playlist *playlist, enum compare_t sort, bool reset) +bool playlist_sort(struct playlist *playlist, enum compare_t sort) { if (!playlist || !playlist->pl_ops->pl_sort) return false; - playlist->pl_ops->pl_sort(playlist, sort, reset); + playlist->pl_ops->pl_sort(playlist, sort); playlist_types[playlist->pl_type]->pl_save(); return g_slist_length(playlist->pl_queue.q_sort) > 0; } diff --git a/core/playlists/generic.c b/core/playlists/generic.c index f325e1a8..c6156faa 100644 --- a/core/playlists/generic.c +++ b/core/playlists/generic.c @@ -17,9 +17,9 @@ void playlist_generic_init(struct playlist *playlist, unsigned int flags, struct queue_ops *ops) { queue_init(&playlist->pl_queue, flags, ops, playlist); - queue_sort(&playlist->pl_queue, COMPARE_ARTIST, true); - queue_sort(&playlist->pl_queue, COMPARE_YEAR, false); - queue_sort(&playlist->pl_queue, COMPARE_TRACK, false); + queue_sort(&playlist->pl_queue, COMPARE_ARTIST); + queue_sort(&playlist->pl_queue, COMPARE_YEAR); + queue_sort(&playlist->pl_queue, COMPARE_TRACK); playlist->pl_private = NULL; } @@ -79,6 +79,7 @@ void playlist_generic_load(struct playlist *playlist, struct file *file, field = -field; sort = g_slist_append(sort, GINT_TO_POINTER(field)); } + playlist_clear_sort(playlist); playlist->pl_queue.q_sort = sort; queue_resort(&playlist->pl_queue); @@ -140,10 +141,9 @@ void playlist_generic_set_flag(struct playlist *playlist, return queue_unset_flag(&playlist->pl_queue, flag); } -void playlist_generic_sort(struct playlist *playlist, - enum compare_t sort, bool reset) +void playlist_generic_sort(struct playlist *playlist, enum compare_t sort) { - queue_sort(&playlist->pl_queue, sort, reset); + queue_sort(&playlist->pl_queue, sort); } struct track *playlist_generic_next(struct playlist *playlist) diff --git a/core/queue.c b/core/queue.c index 3f7e23f2..3829c687 100644 --- a/core/queue.c +++ b/core/queue.c @@ -256,16 +256,11 @@ void queue_resort(struct queue *queue) __queue_updated(queue, i); } -void queue_sort(struct queue *queue, enum compare_t sort, bool reset) +void queue_sort(struct queue *queue, enum compare_t sort) { GSList *cur = NULL; int field; - if (reset) { - g_slist_free(queue->q_sort); - queue->q_sort = NULL; - } - cur = queue->q_sort; while (cur) { field = GPOINTER_TO_INT(cur->data); diff --git a/gui/treeview.c b/gui/treeview.c index 2688a7ca..d91a2b6e 100644 --- a/gui/treeview.c +++ b/gui/treeview.c @@ -126,13 +126,14 @@ static void __gui_treeview_column_clicked(GtkTreeViewColumn *col, { struct playlist *playlist = gui_model_get_playlist(); enum compare_t compare = GPOINTER_TO_UINT(data); - bool reset = (sort_count == 0); gchar *text; if (!playlist) return; - if (!playlist_sort(playlist, compare, reset)) + if (sort_count == 0) + playlist_clear_sort(playlist); + if (!playlist_sort(playlist, compare)) return; __gui_treeview_set_sort_indicators(); diff --git a/include/core/playlist.h b/include/core/playlist.h index a8e1b412..99af6766 100644 --- a/include/core/playlist.h +++ b/include/core/playlist.h @@ -71,6 +71,6 @@ void playlist_set_random(struct playlist *, bool); bool playlist_get_random(struct playlist *); /* Called to change the sort order of the playlist. */ -bool playlist_sort(struct playlist *, enum compare_t, bool); +bool playlist_sort(struct playlist *, enum compare_t); #endif /* OCARINA_CORE_PLAYLIST_H */ diff --git a/include/core/playlists/generic.h b/include/core/playlists/generic.h index bfb50fe9..742f5a8a 100644 --- a/include/core/playlists/generic.h +++ b/include/core/playlists/generic.h @@ -46,7 +46,7 @@ bool playlist_generic_remove_track(struct playlist *, struct track *); void playlist_generic_set_flag(struct playlist *, enum queue_flags, bool); /* Generic playlist sorting operation. */ -void playlist_generic_sort(struct playlist *, enum compare_t, bool); +void playlist_generic_sort(struct playlist *, enum compare_t); /* Generic playlist next track operation. */ struct track *playlist_generic_next(struct playlist *); diff --git a/include/core/playlists/playlist.h b/include/core/playlists/playlist.h index 1edcecd6..0183ba02 100644 --- a/include/core/playlists/playlist.h +++ b/include/core/playlists/playlist.h @@ -38,7 +38,7 @@ struct playlist_ops { void (*pl_set_flag)(struct playlist *, enum queue_flags, bool); /* Called to sort the playlist. */ - void (*pl_sort)(struct playlist *, enum compare_t, bool); + void (*pl_sort)(struct playlist *, enum compare_t); }; @@ -77,4 +77,14 @@ struct playlist_type { void (*pl_played)(struct track *); }; + +/* Called to clear the sort order of the playlist. */ +static inline void playlist_clear_sort(struct playlist *playlist) +{ + if (playlist) { + g_slist_free(playlist->pl_queue.q_sort); + playlist->pl_queue.q_sort = NULL; + } +} + #endif /* OCARINA_CORE_PLAYLISTS_PLAYLIST_H */ diff --git a/include/core/queue.h b/include/core/queue.h index e9885763..b0de3475 100644 --- a/include/core/queue.h +++ b/include/core/queue.h @@ -171,6 +171,6 @@ struct track *queue_next(struct queue *); void queue_resort(struct queue *); /* Called to change the sort order and resort the queue. */ -void queue_sort(struct queue *, enum compare_t, bool); +void queue_sort(struct queue *, enum compare_t); #endif /* OCARINA_CORE_QUEUE_H */ diff --git a/tests/core/playlist.c b/tests/core/playlist.c index 17d53794..3f6cbdfc 100644 --- a/tests/core/playlist.c +++ b/tests/core/playlist.c @@ -32,13 +32,24 @@ static void test_null() playlist_set_random(NULL, true); g_assert_false(playlist_get_random(NULL)); - g_assert_false(playlist_sort(NULL, COMPARE_TRACK, true)); - g_assert_false(playlist_sort(NULL, COMPARE_TRACK, false)); + g_assert_false(playlist_sort(NULL, COMPARE_TRACK)); + g_assert_false(playlist_sort(NULL, COMPARE_TRACK)); + playlist_clear_sort(NULL); playlist_generic_save(NULL, NULL, PL_SAVE_ALL); playlist_generic_load(NULL, NULL, PL_SAVE_ALL); } +static void test_sorting() +{ + struct playlist p = DEFINE_PLAYLIST(PL_MAX_TYPE, "Test", 0, NULL); + + playlist_generic_init(&p, 0, NULL); + g_assert_cmpuint(g_slist_length(p.pl_queue.q_sort), ==, 3); + playlist_clear_sort(&p); + g_assert_cmpuint(g_slist_length(p.pl_queue.q_sort), ==, 0); +} + static void test_save_load() { struct playlist p = DEFINE_PLAYLIST(PL_MAX_TYPE, "Test", 0, NULL); @@ -53,7 +64,8 @@ static void test_save_load() queue_add(&q.pl_queue, track_get(i)); } queue_set_flag(&p.pl_queue, Q_RANDOM); - queue_sort(&p.pl_queue, COMPARE_TRACK, true); + playlist_clear_sort(&p); + queue_sort(&p.pl_queue, COMPARE_TRACK); p.pl_queue.q_cur.it_pos = 3; q.pl_queue.q_cur.it_pos = 4; @@ -111,6 +123,7 @@ int main(int argc, char **argv) g_test_init(&argc, &argv, NULL); g_test_add_func("/Core/Playlist/NULL", test_null); + g_test_add_func("/Core/Playlists/Sorting", test_sorting); g_test_add_func("/Core/Playlist/Save and Load", test_save_load); ret = g_test_run(); diff --git a/tests/core/playlists/library.c b/tests/core/playlists/library.c index 3c5a51e8..04c92fe1 100644 --- a/tests/core/playlists/library.c +++ b/tests/core/playlists/library.c @@ -74,14 +74,14 @@ void test_library() g_assert_false(playlist_get_random(playlist)); g_assert_cmpuint(g_slist_length(playlist->pl_queue.q_sort), ==, 3); - g_assert_true(playlist_sort(playlist, COMPARE_ARTIST, true)); + playlist_clear_sort(playlist); + g_assert_cmpuint(g_slist_length(playlist->pl_queue.q_sort), ==, 0); + g_assert_true(playlist_sort(playlist, COMPARE_ARTIST)); g_assert_cmpuint(g_slist_length(playlist->pl_queue.q_sort), ==, 1); - g_assert_true(playlist_sort(playlist, COMPARE_YEAR, false)); + g_assert_true(playlist_sort(playlist, COMPARE_YEAR)); g_assert_cmpuint(g_slist_length(playlist->pl_queue.q_sort), ==, 2); - g_assert_true(playlist_sort(playlist, COMPARE_TRACK, false)); + g_assert_true(playlist_sort(playlist, COMPARE_TRACK)); g_assert_cmpuint(g_slist_length(playlist->pl_queue.q_sort), ==, 3); - g_assert_true(playlist_sort(playlist, COMPARE_TITLE, true)); - g_assert_cmpuint(g_slist_length(playlist->pl_queue.q_sort), ==, 1); g_rename("tests/Music/Hyrule Symphony/", "tests/Hyrule Symphony/"); pl_library_update(playlist); diff --git a/tests/core/playlists/system.c b/tests/core/playlists/system.c index bc8f0a68..764b3983 100644 --- a/tests/core/playlists/system.c +++ b/tests/core/playlists/system.c @@ -95,16 +95,17 @@ static void test_sort() for (i = 0; i < SYS_PL_NUM_PLAYLISTS; i++) { playlist = playlist_get(PL_SYSTEM, i); + playlist_clear_sort(playlist); if (i == SYS_PL_HISTORY) { - g_assert_false(playlist_sort(playlist, COMPARE_TRACK, true)); + g_assert_false(playlist_sort(playlist, COMPARE_TRACK)); g_assert_cmpuint(g_slist_length(playlist->pl_queue.q_sort), ==, 0); - g_assert_false(playlist_sort(playlist, COMPARE_YEAR, false)); + g_assert_false(playlist_sort(playlist, COMPARE_YEAR)); g_assert_cmpuint(g_slist_length(playlist->pl_queue.q_sort), ==, 0); } else { - g_assert_true(playlist_sort(playlist, COMPARE_TRACK, true)); + g_assert_true(playlist_sort(playlist, COMPARE_TRACK)); g_assert_cmpuint(g_slist_length(playlist->pl_queue.q_sort), ==, 1); - g_assert_true(playlist_sort(playlist, COMPARE_YEAR, false)); + g_assert_true(playlist_sort(playlist, COMPARE_YEAR)); g_assert_cmpuint(g_slist_length(playlist->pl_queue.q_sort), ==, 2); } } diff --git a/tests/core/queue.c b/tests/core/queue.c index 445bba43..f78fad38 100644 --- a/tests/core/queue.c +++ b/tests/core/queue.c @@ -224,7 +224,9 @@ static void test_rand_select() for (i = 0; i < 13; i++) queue_add(&q, track_get(i)); - queue_sort(&q, COMPARE_TRACK, true); + g_slist_free(q.q_sort); + q.q_sort = NULL; + queue_sort(&q, COMPARE_TRACK); /* * The comments below use the following notation: @@ -277,40 +279,50 @@ static void test_sorting() g_assert_cmpuint(track->tr_dbe.dbe_index, ==, 12 - i); } - queue_sort(&q, COMPARE_TRACK, true); + g_slist_free(q.q_sort); + q.q_sort = NULL; + queue_sort(&q, COMPARE_TRACK); for (i = 0; i < 13; i++) { track = queue_at(&q, i); g_assert_nonnull(track); g_assert_cmpuint(track->tr_track, ==, i + 1); } - queue_sort(&q, COMPARE_COUNT, true); + g_slist_free(q.q_sort); + q.q_sort = NULL; + queue_sort(&q, COMPARE_COUNT); for (i = 0; i < 13; i++) { track = queue_at(&q, i); g_assert_nonnull(track); g_assert_cmpuint(track->tr_track, ==, ex_count[i]); } - queue_sort(&q, COMPARE_TITLE, true); + g_slist_free(q.q_sort); + q.q_sort = NULL; + queue_sort(&q, COMPARE_TITLE); for (i = 0; i < 13; i++) { track = queue_at(&q, i); g_assert_nonnull(track); g_assert_cmpuint(track->tr_track, ==, ex_title[i]); } - queue_sort(&q, COMPARE_COUNT, true); - queue_sort(&q, COMPARE_TITLE, false); - queue_sort(&q, COMPARE_COUNT, false); + g_slist_free(q.q_sort); + q.q_sort = NULL; + queue_sort(&q, COMPARE_COUNT); + queue_sort(&q, COMPARE_TITLE); + queue_sort(&q, COMPARE_COUNT); for (i = 0; i < 13; i++) { track = queue_at(&q, i); g_assert_nonnull(track); g_assert_cmpuint(track->tr_track, ==, ex_co_ti[i]); } - queue_sort(&q, COMPARE_ARTIST, true); - queue_sort(&q, COMPARE_ALBUM, false); - queue_sort(&q, COMPARE_TRACK, false); - queue_sort(&q, COMPARE_TRACK, false); + g_slist_free(q.q_sort); + q.q_sort = NULL; + queue_sort(&q, COMPARE_ARTIST); + queue_sort(&q, COMPARE_ALBUM); + queue_sort(&q, COMPARE_TRACK); + queue_sort(&q, COMPARE_TRACK); for (i = 0; i < 13; i++) { track = queue_at(&q, i); g_assert_nonnull(track);