X-Git-Url: https://git.distorted.org.uk/~mdw/disorder/blobdiff_plain/f3924b9b218853c267af1c8b61b4b02a45e3e80a..fc36ecb7248f60d2dfc1736ccaeb93d57da57f01:/disobedience/menu.c diff --git a/disobedience/menu.c b/disobedience/menu.c index 142857c..63d89be 100644 --- a/disobedience/menu.c +++ b/disobedience/menu.c @@ -26,6 +26,8 @@ static GtkWidget *selectall_widget; static GtkWidget *selectnone_widget; static GtkWidget *properties_widget; +static GtkWidget *playlists_widget; +static GtkWidget *playlists_menu; /** @brief Main menu widgets */ GtkItemFactory *mainmenufactory; @@ -115,7 +117,7 @@ static void edit_menu_show(GtkWidget attribute((unused)) *widget, && t->selectnone_sensitive(t->extra)); } } - + /** @brief Fetch version in order to display the about... popup */ static void about_popup(gpointer attribute((unused)) callback_data, guint attribute((unused)) callback_action, @@ -215,6 +217,41 @@ static void menu_rights_changed(const char attribute((unused)) *event, users_set_sensitive(!!(last_rights & RIGHT_ADMIN)); } +/** @brief Called to activate a playlist */ +static void menu_activate_playlist(GtkMenuItem *menuitem, + gpointer attribute((unused)) user_data) { + GtkLabel *label = GTK_LABEL(GTK_BIN(menuitem)->child); + const char *playlist = gtk_label_get_text(label); + + fprintf(stderr, "activate playlist %s\n", playlist); /* TODO */ +} + +/** @brief Called when the playlists change */ +static void menu_playlists_changed(const char attribute((unused)) *event, + void attribute((unused)) *eventdata, + void attribute((unused)) *callbackdata) { + GtkMenuShell *menu = GTK_MENU_SHELL(playlists_menu); + /* TODO: we could be more sophisticated and only insert/remove widgets as + * needed. For now that's too much effort. */ + while(menu->children) + gtk_container_remove(GTK_CONTAINER(menu), GTK_WIDGET(menu->children->data)); + /* NB nplaylists can be -1 as well as 0 */ + for(int n = 0; n < nplaylists; ++n) { + GtkWidget *w = gtk_menu_item_new_with_label(playlists[n]); + g_signal_connect(w, "activate", G_CALLBACK(menu_activate_playlist), 0); + gtk_widget_show(w); + gtk_menu_shell_append(menu, w); + } + gtk_widget_set_sensitive(playlists_widget, + nplaylists > 0); +} + +static void edit_playlists(gpointer attribute((unused)) callback_data, + guint attribute((unused)) callback_action, + GtkWidget attribute((unused)) *menu_item) { + fprintf(stderr, "edit playlists\n"); /* TODO */ +} + /** @brief Create the menu bar widget */ GtkWidget *menubar(GtkWidget *w) { GtkWidget *m; @@ -295,6 +332,15 @@ GtkWidget *menubar(GtkWidget *w) { 0, /* item_type */ 0 /* extra_data */ }, + { + (char *)"/Edit/Edit playlists", /* path */ + 0, /* accelerator */ + edit_playlists, /* callback */ + 0, /* callback_action */ + 0, /* item_type */ + 0 /* extra_data */ + }, + { (char *)"/Control", /* path */ @@ -336,6 +382,14 @@ GtkWidget *menubar(GtkWidget *w) { (char *)"", /* item_type */ 0 /* extra_data */ }, + { + (char *)"/Control/Activate playlist", /* path */ + 0, /* accelerator */ + 0, /* callback */ + 0, /* callback_action */ + (char *)"", /* item_type */ + 0 /* extra_data */ + }, { (char *)"/Help", /* path */ @@ -380,16 +434,22 @@ GtkWidget *menubar(GtkWidget *w) { "/Edit/Deselect all tracks"); properties_widget = gtk_item_factory_get_widget(mainmenufactory, "/Edit/Track properties"); + playlists_widget = gtk_item_factory_get_item(mainmenufactory, + "/Control/Activate playlist"); + playlists_menu = gtk_item_factory_get_widget(mainmenufactory, + "/Control/Activate playlist"); assert(selectall_widget != 0); assert(selectnone_widget != 0); assert(properties_widget != 0); + assert(playlists_widget != 0); + assert(playlists_menu != 0); - GtkWidget *edit_widget = gtk_item_factory_get_widget(mainmenufactory, "/Edit"); g_signal_connect(edit_widget, "show", G_CALLBACK(edit_menu_show), 0); - + event_register("rights-changed", menu_rights_changed, 0); + event_register("playlists-updated", menu_playlists_changed, 0); users_set_sensitive(0); m = gtk_item_factory_get_widget(mainmenufactory, "");