From 9885c60bff1750db4915f5e8067f806a674ff36e Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Thu, 25 Aug 2016 11:41:40 -0400 Subject: [PATCH] gui/sidebar: Add functions for appending child playlists Signed-off-by: Anna Schumaker --- gui/playlist.c | 15 ++++++++++----- gui/sidebar.c | 27 +++++++++++++++++++++++---- include/gui/sidebar.h | 7 +++++++ tests/gui/sidebar.c | 16 +++++++++++++++- 4 files changed, 55 insertions(+), 10 deletions(-) diff --git a/gui/playlist.c b/gui/playlist.c index 8bdbe2ea..a7480804 100644 --- a/gui/playlist.c +++ b/gui/playlist.c @@ -323,14 +323,19 @@ void gui_playlist_init() /* Add "Playlists" header and playlists. */ gui_sidebar_iter_find(&parent, "Playlists", PL_MAX_TYPE); - __playlist_add(&parent, "Favorites", "emblem-favorite", PL_SYSTEM); - __playlist_add(&parent, "Hidden", "window-close", PL_SYSTEM); + gui_sidebar_iter_append_child(&parent, playlist_get(PL_SYSTEM, "Favorites"), + "emblem-favorite"); + gui_sidebar_iter_append_child(&parent, playlist_get(PL_SYSTEM, "Hidden"), + "window-close"); /* Add "Dynamic" header. */ gui_sidebar_iter_find(&parent, "Dynamic", PL_MAX_TYPE); - __playlist_add(&parent, "Most Played", "go-up", PL_SYSTEM); - __playlist_add(&parent, "Least Played", "go-down", PL_SYSTEM); - __playlist_add(&parent, "Unplayed", "audio-x-generic", PL_SYSTEM); + gui_sidebar_iter_append_child(&parent, playlist_get(PL_SYSTEM, "Most Played"), + "go-up"); + gui_sidebar_iter_append_child(&parent, playlist_get(PL_SYSTEM, "Least Played"), + "go-down"); + gui_sidebar_iter_append_child(&parent, playlist_get(PL_SYSTEM, "Unplayed"), + "audio-x-generic"); gtk_tree_selection_set_select_function( gtk_tree_view_get_selection(treeview), diff --git a/gui/sidebar.c b/gui/sidebar.c index bf59ba86..c6c74be6 100644 --- a/gui/sidebar.c +++ b/gui/sidebar.c @@ -36,6 +36,15 @@ static void __gui_sidebar_set(GtkTreeIter *iter, const gchar *name, SB_TYPE, type, -1); } +static void __gui_sidebar_set_playlist(GtkTreeIter *iter, + struct playlist *playlist, + const gchar *image) +{ + gchar *text = __gui_sidebar_size_str(playlist); + __gui_sidebar_set(iter, text, image, playlist->pl_type); + g_free(text); +} + static void __gui_sidebar_add_header(GtkTreeIter *iter, const gchar *name, const gchar *image) { @@ -79,6 +88,11 @@ gboolean gui_sidebar_iter_next(GtkTreeIter *iter) return gtk_tree_model_iter_next(gui_sidebar_model(), iter); } +gboolean gui_sidebar_iter_down(GtkTreeIter *iter, GtkTreeIter *child) +{ + return gtk_tree_model_iter_children(gui_sidebar_model(), child, iter); +} + gchar *gui_sidebar_iter_name(GtkTreeIter *iter) { gchar *text = NULL, *parsed = NULL, *name, **split; @@ -110,12 +124,17 @@ enum playlist_type_t gui_sidebar_iter_type(GtkTreeIter *iter) void gui_sidebar_iter_add(GtkTreeIter *iter, struct playlist *playlist, const gchar *image) { - gchar *text = __gui_sidebar_size_str(playlist); GtkTreeIter new; - gtk_tree_store_insert_before(gui_sidebar_store(), &new, NULL, iter); - __gui_sidebar_set(&new, text, image, playlist->pl_type); - g_free(text); + __gui_sidebar_set_playlist(&new, playlist, image); +} + +void gui_sidebar_iter_append_child(GtkTreeIter *iter, struct playlist *playlist, + const gchar *image) +{ + GtkTreeIter new; + gtk_tree_store_insert_before(gui_sidebar_store(), &new, iter, NULL); + __gui_sidebar_set_playlist(&new, playlist, image); } gboolean gui_sidebar_iter_find(GtkTreeIter *iter, const gchar *name, diff --git a/include/gui/sidebar.h b/include/gui/sidebar.h index 169f5cb8..36d9a042 100644 --- a/include/gui/sidebar.h +++ b/include/gui/sidebar.h @@ -15,6 +15,9 @@ gboolean gui_sidebar_iter_first(GtkTreeIter *); /* Called to advance the iterator to the next playlist. */ gboolean gui_sidebar_iter_next(GtkTreeIter *); +/* Called to set an iterator to the first child of the parent iterator. */ +gboolean gui_sidebar_iter_down(GtkTreeIter *, GtkTreeIter *); + /* * Called to find the name of the playlist at the given iterator. * NOTE: This function returns a new string that must be freed with g_free(). @@ -27,6 +30,10 @@ enum playlist_type_t gui_sidebar_iter_type(GtkTreeIter *); /* Called to add a playlist at the current iterator. */ void gui_sidebar_iter_add(GtkTreeIter *, struct playlist *, const gchar *); +/* Called to append a child playlist to the current iterator. */ +void gui_sidebar_iter_append_child(GtkTreeIter *, struct playlist *, + const gchar *); + /* * Called to find a playlist with the given name and type, * starting from the current iterator position. diff --git a/tests/gui/sidebar.c b/tests/gui/sidebar.c index b1cd7ac9..64eb81b8 100644 --- a/tests/gui/sidebar.c +++ b/tests/gui/sidebar.c @@ -15,7 +15,7 @@ struct core_init_data init_data; static void test_sidebar() { - GtkTreeIter iter; + GtkTreeIter iter, child; unsigned int i; g_assert_nonnull(gui_sidebar_store()); @@ -51,6 +51,20 @@ static void test_sidebar() g_assert_cmpstr_free(gui_sidebar_iter_name(&iter), ==, "Playlists"); g_assert_cmpuint(gui_sidebar_iter_type(&iter), ==, PL_MAX_TYPE); + g_assert_false(gui_sidebar_iter_down(&iter, &child)); + gui_sidebar_iter_append_child(&iter, playlist_get(PL_SYSTEM, "Favorites"), + NULL); + gui_sidebar_iter_append_child(&iter, playlist_get(PL_SYSTEM, "Hidden"), + NULL); + g_assert_true(gui_sidebar_iter_down(&iter, &child)); + + for (i = 0; i < 2; i++) { + g_assert_cmpstr_free(gui_sidebar_iter_name(&child), ==, + (i == 0) ? "Favorites" : "Hidden"); + g_assert_cmpuint(gui_sidebar_iter_type(&child), ==, PL_SYSTEM); + gui_sidebar_iter_next(&child); + } + g_assert_false(gui_sidebar_iter_find(&iter, "History", PL_SYSTEM)); gui_sidebar_iter_first(&iter); g_assert_true(gui_sidebar_iter_find(&iter, "History", PL_SYSTEM));