X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/a0e78d9698411f5edc54f6aec0040cecfb3f9f65..ad424400849bde500f1236eb28edd5fb956ca600:/disobedience/choose-menu.c diff --git a/disobedience/choose-menu.c b/disobedience/choose-menu.c index 16aa593..61943d2 100644 --- a/disobedience/choose-menu.c +++ b/disobedience/choose-menu.c @@ -22,58 +22,21 @@ #include "popup.h" #include "choose.h" +static void choose_playchildren_callback(GtkTreeModel *model, + GtkTreePath *path, + GtkTreeIter *iter, + gpointer data); +static void choose_playchildren_received(void *v, + const char *err, + int nvec, char **vec); +static void choose_playchildren_played(void *v, const char *err); + /** @brief Popup menu */ static GtkWidget *choose_menu; /** @brief Path to directory pending a "select children" operation */ static GtkTreePath *choose_eventually_select_children; -/** @brief Recursion step for choose_get_visible() - * @param parent A visible node, or NULL for the root - * @param callback Called for each visible node - * @param userdata Passed to @p callback - * - * If @p callback returns nonzero, the walk stops immediately. - */ -static int choose_visible_recurse(GtkTreeIter *parent, - int (*callback)(GtkTreeIter *it, - int isfile, - void *userdata), - void *userdata) { - int expanded; - if(parent) { - /* Skip placeholders */ - if(choose_is_placeholder(parent)) - return 0; - const int isfile = choose_is_file(parent); - if(callback(parent, isfile, userdata)) - return 1; - if(isfile) - return 0; /* Files never have children */ - GtkTreePath *parent_path - = gtk_tree_model_get_path(GTK_TREE_MODEL(choose_store), - parent); - expanded = gtk_tree_view_row_expanded(GTK_TREE_VIEW(choose_view), - parent_path); - gtk_tree_path_free(parent_path); - } else - expanded = 1; - /* See if parent is expanded */ - if(expanded) { - /* Parent is expanded, visit all its children */ - GtkTreeIter it[1]; - gboolean itv = gtk_tree_model_iter_children(GTK_TREE_MODEL(choose_store), - it, - parent); - while(itv) { - if(choose_visible_recurse(it, callback, userdata)) - return TRUE; - itv = gtk_tree_model_iter_next(GTK_TREE_MODEL(choose_store), it); - } - } - return 0; -} - /** @brief Should edit->select all be sensitive? No, for the choose tab. */ static int choose_selectall_sensitive(void attribute((unused)) *extra) { return FALSE; @@ -167,7 +130,7 @@ static void choose_properties_activate(GtkMenuItem attribute((unused)) *item, gtk_tree_selection_selected_foreach(choose_selection, choose_gather_selected_files_callback, v); - properties(v->nvec, (const char **)v->vec); + properties(v->nvec, (const char **)v->vec, toplevel); } /** @brief Set sensitivity for select children @@ -256,6 +219,48 @@ static void choose_selectchildren_activate 0); } +/** @brief Play all children */ +static void choose_playchildren_activate + (GtkMenuItem attribute((unused)) *item, + gpointer attribute((unused)) userdata) { + /* Only one thing is selected */ + gtk_tree_selection_selected_foreach(choose_selection, + choose_playchildren_callback, + 0); +} + +static void choose_playchildren_callback(GtkTreeModel attribute((unused)) *model, + GtkTreePath *path, + GtkTreeIter *iter, + gpointer attribute((unused)) data) { + /* Find the children and play them */ + disorder_eclient_files(client, choose_playchildren_received, + choose_get_track(iter), + NULL/*re*/, + NULL); + /* Expand the node */ + gtk_tree_view_expand_row(GTK_TREE_VIEW(choose_view), path, FALSE); +} + +static void choose_playchildren_received(void attribute((unused)) *v, + const char *err, + int nvec, char **vec) { + if(err) { + popup_protocol_error(0, err); + return; + } + for(int n = 0; n < nvec; ++n) + disorder_eclient_play(client, vec[n], choose_playchildren_played, NULL); +} + +static void choose_playchildren_played(void attribute((unused)) *v, + const char *err) { + if(err) { + popup_protocol_error(0, err); + return; + } +} + /** @brief Pop-up menu for choose */ static struct menuitem choose_menuitems[] = { { @@ -279,6 +284,13 @@ static struct menuitem choose_menuitems[] = { 0, 0 }, + { + "Play children", + choose_playchildren_activate, + choose_selectchildren_sensitive, /* re-use */ + 0, + 0 + }, { "Deselect all tracks", choose_selectnone_activate,