X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/ee7552f86d9438d415cbe61fd897e5c768f4f1a4..54156c626b7377cd012b1de85679801d59da8a09:/disobedience/queue-menu.c diff --git a/disobedience/queue-menu.c b/disobedience/queue-menu.c index 5254871..ac3479a 100644 --- a/disobedience/queue-menu.c +++ b/disobedience/queue-menu.c @@ -72,37 +72,95 @@ void ql_properties_activate(GtkMenuItem attribute((unused)) *menuitem, /* Scratch */ int ql_scratch_sensitive(struct queuelike attribute((unused)) *ql) { - return !!playing_track; + return !!(last_state & DISORDER_PLAYING) + && right_scratchable(last_rights, config->username, playing_track); +} + +static void ql_scratch_completed(void attribute((unused)) *v, + const char *error) { + if(error) + popup_protocol_error(0, error); } void ql_scratch_activate(GtkMenuItem attribute((unused)) *menuitem, gpointer attribute((unused)) user_data) { - /* TODO */ + disorder_eclient_scratch_playing(client, ql_scratch_completed, 0); } /* Remove */ +static void ql_remove_sensitive_callback(GtkTreeModel *model, + GtkTreePath attribute((unused)) *path, + GtkTreeIter *iter, + gpointer data) { + struct queue_entry *q = ql_iter_to_q(model, 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, + ql_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 ql_remove_completed(void attribute((unused)) *v, + const char *error) { + if(error) + popup_protocol_error(0, error); +} + +static void ql_remove_activate_callback(GtkTreeModel *model, + GtkTreePath attribute((unused)) *path, + GtkTreeIter *iter, + gpointer attribute((unused)) data) { + struct queue_entry *q = ql_iter_to_q(model, iter); + + disorder_eclient_remove(client, q->id, ql_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, + ql_remove_activate_callback, + 0); } /* Play */ int ql_play_sensitive(struct queuelike *ql) { - return gtk_tree_selection_count_selected_rows(ql->selection) > 0; + return (last_rights & RIGHT_PLAY) + && gtk_tree_selection_count_selected_rows(ql->selection) > 0; } -void ql_play_activate(GtkMenuItem attribute((unused)) *menuitem, - gpointer attribute((unused)) user_data) { - /* TODO */ +static void ql_play_completed(void attribute((unused)) *v, const char *error) { + if(error) + popup_protocol_error(0, error); +} + +static void ql_play_activate_callback(GtkTreeModel *model, + GtkTreePath attribute((unused)) *path, + GtkTreeIter *iter, + gpointer attribute((unused)) data) { + struct queue_entry *q = ql_iter_to_q(model, iter); + + disorder_eclient_play(client, q->track, ql_play_completed, q); } +void ql_play_activate(GtkMenuItem attribute((unused)) *menuitem, + gpointer user_data) { + struct queuelike *ql = user_data; + gtk_tree_selection_selected_foreach(ql->selection, + ql_play_activate_callback, + 0); +} /** @brief Create @c ql->menu if it does not already exist */ static void ql_create_menu(struct queuelike *ql) { @@ -200,10 +258,9 @@ struct tabtype *ql_tabtype(struct queuelike *ql) { 0 }; - struct tabtype *t = xmalloc(sizeof *t); - *t = ql_tabtype; - t->extra = ql; - return t; + ql->tabtype = ql_tabtype; + ql->tabtype.extra = ql; + return &ql->tabtype; } /*