diff options
author | waker <wakeroid@gmail.com> | 2013-07-11 19:14:27 +0200 |
---|---|---|
committer | waker <wakeroid@gmail.com> | 2013-07-11 19:14:27 +0200 |
commit | aa460609c68f8b10179a1c6a968911c343653f47 (patch) | |
tree | 6e5016c4bc93b601098edba750b8c97881f159ef /plugins/gtkui/ddbtabstrip.c | |
parent | a20a3b8e0e7e83709756ddc518f968f2c879d36a (diff) |
gtkui: added API for creating playlist context menu
Diffstat (limited to 'plugins/gtkui/ddbtabstrip.c')
-rw-r--r-- | plugins/gtkui/ddbtabstrip.c | 260 |
1 files changed, 1 insertions, 259 deletions
diff --git a/plugins/gtkui/ddbtabstrip.c b/plugins/gtkui/ddbtabstrip.c index 1022d87b..5b54c78d 100644 --- a/plugins/gtkui/ddbtabstrip.c +++ b/plugins/gtkui/ddbtabstrip.c @@ -42,21 +42,6 @@ extern GtkWidget *theme_button; #define arrow_sz 10 #define arrow_widget_width (arrow_sz+4) -void -plt_get_title_wrapper (int plt, char *buffer, int len) { - if (plt == -1) { - strcpy (buffer, ""); - return; - } - ddb_playlist_t *p = deadbeef->plt_get_for_idx (plt); - deadbeef->plt_get_title (p, buffer, len); - deadbeef->plt_unref (p); - char *end; - if (!g_utf8_validate (buffer, -1, (const gchar **)&end)) { - *end = 0; - } -} - static void ddb_tabstrip_send_configure (DdbTabStrip *darea) { @@ -843,249 +828,6 @@ get_tab_under_cursor (DdbTabStrip *ts, int x) { return -1; } -void -on_rename_playlist1_activate (GtkMenuItem *menuitem, - gpointer user_data) -{ - GtkWidget *dlg = create_entrydialog (); - gtk_dialog_set_default_response (GTK_DIALOG (dlg), GTK_RESPONSE_OK); - gtk_window_set_title (GTK_WINDOW (dlg), _("Edit playlist")); - GtkWidget *e; - e = lookup_widget (dlg, "title_label"); - gtk_label_set_text (GTK_LABEL(e), _("Title:")); - e = lookup_widget (dlg, "title"); - char t[1000]; - plt_get_title_wrapper (tab_clicked, t, sizeof (t)); - gtk_entry_set_text (GTK_ENTRY (e), t); - int res = gtk_dialog_run (GTK_DIALOG (dlg)); - if (res == GTK_RESPONSE_OK) { - const char *text = gtk_entry_get_text (GTK_ENTRY (e)); - deadbeef->pl_lock (); - ddb_playlist_t *p = deadbeef->plt_get_for_idx (tab_clicked); - deadbeef->plt_set_title (p, text); - deadbeef->plt_unref (p); - deadbeef->pl_unlock (); - } - gtk_widget_destroy (dlg); -} - - -void -on_remove_playlist1_activate (GtkMenuItem *menuitem, - gpointer user_data) -{ - if (tab_clicked != -1) { - deadbeef->plt_remove (tab_clicked); - search_refresh (); - int playlist = deadbeef->plt_get_curr_idx (); - deadbeef->conf_set_int ("playlist.current", playlist); - } -} - -void -on_add_new_playlist1_activate (GtkMenuItem *menuitem, - gpointer user_data) -{ - int playlist = gtkui_add_new_playlist (); - if (playlist != -1) { - gtkui_playlist_set_curr (playlist); - } -} - -static void -on_actionitem_activate (GtkMenuItem *menuitem, - DB_plugin_action_t *action) -{ - if (action->flags & DB_ACTION_USING_API_14) { - ddb_playlist_t *plt = NULL; - if (tab_clicked != -1) { - plt = deadbeef->plt_get_for_idx (tab_clicked); - } - typedef int (*action_callback_14_t)(struct DB_plugin_action_s *action, void *userdata); - ((action_callback_14_t)action->callback) (action, plt); - if (plt) { - deadbeef->plt_unref (plt); - } - } - else { - action->callback (action, DDB_ACTION_CTX_PLAYLIST); - } -} - -static GtkWidget* -find_popup (GtkWidget *widget, - const gchar *widget_name) -{ - GtkWidget *parent, *found_widget; - - for (;;) - { - if (GTK_IS_MENU (widget)) - parent = gtk_menu_get_attach_widget (GTK_MENU (widget)); - else - parent = gtk_widget_get_parent (widget); - if (!parent) - parent = (GtkWidget*) g_object_get_data (G_OBJECT (widget), "GladeParentKey"); - if (parent == NULL) - break; - widget = parent; - } - - found_widget = (GtkWidget*) g_object_get_data (G_OBJECT (widget), - widget_name); - return found_widget; -} - -void -add_tab_actions (GtkWidget *menu) { - DB_plugin_t **plugins = deadbeef->plug_get_list(); - int i; - - int added_entries = 0; - for (i = 0; plugins[i]; i++) - { - if (!plugins[i]->get_actions) - continue; - - DB_plugin_action_t *actions = plugins[i]->get_actions (NULL); - DB_plugin_action_t *action; - - int count = 0; - for (action = actions; action; action = action->next) - { - char *tmp = NULL; - if (!(action->flags & DB_ACTION_MULTIPLE_TRACKS)) - continue; - - // create submenus (separated with '/') - const char *prev = action->title; - while (*prev && *prev == '/') { - prev++; - } - - GtkWidget *popup = NULL; - - for (;;) { - const char *slash = strchr (prev, '/'); - if (slash && *(slash-1) != '\\') { - char name[slash-prev+1]; - // replace \/ with / - const char *p = prev; - char *t = name; - while (*p && p < slash) { - if (*p == '\\' && *(p+1) == '/') { - *t++ = '/'; - p += 2; - } - else { - *t++ = *p++; - } - } - *t = 0; - - // add popup - GtkWidget *prev_menu = popup ? popup : menu; - - popup = find_popup (prev_menu, name); - if (!popup) { - GtkWidget *item = gtk_image_menu_item_new_with_mnemonic (_(name)); - gtk_widget_show (item); - gtk_container_add (GTK_CONTAINER (prev_menu), item); - popup = gtk_menu_new (); - //HOOKUP_OBJECT (prev_menu, popup, name); - gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), popup); - } - } - else { - break; - } - prev = slash+1; - } - - - count++; - added_entries++; - GtkWidget *actionitem; - - // replace \/ with / - const char *p = popup ? prev : action->title; - char title[strlen (p)+1]; - char *t = title; - while (*p) { - if (*p == '\\' && *(p+1) == '/') { - *t++ = '/'; - p += 2; - } - else { - *t++ = *p++; - } - } - *t = 0; - - actionitem = gtk_menu_item_new_with_mnemonic (_(title)); - gtk_widget_show (actionitem); - gtk_container_add (popup ? GTK_CONTAINER (popup) : GTK_CONTAINER (menu), actionitem); - - g_signal_connect ((gpointer) actionitem, "activate", - G_CALLBACK (on_actionitem_activate), - action); - } - } -} - -GtkWidget* -create_plmenu (void) -{ - GtkWidget *plmenu; - GtkWidget *rename_playlist1; - GtkWidget *remove_playlist1; - GtkWidget *add_new_playlist1; - GtkWidget *separator11; - GtkWidget *load_playlist1; - GtkWidget *save_playlist1; - GtkWidget *save_all_playlists1; - - plmenu = gtk_menu_new (); - - rename_playlist1 = gtk_menu_item_new_with_mnemonic (_("Rename Playlist")); - if (tab_clicked == -1) { - gtk_widget_set_sensitive (rename_playlist1, FALSE); - } - gtk_widget_show (rename_playlist1); - gtk_container_add (GTK_CONTAINER (plmenu), rename_playlist1); - - remove_playlist1 = gtk_menu_item_new_with_mnemonic (_("Remove Playlist")); - if (tab_clicked == -1) { - gtk_widget_set_sensitive (remove_playlist1, FALSE); - } - gtk_widget_show (remove_playlist1); - gtk_container_add (GTK_CONTAINER (plmenu), remove_playlist1); - - add_new_playlist1 = gtk_menu_item_new_with_mnemonic (_("Add New Playlist")); - gtk_widget_show (add_new_playlist1); - gtk_container_add (GTK_CONTAINER (plmenu), add_new_playlist1); - - g_signal_connect ((gpointer) rename_playlist1, "activate", - G_CALLBACK (on_rename_playlist1_activate), - NULL); - g_signal_connect ((gpointer) remove_playlist1, "activate", - G_CALLBACK (on_remove_playlist1_activate), - NULL); - g_signal_connect ((gpointer) add_new_playlist1, "activate", - G_CALLBACK (on_add_new_playlist1_activate), - NULL); - - /* Store pointers to all widgets, for use by lookup_widget(). */ - GLADE_HOOKUP_OBJECT_NO_REF (plmenu, plmenu, "plmenu"); - GLADE_HOOKUP_OBJECT (plmenu, rename_playlist1, "rename_playlist1"); - GLADE_HOOKUP_OBJECT (plmenu, remove_playlist1, "remove_playlist1"); - GLADE_HOOKUP_OBJECT (plmenu, add_new_playlist1, "add_new_playlist1"); - - add_tab_actions (plmenu); - - return plmenu; -} - static void tabstrip_scroll_left (DdbTabStrip *ts) { int tab = deadbeef->plt_get_curr_idx (); @@ -1206,7 +948,7 @@ on_tabstrip_button_press_event(GtkWidget *widget, tab_moved = 0; } else if (event->button == 3) { - GtkWidget *menu = create_plmenu (); + GtkWidget *menu = gtkui_create_pltmenu (tab_clicked); gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, widget, 0, gtk_get_current_event_time()); } else if (event->button == 2) { |