From 7d25d6e6bc224aa44647336dbe1a05afde99b3c0 Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Sun, 11 May 2008 08:15:00 +0000 Subject: [PATCH] app/actions/windows-commands.[ch] app/actions/windows-actions.c add 2008-05-11 Michael Natterer * app/actions/windows-commands.[ch] * app/actions/windows-actions.c * app/menus/windows-menu.c: add dynamic actions and menu items for all open docks. Present the dock when the menu item is selected. svn path=/trunk/; revision=25633 --- ChangeLog | 9 ++- app/actions/windows-actions.c | 115 ++++++++++++++++++++++++++++++--- app/actions/windows-commands.c | 9 +++ app/actions/windows-commands.h | 2 + app/menus/windows-menu.c | 103 +++++++++++++++++++++++++---- 5 files changed, 216 insertions(+), 22 deletions(-) diff --git a/ChangeLog b/ChangeLog index fd2741e18c..7474537cbd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2008-05-11 Michael Natterer + + * app/actions/windows-commands.[ch] + * app/actions/windows-actions.c + * app/menus/windows-menu.c: add dynamic actions and menu items for + all open docks. Present the dock when the menu item is selected. + 2008-05-10 Martin Nordholts * app/tools/gimprectangletool.c @@ -42,7 +49,7 @@ * app/widgets/gimpactiongroup.h: fix parameter name. -2008-05-10 DindinX +2008-05-10 DindinX * plug-ins/flame/cmap.c * plug-ins/flame/libifs.c diff --git a/app/actions/windows-actions.c b/app/actions/windows-actions.c index 1321a84f40..b2fd9fb1a3 100644 --- a/app/actions/windows-actions.c +++ b/app/actions/windows-actions.c @@ -32,25 +32,39 @@ #include "file/file-utils.h" #include "widgets/gimpactiongroup.h" +#include "widgets/gimpdialogfactory.h" +#include "widgets/gimpdock.h" #include "widgets/gimphelp-ids.h" #include "display/gimpdisplay.h" +#include "dialogs/dialogs.h" + #include "windows-actions.h" #include "windows-commands.h" #include "gimp-intl.h" -static void windows_actions_display_add (GimpContainer *container, - GimpDisplay *display, - GimpActionGroup *group); -static void windows_actions_display_remove (GimpContainer *container, - GimpDisplay *display, - GimpActionGroup *group); -static void windows_actions_image_notify (GimpDisplay *display, - const GParamSpec *unused, - GimpActionGroup *group); +static void windows_actions_display_add (GimpContainer *container, + GimpDisplay *display, + GimpActionGroup *group); +static void windows_actions_display_remove (GimpContainer *container, + GimpDisplay *display, + GimpActionGroup *group); +static void windows_actions_image_notify (GimpDisplay *display, + const GParamSpec *unused, + GimpActionGroup *group); + +static void windows_actions_dock_added (GimpDialogFactory *factory, + GimpDock *dock, + GimpActionGroup *group); +static void windows_actions_dock_removed (GimpDialogFactory *factory, + GimpDock *dock, + GimpActionGroup *group); +static void windows_actions_dock_notify (GimpDock *dock, + const GParamSpec *pspec, + GimpActionGroup *group); static const GimpActionEntry windows_actions[] = @@ -94,6 +108,23 @@ windows_actions_setup (GimpActionGroup *group) windows_actions_display_add (group->gimp->displays, display, group); } + + g_signal_connect_object (global_dock_factory, "dock-added", + G_CALLBACK (windows_actions_dock_added), + group, 0); + g_signal_connect_object (global_dock_factory, "dock-removed", + G_CALLBACK (windows_actions_dock_removed), + group, 0); + + for (list = global_dock_factory->open_dialogs; + list; + list = g_list_next (list)) + { + GimpDock *dock = list->data; + + if (GIMP_IS_DOCK (dock)) + windows_actions_dock_added (global_dock_factory, dock, group); + } } void @@ -207,3 +238,69 @@ windows_actions_image_notify (GimpDisplay *display, windows_actions_display_remove (group->gimp->displays, display, group); } } + +static void +windows_actions_dock_added (GimpDialogFactory *factory, + GimpDock *dock, + GimpActionGroup *group) +{ + GtkAction *action; + GimpActionEntry entry; + gchar *action_name = g_strdup_printf ("windows-dock-%04d", dock->ID); + + entry.name = action_name; + entry.stock_id = NULL; + entry.label = ""; + entry.accelerator = NULL; + entry.tooltip = NULL; + entry.callback = G_CALLBACK (windows_show_dock_cmd_callback); + entry.help_id = NULL; + + gimp_action_group_add_actions (group, &entry, 1); + + action = gtk_action_group_get_action (GTK_ACTION_GROUP (group), + action_name); + + g_object_set_data (G_OBJECT (action), "dock", dock); + + g_free (action_name); + + g_signal_connect_object (dock, "notify::title", + G_CALLBACK (windows_actions_dock_notify), + group, 0); + + if (gtk_window_get_title (GTK_WINDOW (dock))) + windows_actions_dock_notify (dock, NULL, group); +} + +static void +windows_actions_dock_removed (GimpDialogFactory *factory, + GimpDock *dock, + GimpActionGroup *group) +{ + GtkAction *action; + gchar *action_name = g_strdup_printf ("windows-dock-%04d", dock->ID); + + action = gtk_action_group_get_action (GTK_ACTION_GROUP (group), action_name); + + if (action) + gtk_action_group_remove_action (GTK_ACTION_GROUP (group), action); + + g_free (action_name); +} + +static void +windows_actions_dock_notify (GimpDock *dock, + const GParamSpec *pspec, + GimpActionGroup *group) +{ + GtkAction *action; + gchar *action_name = g_strdup_printf ("windows-dock-%04d", dock->ID); + + action = gtk_action_group_get_action (GTK_ACTION_GROUP (group), action_name); + + if (action) + g_object_set (action, + "label", gtk_window_get_title (GTK_WINDOW (dock)), + NULL); +} diff --git a/app/actions/windows-commands.c b/app/actions/windows-commands.c index d9e70deb57..d92bb1bcdf 100644 --- a/app/actions/windows-commands.c +++ b/app/actions/windows-commands.c @@ -51,6 +51,15 @@ windows_show_display_cmd_callback (GtkAction *action, gtk_window_present (GTK_WINDOW (display->shell)); } +void +windows_show_dock_cmd_callback (GtkAction *action, + gpointer data) +{ + GtkWindow *dock = g_object_get_data (G_OBJECT (action), "dock"); + + gtk_window_present (dock); +} + void windows_show_toolbox (void) { diff --git a/app/actions/windows-commands.h b/app/actions/windows-commands.h index 2266af0f4b..2114973f2e 100644 --- a/app/actions/windows-commands.h +++ b/app/actions/windows-commands.h @@ -24,6 +24,8 @@ void windows_show_toolbox_cmd_callback (GtkAction *action, gpointer data); void windows_show_display_cmd_callback (GtkAction *action, gpointer data); +void windows_show_dock_cmd_callback (GtkAction *action, + gpointer data); void windows_show_toolbox (void); diff --git a/app/menus/windows-menu.c b/app/menus/windows-menu.c index dfa1eaa952..2863ec842b 100644 --- a/app/menus/windows-menu.c +++ b/app/menus/windows-menu.c @@ -31,22 +31,33 @@ #include "core/gimpviewable.h" #include "widgets/gimpaction.h" +#include "widgets/gimpdialogfactory.h" +#include "widgets/gimpdock.h" #include "widgets/gimpuimanager.h" #include "display/gimpdisplay.h" +#include "dialogs/dialogs.h" + #include "windows-menu.h" -static void windows_menu_display_add (GimpContainer *container, - GimpDisplay *display, - GimpUIManager *manager); -static void windows_menu_display_remove (GimpContainer *container, - GimpDisplay *display, - GimpUIManager *manager); -static void windows_menu_image_notify (GimpDisplay *display, - const GParamSpec *unused, - GimpUIManager *manager); +static void windows_menu_display_add (GimpContainer *container, + GimpDisplay *display, + GimpUIManager *manager); +static void windows_menu_display_remove (GimpContainer *container, + GimpDisplay *display, + GimpUIManager *manager); +static void windows_menu_image_notify (GimpDisplay *display, + const GParamSpec *unused, + GimpUIManager *manager); + +static void windows_menu_dock_added (GimpDialogFactory *factory, + GimpDock *dock, + GimpUIManager *manager); +static void windows_menu_dock_removed (GimpDialogFactory *factory, + GimpDock *dock, + GimpUIManager *manager); void @@ -58,6 +69,9 @@ windows_menu_setup (GimpUIManager *manager, g_return_if_fail (GIMP_IS_UI_MANAGER (manager)); g_return_if_fail (ui_path != NULL); + g_object_set_data (G_OBJECT (manager), "image-menu-ui-path", + (gpointer) ui_path); + g_signal_connect_object (manager->gimp->displays, "add", G_CALLBACK (windows_menu_display_add), manager, 0); @@ -65,9 +79,6 @@ windows_menu_setup (GimpUIManager *manager, G_CALLBACK (windows_menu_display_remove), manager, 0); - g_object_set_data (G_OBJECT (manager), "image-menu-ui-path", - (gpointer) ui_path); - for (list = GIMP_LIST (manager->gimp->displays)->list; list; list = g_list_next (list)) @@ -76,6 +87,23 @@ windows_menu_setup (GimpUIManager *manager, windows_menu_display_add (manager->gimp->displays, display, manager); } + + g_signal_connect_object (global_dock_factory, "dock-added", + G_CALLBACK (windows_menu_dock_added), + manager, 0); + g_signal_connect_object (global_dock_factory, "dock-removed", + G_CALLBACK (windows_menu_dock_removed), + manager, 0); + + for (list = global_dock_factory->open_dialogs; + list; + list = g_list_next (list)) + { + GimpDock *dock = list->data; + + if (GIMP_IS_DOCK (dock)) + windows_menu_dock_added (global_dock_factory, dock, manager); + } } @@ -161,3 +189,54 @@ windows_menu_image_notify (GimpDisplay *display, windows_menu_display_remove (manager->gimp->displays, display, manager); } } + +static void +windows_menu_dock_added (GimpDialogFactory *factory, + GimpDock *dock, + GimpUIManager *manager) +{ + const gchar *ui_path; + gchar *action_name; + gchar *action_path; + gchar *merge_key; + guint merge_id; + + ui_path = g_object_get_data (G_OBJECT (manager), "image-menu-ui-path"); + + action_name = g_strdup_printf ("windows-dock-%04d", dock->ID); + action_path = g_strdup_printf ("%s/Windows/Docks/Docks", ui_path); + + merge_key = g_strdup_printf ("windows-dock-%04d-merge-id", dock->ID); + merge_id = gtk_ui_manager_new_merge_id (GTK_UI_MANAGER (manager)); + + g_object_set_data (G_OBJECT (manager), merge_key, + GUINT_TO_POINTER (merge_id)); + + gtk_ui_manager_add_ui (GTK_UI_MANAGER (manager), merge_id, + action_path, action_name, action_name, + GTK_UI_MANAGER_MENUITEM, + FALSE); + + g_free (merge_key); + g_free (action_path); + g_free (action_name); +} + +static void +windows_menu_dock_removed (GimpDialogFactory *factory, + GimpDock *dock, + GimpUIManager *manager) +{ + gchar *merge_key = g_strdup_printf ("windows-dock-%04d-merge-id", dock->ID); + guint merge_id; + + merge_id = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (manager), + merge_key)); + + if (merge_id) + gtk_ui_manager_remove_ui (GTK_UI_MANAGER (manager), merge_id); + + g_object_set_data (G_OBJECT (manager), merge_key, NULL); + + g_free (merge_key); +}