/* * Copyright 2016 (c) Anna Schumaker. */ #include #include #include #include #include #include #include #include #include #include #include #include static GtkTreeView *view_treeview = NULL; struct view_add_data { enum playlist_type_t vad_type; const gchar *vad_name; }; static void __view_add_to_playlist(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) { struct view_add_data *vad = (struct view_add_data *)data; playlist_add(vad->vad_type, vad->vad_name, gui_filter_path_get_track(path)); } static void __view_delete_selection(GtkTreeSelection *selection) { struct playlist *playlist = gui_model_get_playlist(); struct queue *queue = playlist ? &playlist->pl_queue : NULL; GList *rows = gtk_tree_selection_get_selected_rows(selection, NULL); GList *cur = g_list_reverse(rows); while (cur) { queue_erase(queue, gui_filter_path_get_index(cur->data)); cur = g_list_next(cur); } g_list_free_full(rows, (GDestroyNotify) gtk_tree_path_free); } static void __view_process_selection(GtkTreeView *treeview, unsigned int keyval) { GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview); struct view_add_data vad_data; struct playlist *playlist; switch (keyval) { case GDK_KEY_f: vad_data.vad_type = PL_SYSTEM; vad_data.vad_name = "Favorites"; gtk_tree_selection_selected_foreach(selection, __view_add_to_playlist, &vad_data); break; case GDK_KEY_p: playlist = gui_pl_user_add_dialog(); if (!playlist) break; vad_data.vad_type = PL_USER; vad_data.vad_name = playlist->pl_name; gtk_tree_selection_selected_foreach(selection, __view_add_to_playlist, &vad_data); break; case GDK_KEY_q: vad_data.vad_type = PL_SYSTEM; vad_data.vad_name = "Queued Tracks"; gtk_tree_selection_selected_foreach(selection, __view_add_to_playlist, &vad_data); break; case GDK_KEY_Delete: __view_delete_selection(selection); break; } } void __view_keypress(GtkTreeView *treeview, GdkEventKey *event, gpointer data) { __view_process_selection(treeview, event->keyval); } void __view_rc_new_queue(GtkMenuItem *item, gpointer data) { __view_process_selection(view_treeview, GDK_KEY_q); } void __view_rc_add_to_queue(GtkMenuItem *item, gpointer data) { unsigned int i; gchar *name; for (i = 0; i < 10; i++) { name = g_strdup_printf("o_queue_%d", i); if (GTK_WIDGET(item) == gui_builder_widget(name)) __view_process_selection(view_treeview, GDK_KEY_0 + i); g_free(name); } } void __view_rc_add_favorites(GtkMenuItem *item, gpointer data) { __view_process_selection(view_treeview, GDK_KEY_f); } void __view_rc_add_hidden(GtkMenuItem *item, gpointer data) { GtkTreeSelection *selection = gtk_tree_view_get_selection(view_treeview); GList *rows = gtk_tree_selection_get_selected_rows(selection, NULL); GList *cur = g_list_reverse(rows); while (cur) { playlist_add(PL_SYSTEM, "Hidden", gui_filter_path_get_track(cur->data)); cur = g_list_next(cur); } g_list_free_full(rows, (GDestroyNotify) gtk_tree_path_free); } 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 = gui_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 playlist *playlist; GtkWidget *submenu, *item; GList *iter, *list = NULL; if (pl_user_db_get()->db_size == 0) return NULL; submenu = gtk_menu_new(); list = gui_pl_user_list(); iter = g_list_first(list); while (iter) { playlist = (struct playlist *)iter->data; 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); iter = g_list_next(iter); } g_list_free(list); return submenu; } bool __view_button_press(GtkTreeView *treeview, GdkEventButton *event, gpointer data) { GtkMenu *menu = GTK_MENU(gui_builder_widget("rc_menu")); GtkWidget *submenu = NULL; GtkMenuItem *other; if (event->button != GDK_BUTTON_SECONDARY) return false; /* Select path if it isn't already selected */ gui_treeview_select_path_at_pos(event->x, event->y); /* 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_at_pointer(menu, (GdkEvent *)event); return true; } void gui_view_init() { view_treeview = gui_treeview(); } void gui_view_set_playlist(struct playlist *playlist) { gui_treeview_set_playlist(playlist); }