diff --git a/gui/queue.cpp b/gui/queue.cpp index 2d2c18a7..78184a3a 100644 --- a/gui/queue.cpp +++ b/gui/queue.cpp @@ -5,6 +5,7 @@ extern "C" { #include #include #include +#include } #include #include @@ -107,6 +108,7 @@ QueueTab :: ~QueueTab() { queue_mapping.erase(&tab_vbox); tab_unmap(); + gui_sidebar_remove(tab_pq); Glib :: wrap(GTK_NOTEBOOK(gui_builder_widget("o_notebook")), false)->remove_page(tab_vbox); renumber_queues(); } diff --git a/gui/sidebar.c b/gui/sidebar.c index 6d4acd12..f3185b65 100644 --- a/gui/sidebar.c +++ b/gui/sidebar.c @@ -63,6 +63,39 @@ void __sidebar_resize(GtkPaned *pane, GParamSpec *pspec, gpointer data) gui_settings_set(SIDEBAR_SETTING, gtk_paned_get_position(pane)); } +bool __sidebar_keypress(GtkTreeView *treeview, GdkEventKey *event, gpointer data) +{ + GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview); + GtkNotebook *notebook = GTK_NOTEBOOK(gui_builder_widget("o_notebook")); + GtkTreeModel *model = GTK_TREE_MODEL(sb_store); + struct queue *queue; + unsigned int page; + GtkTreePath *path; + GtkTreeIter iter; + GList *rows; + + if (event->keyval != GDK_KEY_Delete) + return false; + + rows = gtk_tree_selection_get_selected_rows(selection, &model); + path = rows->data; + + if (gtk_tree_model_get_iter(model, &iter, path)) + queue = __sidebar_get_queue(&iter); + page = gtk_tree_path_get_indices(path)[0]; + + if (!queue || page >= tempq_count()) + goto out; + + tempq_free(queue); + gtk_list_store_remove(sb_store, &iter); + gtk_notebook_remove_page(notebook, page); + +out: + g_list_free_full(rows, (GDestroyNotify)gtk_tree_path_free); + return true; +} + void __sidebar_selection_changed(GtkTreeSelection *selection, gpointer data) { GtkNotebook *notebook = GTK_NOTEBOOK(gui_builder_widget("o_notebook")); @@ -143,6 +176,16 @@ void gui_sidebar_add(struct queue *queue) SB_QUEUE, queue, -1); } +void gui_sidebar_remove(struct queue *queue) +{ + GtkTreeIter iter; + + if (!__sidebar_find_queue(queue, &iter)) + return; + + gtk_list_store_remove(sb_store, &iter); +} + void gui_sidebar_set_size(struct queue *queue) { const gchar *name = "Queued Tracks"; diff --git a/include/gui/sidebar.h b/include/gui/sidebar.h index 5d2d1c99..b5c3a71b 100644 --- a/include/gui/sidebar.h +++ b/include/gui/sidebar.h @@ -25,6 +25,9 @@ void gui_sidebar_selected(enum sidebar_selection_t); /* Called to add a queue to the sidebar. */ void gui_sidebar_add(struct queue *); +/* Called to remove a queue from the sidebar. */ +void gui_sidebar_remove(struct queue *); + /* Called to set the size of sidebar entries. */ void gui_sidebar_set_size(struct queue *); diff --git a/include/tests/gui.h b/include/tests/gui.h index a7f89779..4a5a31d0 100644 --- a/include/tests/gui.h +++ b/include/tests/gui.h @@ -12,6 +12,7 @@ void __audio_seek() {} #endif #ifdef TEST_NEED_SIDEBAR +void __sidebar_keypress() {} void __sidebar_resize() {} void __sidebar_selection_changed() {} #endif /* TEST_NEED_SIDEBAR */ diff --git a/share/ocarina/ocarina6.glade b/share/ocarina/ocarina6.glade index d67f5d70..34d85241 100644 --- a/share/ocarina/ocarina6.glade +++ b/share/ocarina/ocarina6.glade @@ -321,8 +321,8 @@ media-skip-backward - + False @@ -356,8 +356,8 @@ 5 - + False @@ -390,8 +390,8 @@ 5 - + False @@ -424,8 +424,8 @@ media-playback-stop - + False @@ -458,8 +458,8 @@ media-skip-forward - + False @@ -665,6 +665,7 @@ False 10 True +