From ddb564ed8296335dfce199e9a48b7379d1e97176 Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Thu, 18 Aug 2016 08:40:32 -0400 Subject: [PATCH] gui/view: Create a menu item for adding tracks to user playlists This has to be created programmatically due to the dynamic nature of user playlists. The easiest way to do that is to list user playlists in a submenu and switch them out as needed. Signed-off-by: Anna Schumaker --- gui/view.c | 52 +++++++++++++++++++++++++++++++++--- share/ocarina/ocarina6.glade | 10 ++++++- 2 files changed, 58 insertions(+), 4 deletions(-) diff --git a/gui/view.c b/gui/view.c index 7ad52651..6d1a96f6 100644 --- a/gui/view.c +++ b/gui/view.c @@ -177,7 +177,7 @@ void __view_column_clicked(GtkTreeViewColumn *col, gpointer data) struct view_add_data { enum playlist_type_t vad_type; - gchar *vad_name; + const gchar *vad_name; }; static void __view_add_to_playlist(GtkTreeModel *model, GtkTreePath *path, @@ -310,14 +310,51 @@ void __view_rc_add_new(GtkMenuItem *item, gpointer data) __view_process_selection(view_treeview, GDK_KEY_p); } +static void __view_rc_add_other(GtkWidget *item, gpointer data) +{ + GtkTreeView *treeview = GTK_TREE_VIEW(gui_builder_widget("o_treeview")); + GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview); + struct playlist *playlist = (struct playlist *)data; + struct view_add_data vad_data = { + .vad_type = PL_USER, + .vad_name = playlist->pl_name, + }; + + gtk_tree_selection_selected_foreach(selection, + __view_add_to_playlist, + &vad_data); +} + +static GtkWidget *__view_rc_build_submenu(void) +{ + struct db_entry *dbe, *next; + struct playlist *playlist; + GtkWidget *submenu, *item; + + if (pl_user_db_get()->db_size == 0) + return NULL; + + submenu = gtk_menu_new(); + db_for_each(dbe, next, pl_user_db_get()) { + playlist = &USER_PLAYLIST(dbe)->pl_playlist; + item = gtk_menu_item_new_with_label(playlist->pl_name); + gtk_menu_shell_append(GTK_MENU_SHELL(submenu), item); + g_signal_connect(item, "activate", G_CALLBACK(__view_rc_add_other), playlist); + } + + return submenu; +} + bool __view_button_press(GtkTreeView *treeview, GdkEventButton *event, gpointer data) { GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview); GtkMenu *menu = GTK_MENU(gui_builder_widget("o_menu")); + GtkWidget *submenu = NULL; + GtkMenuItem *other; GtkTreePath *path; - if (event->button != 3) + if (event->button != GDK_BUTTON_SECONDARY) return false; /* Select path if it isn't already selected */ @@ -328,7 +365,16 @@ bool __view_button_press(GtkTreeView *treeview, GdkEventButton *event, gtk_tree_path_free(path); } - /* Determine which menu items can be shown */ + /* Set the "Other Playlists" submenu. */ + other = GTK_MENU_ITEM(gui_builder_widget("o_add_to_other")); + submenu = __view_rc_build_submenu(); + gtk_menu_item_set_submenu(other, submenu); + + if (!submenu) + gtk_widget_hide(GTK_WIDGET(other)); + else + gtk_widget_show_all(GTK_WIDGET(other)); + gtk_menu_popup(menu, NULL, NULL, NULL, NULL, event->button, event->time); return true; } diff --git a/share/ocarina/ocarina6.glade b/share/ocarina/ocarina6.glade index d5ef5dad..2bd36206 100644 --- a/share/ocarina/ocarina6.glade +++ b/share/ocarina/ocarina6.glade @@ -2,6 +2,11 @@ + + True + False + text-x-generic + True False @@ -94,9 +99,12 @@ - + + Add to Other Playlist True False + image + False