X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/e7eb3a2744aa45179daea235800753d3d1955338..05fd0aa117566503026dbedfe4d9b0485da2d5ed:/disobedience/queue-menu.c diff --git a/disobedience/queue-menu.c b/disobedience/queue-menu.c index 7ccee6c..faf16cd 100644 --- a/disobedience/queue-menu.c +++ b/disobedience/queue-menu.c @@ -15,6 +15,9 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +/** @file disobedience/queue-menu.c + * @brief Disobedience queue widget popup menu + */ #include "disobedience.h" #include "popup.h" #include "queue-generic.h" @@ -68,7 +71,7 @@ void ql_properties_activate(GtkMenuItem attribute((unused)) *menuitem, gtk_tree_model_iter_next(GTK_TREE_MODEL(ql->store), iter); } if(v->nvec) - properties(v->nvec, (const char **)v->vec); + properties(v->nvec, (const char **)v->vec, ql->view); } /* Scratch */ @@ -126,7 +129,7 @@ static void ql_remove_activate_callback(GtkTreeModel *model, struct queue_entry *q = ql_iter_to_q(model, iter); if(q != playing_track) - disorder_eclient_remove(client, q->id, ql_remove_completed, q); + disorder_eclient_remove(client, ql_remove_completed, q->id, q); } void ql_remove_activate(GtkMenuItem attribute((unused)) *menuitem, @@ -145,7 +148,8 @@ int ql_play_sensitive(void *extra) { && gtk_tree_selection_count_selected_rows(ql->selection) > 0; } -static void ql_play_completed(void attribute((unused)) *v, const char *err) { +static void ql_play_completed(void attribute((unused)) *v, const char *err, + const char attribute((unused)) *id) { if(err) popup_protocol_error(0, err); } @@ -156,7 +160,7 @@ static void ql_play_activate_callback(GtkTreeModel *model, gpointer attribute((unused)) data) { struct queue_entry *q = ql_iter_to_q(model, iter); - disorder_eclient_play(client, q->track, ql_play_completed, q); + disorder_eclient_play(client, ql_play_completed, q->track, q); } void ql_play_activate(GtkMenuItem attribute((unused)) *menuitem, @@ -184,6 +188,64 @@ gboolean ql_button_release(GtkWidget *widget, return FALSE; } +/* Adopt */ + +static void ql_adopt_sensitive_callback(GtkTreeModel *model, + GtkTreePath attribute((unused)) *path, + GtkTreeIter *iter, + gpointer data) { + struct queue_entry *const q = ql_iter_to_q(model, iter); + int *const count = data; + + if(*count < 0) + return; + if(q->origin == origin_random) + ++*count; + else + *count = -1; +} + +/** @brief Determine whether we're pointing at an adoptable track */ +int ql_adopt_sensitive(void *extra) { + struct queuelike *ql = extra; + int count = 0; + + /* We'll need RIGHT_PLAY */ + if(!(last_rights & RIGHT_PLAY)) + return FALSE; + /* Check that (1) only random tracks are selected (2) at least something is + * selected */ + gtk_tree_selection_selected_foreach(ql->selection, + ql_adopt_sensitive_callback, + &count); + if(count <= 0) + return FALSE; + return TRUE; +} + +static void ql_adopt_completed(void attribute((unused)) *v, const char *err) { + if(err) + popup_protocol_error(0, err); +} + +static void ql_adopt_activate_callback(GtkTreeModel *model, + GtkTreePath attribute((unused)) *path, + GtkTreeIter *iter, + gpointer attribute((unused)) data) { + struct queue_entry *const q = ql_iter_to_q(model, iter); + + disorder_eclient_adopt(client, ql_adopt_completed, q->id, q); +} + +/** @brief Called to adopt a track */ +void ql_adopt_activate(GtkMenuItem attribute((unused)) *menuitem, + gpointer user_data) { + struct queuelike *ql = user_data; + gtk_tree_selection_selected_foreach(ql->selection, + ql_adopt_activate_callback, + NULL); +} + struct tabtype *ql_tabtype(struct queuelike *ql) { static const struct tabtype queuelike_tabtype = { ql_properties_sensitive,