X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/be9093980bb57f8a7d102f3e4bac0af79b34435f..2271707479533be4bc9ee77e98c615db18621ac3:/disobedience/queue-menu.c diff --git a/disobedience/queue-menu.c b/disobedience/queue-menu.c index b76ed81..a8cd691 100644 --- a/disobedience/queue-menu.c +++ b/disobedience/queue-menu.c @@ -82,14 +82,49 @@ void ql_scratch_activate(GtkMenuItem attribute((unused)) *menuitem, /* Remove */ +static void remove_sensitive_callback(GtkTreeModel *model, + GtkTreePath attribute((unused)) *path, + GtkTreeIter *iter, + gpointer data) { + struct queuelike *ql = g_object_get_data(G_OBJECT(model), "ql"); + struct queue_entry *q = ql_iter_to_q(ql, iter); + const int removable = (q != playing_track + && right_removable(last_rights, config->username, q)); + int *const counts = data; + ++counts[removable]; +} + int ql_remove_sensitive(struct queuelike *ql) { - return gtk_tree_selection_count_selected_rows(ql->selection) > 0; - /* TODO ... but not if only selected track is playing track */ + int counts[2] = { 0, 0 }; + gtk_tree_selection_selected_foreach(ql->selection, + remove_sensitive_callback, + counts); + /* Remove will work if we have at least some removable tracks selected, and + * no unremovable ones */ + return counts[1] > 0 && counts[0] == 0; +} + +static void remove_completed(void attribute((unused)) *v, const char *error) { + if(error) + popup_protocol_error(0, error); +} + +static void remove_activate_callback(GtkTreeModel *model, + GtkTreePath attribute((unused)) *path, + GtkTreeIter *iter, + gpointer attribute((unused)) data) { + struct queuelike *ql = g_object_get_data(G_OBJECT(model), "ql"); + struct queue_entry *q = ql_iter_to_q(ql, iter); + + disorder_eclient_remove(client, q->id, remove_completed, q); } void ql_remove_activate(GtkMenuItem attribute((unused)) *menuitem, - gpointer attribute((unused)) user_data) { - /* TODO */ + gpointer user_data) { + struct queuelike *ql = user_data; + gtk_tree_selection_selected_foreach(ql->selection, + remove_activate_callback, + 0); } /* Play */ @@ -164,6 +199,48 @@ gboolean ql_button_release(GtkWidget*widget, return FALSE; } +static int ql_tab_selectall_sensitive(void *extra) { + return ql_selectall_sensitive(extra); +} + +static void ql_tab_selectall_activate(void *extra) { + ql_selectall_activate(NULL, extra); +} + +static int ql_tab_selectnone_sensitive(void *extra) { + return ql_selectnone_sensitive(extra); +} + +static void ql_tab_selectnone_activate(void *extra) { + ql_selectnone_activate(NULL, extra); +} + +static int ql_tab_properties_sensitive(void *extra) { + return ql_properties_sensitive(extra); +} + +static void ql_tab_properties_activate(void *extra) { + ql_properties_activate(NULL, extra); +} + +struct tabtype *ql_tabtype(struct queuelike *ql) { + static const struct tabtype ql_tabtype = { + ql_tab_properties_sensitive, + ql_tab_selectall_sensitive, + ql_tab_selectnone_sensitive, + ql_tab_properties_activate, + ql_tab_selectall_activate, + ql_tab_selectnone_activate, + 0, + 0 + }; + + struct tabtype *t = xmalloc(sizeof *t); + *t = ql_tabtype; + t->extra = ql; + return t; +} + /* Local Variables: c-basic-offset:2