diff options
author | waker <wakeroid@gmail.com> | 2012-01-22 16:00:54 +0100 |
---|---|---|
committer | waker <wakeroid@gmail.com> | 2012-01-22 16:00:54 +0100 |
commit | dc3a3b052b3ad22587e0bd5fc7f99c8a05dd7bab (patch) | |
tree | 8932294088db9ef164c2c4b809fbdf4656c80b09 /plugins/gtkui/ddbtabstrip.c | |
parent | 9f6582c6480d9fcdc52abd34ea952a7af8ba1914 (diff) |
added possibility to put additional menu items to playlist context menu (using plugin actions)
Diffstat (limited to 'plugins/gtkui/ddbtabstrip.c')
-rw-r--r-- | plugins/gtkui/ddbtabstrip.c | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/plugins/gtkui/ddbtabstrip.c b/plugins/gtkui/ddbtabstrip.c index 791409e2..73131441 100644 --- a/plugins/gtkui/ddbtabstrip.c +++ b/plugins/gtkui/ddbtabstrip.c @@ -20,6 +20,7 @@ #include <string.h> #include <assert.h> #include <glib.h> +#include <stdlib.h> #include "ddbtabstrip.h" #include "drawing.h" #include "gtkui.h" @@ -797,6 +798,139 @@ on_add_new_playlist1_activate (GtkMenuItem *menuitem, } } +static void +on_actionitem_activate (GtkMenuItem *menuitem, + DB_plugin_action_t *action) +{ + ddb_playlist_t *plt = NULL; + if (tab_clicked != -1) { + plt = deadbeef->plt_get_for_idx (tab_clicked); + } + action->callback (action, plt); + deadbeef->plt_unref (plt); +} + +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_PLAYLIST)) + 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) { @@ -845,6 +979,8 @@ create_plmenu (void) GLADE_HOOKUP_OBJECT (plmenu, remove_playlist1, "remove_playlist1"); GLADE_HOOKUP_OBJECT (plmenu, add_new_playlist1, "add_new_playlist1"); + add_tab_actions (plmenu); + return plmenu; } |