diff --git a/gui/playlist.c b/gui/playlist.c index 4a167f2e..abc6a70b 100644 --- a/gui/playlist.c +++ b/gui/playlist.c @@ -13,7 +13,7 @@ enum playlist_sidebar_columns { }; static GtkTreeStore *p_store; -static gchar *p_name; +static gchar *p_name = NULL; static void __playlist_set(GtkTreeIter *iter, const gchar *name, const gchar *image) @@ -22,12 +22,37 @@ static void __playlist_set(GtkTreeIter *iter, const gchar *name, P_SB_IMAGE, image, -1); } +static void __playlist_set_size(GtkTreeIter *iter, const gchar *name) +{ + unsigned int size = playlist_size(name); + const gchar *fmt = "%s\n%d track%s"; + gchar *text; + + text = g_strdup_printf(fmt, name, size, (size == 1) ? "" : "s"); + gtk_tree_store_set(p_store, iter, P_SB_NAME, text, -1); + g_free(text); +} + static void __playlist_add(GtkTreeIter *parent, const gchar *name, const gchar *image) { GtkTreeIter iter; gtk_tree_store_insert(p_store, &iter, parent, -1); __playlist_set(&iter, name, image); + __playlist_set_size(&iter, name); +} + +static gchar *__playlist_name(GtkTreeIter *iter) +{ + GtkTreeModel *model = GTK_TREE_MODEL(p_store); + gchar **split, *name; + + gtk_tree_model_get(model, iter, P_SB_NAME, &name, -1); + split = g_strsplit(name, "\n", 2); + name = g_strdup(split[0]); + + g_strfreev(split); + return name; } void __playlist_selection_changed(GtkTreeSelection *selection, gpointer data) @@ -37,7 +62,9 @@ void __playlist_selection_changed(GtkTreeSelection *selection, gpointer data) GtkTreeIter iter; if (gtk_tree_selection_get_selected(selection, &model, &iter)) { - gtk_tree_model_get(model, &iter, P_SB_NAME, &p_name, -1); + if (p_name) + g_free(p_name); + p_name = __playlist_name(&iter); gtk_stack_set_visible_child_name(stack, "queues"); gui_sidebar_selected(SB_PLAYLIST, @@ -45,11 +72,42 @@ void __playlist_selection_changed(GtkTreeSelection *selection, gpointer data) } } +static void __playlist_update_sizes() +{ + GtkTreeModel *model = GTK_TREE_MODEL(p_store); + GtkTreeIter parent, iter; + gchar *name; + + if (!gtk_tree_model_get_iter_first(model, &parent)) + return; + gtk_tree_model_iter_next(model, &parent); + if (!gtk_tree_model_iter_children(model, &iter, &parent)) + return; + + do { + name = __playlist_name(&iter); + __playlist_set_size(&iter, name); + g_free(name); + } while (gtk_tree_model_iter_next(model, &iter)); +} + static void *__playlist_init(struct queue *queue) { return gui_queue_alloc(queue, "Playlist", 0); } +static void __playlist_added(struct queue *queue, unsigned int row) +{ + gui_queue_added(queue, row); + __playlist_update_sizes(); +} + +static void __playlist_removed(struct queue *queue, unsigned int row) +{ + gui_queue_removed(queue, row); + __playlist_update_sizes(); +} + static bool __playlist_erase(struct queue *queue, struct track *track) { /* collection_unban() and playlist_remove() handle queue changes */ @@ -74,7 +132,7 @@ void gui_playlist_init() /* Add playlists. */ __playlist_add(&parent, "Favorites", "emblem-favorite"); - __playlist_add(&parent, "Hidden", "face-sad"); + __playlist_add(&parent, "Hidden", "window-close"); __playlist_add(&parent, "Most Played", "go-up"); __playlist_add(&parent, "Least Played", "go-down"); __playlist_add(&parent, "Unplayed", "audio-x-generic"); @@ -96,9 +154,9 @@ gchar *gui_playlist_cur() struct queue_ops playlist_ops = { .qop_init = __playlist_init, .qop_deinit = gui_queue_free, - .qop_added = gui_queue_added, + .qop_added = __playlist_added, .qop_erase = __playlist_erase, - .qop_removed = gui_queue_removed, + .qop_removed = __playlist_removed, .qop_cleared = gui_queue_cleared, .qop_updated = gui_queue_updated, };