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