diff --git a/gui/playlist.c b/gui/playlist.c index 60c02265..d6ca74cd 100644 --- a/gui/playlist.c +++ b/gui/playlist.c @@ -81,23 +81,11 @@ void __playlist_selection_changed(GtkTreeSelection *selection, gpointer data) gboolean __playlist_on_select(GtkTreeSelection *selection, GtkTreeModel *model, GtkTreePath *path, gboolean selected, gpointer data) { - struct queue *queue = NULL; - enum playlist_type_t type; GtkTreeIter iter, child; - gchar *name; gtk_tree_model_get_iter(model, &iter, path); __playlist_filter_get_iter(&iter, &child); - - type = gui_sidebar_iter_type(&child); - if (type == PL_MAX_TYPE) - return false; - - name = gui_sidebar_iter_name(&child); - queue = playlist_get_queue(type, name); - g_free(name); - - return queue != NULL; + return gui_sidebar_iter_type(&child) != PL_MAX_TYPE; } bool __playlist_keypress(GtkTreeView *treeview, GdkEventKey *event, @@ -325,40 +313,26 @@ void gui_playlist_init() gtk_tree_model_filter_set_visible_func(filter, __playlist_visible_func, NULL, NULL); - gtk_tree_store_insert(gui_sidebar_store(), &parent, NULL, -1); - __playlist_set(&parent, "Queued Tracks", "audio-x-generic", PL_SYSTEM); - __playlist_set_size(&parent, "Queued Tracks"); - - gtk_tree_store_insert(gui_sidebar_store(), &parent, NULL, -1); - __playlist_set(&parent, "Collection", "media-optical", PL_SYSTEM); - __playlist_set_size(&parent, "Collection"); - - gtk_tree_store_insert(gui_sidebar_store(), &parent, NULL, -1); - __playlist_set(&parent, "History", "document-open-recent", PL_SYSTEM); - __playlist_set_size(&parent, "History"); + gui_sidebar_iter_first(&parent); + gui_sidebar_iter_add(&parent, playlist_get(PL_SYSTEM, "Queued Tracks"), + "audio-x-generic"); + gui_sidebar_iter_add(&parent, playlist_get(PL_SYSTEM, "Collection"), + "media-optical"); + gui_sidebar_iter_add(&parent, playlist_get(PL_SYSTEM, "History"), + "document-open-recent"); /* Add "Playlists" header and playlists. */ - gtk_tree_store_insert(gui_sidebar_store(), &parent, NULL, -1); - gtk_tree_store_insert(gui_sidebar_store(), &parent, NULL, -1); - __playlist_set(&parent, "Playlists", "emblem-documents", 0); + gui_sidebar_iter_next(&parent); __playlist_add(&parent, "Favorites", "emblem-favorite", PL_SYSTEM); __playlist_add(&parent, "Hidden", "window-close", PL_SYSTEM); /* Add "Dynamic" header. */ - gtk_tree_store_insert(gui_sidebar_store(), &parent, NULL, -1); - gtk_tree_store_insert(gui_sidebar_store(), &parent, NULL, -1); - __playlist_set(&parent, "Dynamic", "emblem-system", 0); - - /* Add playlists. */ + gui_sidebar_iter_next(&parent); + gui_sidebar_iter_next(&parent); __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); - /* Add "Library" header. */ - gtk_tree_store_insert(gui_sidebar_store(), &parent, NULL, -1); - gtk_tree_store_insert(gui_sidebar_store(), &parent, NULL, -1); - __playlist_set(&parent, "Library", "system-file-manager", 0); - gtk_tree_selection_set_select_function( gtk_tree_view_get_selection(treeview), __playlist_on_select, NULL, NULL); diff --git a/gui/sidebar.c b/gui/sidebar.c index 8ceec22d..bac48528 100644 --- a/gui/sidebar.c +++ b/gui/sidebar.c @@ -12,17 +12,38 @@ enum sidebar_columns { const gchar *SIDEBAR_SETTING = "gui.sidebar.pos"; +static gchar *__gui_sidebar_size_str(struct playlist *playlist) +{ + const gchar *fmt = "%s\n%d track%s"; + unsigned int size; + + if (!playlist) + return NULL; + + size = playlist_size(playlist->pl_type, playlist->pl_name); + if (playlist_cur() == playlist) + fmt = "%s\n%d track%s"; + return g_markup_printf_escaped(fmt, playlist->pl_name, size, + (size != 1) ? "s" : ""); +} + +static void __gui_sidebar_set(GtkTreeIter *iter, const gchar *name, + const gchar *image, enum playlist_type_t type) +{ + gtk_tree_store_set(gui_sidebar_store(), iter, SB_NAME, name, + SB_IMAGE, image, + SB_TYPE, type, -1); +} + static void __gui_sidebar_add_header(GtkTreeIter *iter, const gchar *name, const gchar *image) { gchar *formatted = g_strdup_printf("%s", name); - gtk_tree_store_insert_with_values(gui_sidebar_store(), iter, NULL, -1, - SB_TYPE, PL_MAX_TYPE, -1); - gtk_tree_store_insert_with_values(gui_sidebar_store(), iter, NULL, -1, - SB_IMAGE, image, - SB_NAME, formatted, - SB_TYPE, PL_MAX_TYPE, -1); + gtk_tree_store_insert(gui_sidebar_store(), iter, NULL, -1); + __gui_sidebar_set(iter, NULL, NULL, PL_MAX_TYPE); + gtk_tree_store_insert(gui_sidebar_store(), iter, NULL, -1); + __gui_sidebar_set(iter, formatted, image, PL_MAX_TYPE); g_free(formatted); } @@ -84,3 +105,14 @@ enum playlist_type_t gui_sidebar_iter_type(GtkTreeIter *iter) gtk_tree_model_get(gui_sidebar_model(), iter, SB_TYPE, &type, -1); return type; } + +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); +} diff --git a/include/gui/sidebar.h b/include/gui/sidebar.h index 8dced3bd..2ce4dbc3 100644 --- a/include/gui/sidebar.h +++ b/include/gui/sidebar.h @@ -24,6 +24,9 @@ gchar *gui_sidebar_iter_name(GtkTreeIter *); /* Called to find the type of the playlist at the given iterator. */ 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 get the sidebar widget. */ static inline GtkPaned *gui_sidebar() { diff --git a/tests/gui/playlist.c b/tests/gui/playlist.c index 233dc7a6..d86bb42a 100644 --- a/tests/gui/playlist.c +++ b/tests/gui/playlist.c @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -110,6 +111,7 @@ int main(int argc, char **argv) gui_model_init(); gui_filter_init(); gui_treeview_init(); + gui_sidebar_init(); gui_view_init(); gui_playlist_init(); playlist_new(PL_LIBRARY, "tests/Music/Hyrule Symphony"); diff --git a/tests/gui/sidebar.c b/tests/gui/sidebar.c index 347db4b3..488362eb 100644 --- a/tests/gui/sidebar.c +++ b/tests/gui/sidebar.c @@ -1,13 +1,17 @@ /* * Copyright 2015 (c) Anna Schumaker. */ +#include #include #include #include -const gchar *test_pl_names[6] = { "", "Playlists", - "", "Dynamic", - "", "Library" }; +const gchar *test_pl_names[8] = { "Collection", + "History", + "", "Playlists", + "", "Dynamic", + "", "Library" }; +struct core_init_data init_data; static void test_sidebar() { @@ -27,13 +31,17 @@ static void test_sidebar() g_assert_true(GTK_IS_TREE_VIEW(gui_sidebar_treeview())); g_assert_true(gui_sidebar_iter_first(&iter)); - for (i = 0; i < 6; i++) { + gui_sidebar_iter_add(&iter, playlist_get(PL_SYSTEM, "Collection"), NULL); + gui_sidebar_iter_add(&iter, playlist_get(PL_SYSTEM, "History"), NULL); + + g_assert_true(gui_sidebar_iter_first(&iter)); + for (i = 0; i < 8; i++) { g_assert_cmpstr_free(gui_sidebar_iter_name(&iter), ==, test_pl_names[i]); g_assert_cmpuint(gui_sidebar_iter_type(&iter), ==, - PL_MAX_TYPE); + (i < 2) ? PL_SYSTEM: PL_MAX_TYPE); - if (i < 5) + if (i < 7) g_assert_true(gui_sidebar_iter_next(&iter)); } g_assert_false(gui_sidebar_iter_next(&iter)); @@ -58,7 +66,7 @@ int main(int argc, char **argv) int ret; gtk_init(&argc, NULL); - settings_init(); + core_init(&argc, &argv, &init_data); gui_builder_init("share/ocarina/ocarina.ui"); gui_sidebar_init(); @@ -67,7 +75,7 @@ int main(int argc, char **argv) g_test_add_func("/Gui/Sidebar/Pos", test_sidebar_pos); ret = g_test_run(); + core_deinit(); gui_builder_deinit(); - settings_deinit(); return ret; }