From 34a197e3044b6abe8060e8ac6a0a5f7fcc480d9f Mon Sep 17 00:00:00 2001 From: Jehan Date: Tue, 28 May 2013 00:52:13 +0900 Subject: [PATCH] Bug 701090: allowing to reorder shell tabs by drag'n drop in single-window-mode. --- app/actions/windows-actions.c | 16 ++++++++++++++++ app/display/gimpimagewindow.c | 24 +++++++++++++++++++++++ app/menus/windows-menu.c | 36 +++++++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+) diff --git a/app/actions/windows-actions.c b/app/actions/windows-actions.c index 04ecbe4c0c..c486cac623 100644 --- a/app/actions/windows-actions.c +++ b/app/actions/windows-actions.c @@ -55,6 +55,10 @@ static void windows_actions_display_add (GimpContainer *conta static void windows_actions_display_remove (GimpContainer *container, GimpDisplay *display, GimpActionGroup *group); +static void windows_actions_display_reorder (GimpContainer *container, + GimpDisplay *display, + gint position, + GimpActionGroup *group); static void windows_actions_image_notify (GimpDisplay *display, const GParamSpec *unused, GimpActionGroup *group); @@ -148,6 +152,9 @@ windows_actions_setup (GimpActionGroup *group) g_signal_connect_object (group->gimp->displays, "remove", G_CALLBACK (windows_actions_display_remove), group, 0); + g_signal_connect_object (group->gimp->displays, "reorder", + G_CALLBACK (windows_actions_display_reorder), + group, 0); for (list = gimp_get_display_iter (group->gimp); list; @@ -254,6 +261,15 @@ windows_actions_display_remove (GimpContainer *container, windows_actions_update_display_accels (group); } +static void +windows_actions_display_reorder (GimpContainer *container, + GimpDisplay *display, + gint new_index, + GimpActionGroup *group) +{ + windows_actions_update_display_accels (group); +} + static void windows_actions_image_notify (GimpDisplay *display, const GParamSpec *unused, diff --git a/app/display/gimpimagewindow.c b/app/display/gimpimagewindow.c index ffec137ccb..a171010141 100644 --- a/app/display/gimpimagewindow.c +++ b/app/display/gimpimagewindow.c @@ -31,6 +31,7 @@ #include "core/gimpcontext.h" #include "core/gimpimage.h" #include "core/gimpprogress.h" +#include "core/gimpcontainer.h" #include "widgets/gimpactiongroup.h" #include "widgets/gimpdialogfactory.h" @@ -199,6 +200,10 @@ static void gimp_image_window_page_removed (GtkNotebook *not GtkWidget *widget, gint page_num, GimpImageWindow *window); +static void gimp_image_window_page_reordered (GtkNotebook *notebook, + GtkWidget *widget, + gint page_num, + GimpImageWindow *window); static void gimp_image_window_disconnect_from_active_shell (GimpImageWindow *window); @@ -412,6 +417,9 @@ gimp_image_window_constructed (GObject *object) g_signal_connect (private->notebook, "page-removed", G_CALLBACK (gimp_image_window_page_removed), window); + g_signal_connect (private->notebook, "page-reordered", + G_CALLBACK (gimp_image_window_page_reordered), + window); gtk_widget_show (private->notebook); /* Create the right dock columns widget */ @@ -1055,6 +1063,8 @@ gimp_image_window_add_shell (GimpImageWindow *window, gtk_notebook_append_page (GTK_NOTEBOOK (private->notebook), GTK_WIDGET (shell), tab_label); + gtk_notebook_set_tab_reorderable (GTK_NOTEBOOK (private->notebook), + GTK_WIDGET (shell), TRUE); gtk_widget_show (GTK_WIDGET (shell)); } @@ -1718,6 +1728,20 @@ gimp_image_window_page_removed (GtkNotebook *notebook, } } +static void +gimp_image_window_page_reordered (GtkNotebook *notebook, + GtkWidget *widget, + gint page_num, + GimpImageWindow *window) +{ + GimpImageWindowPrivate *private = GIMP_IMAGE_WINDOW_GET_PRIVATE (window); + GimpContainer *displays = private->gimp->displays; + + /* We need to reorder the displays as well in order to update the + * numbered accelerators (alt-1, alt-2, etc.). */ + gimp_container_reorder (displays, GIMP_OBJECT (GIMP_DISPLAY_SHELL (widget)->display), page_num); +} + static void gimp_image_window_disconnect_from_active_shell (GimpImageWindow *window) { diff --git a/app/menus/windows-menu.c b/app/menus/windows-menu.c index d0e587e9a9..ba1157df2a 100644 --- a/app/menus/windows-menu.c +++ b/app/menus/windows-menu.c @@ -54,6 +54,10 @@ static void windows_menu_display_add (GimpContainer *con static void windows_menu_display_remove (GimpContainer *container, GimpDisplay *display, GimpUIManager *manager); +static void windows_menu_display_reorder (GimpContainer *container, + GimpDisplay *display, + gint new_index, + GimpUIManager *manager); static void windows_menu_image_notify (GimpDisplay *display, const GParamSpec *unused, GimpUIManager *manager); @@ -96,6 +100,9 @@ windows_menu_setup (GimpUIManager *manager, g_signal_connect_object (manager->gimp->displays, "remove", G_CALLBACK (windows_menu_display_remove), manager, 0); + g_signal_connect_object (manager->gimp->displays, "reorder", + G_CALLBACK (windows_menu_display_reorder), + manager, 0); for (list = gimp_get_display_iter (manager->gimp); list; @@ -178,6 +185,35 @@ windows_menu_display_remove (GimpContainer *container, g_free (merge_key); } +static void +windows_menu_display_reorder (GimpContainer *container, + GimpDisplay *display, + gint new_index, + GimpUIManager *manager) +{ + gint n_display = gimp_container_get_n_children (container); + gint i; + + for (i = new_index; i < n_display; i++) + { + GimpObject *d = gimp_container_get_child_by_index (container, i); + + windows_menu_display_remove (container, GIMP_DISPLAY (d), manager); + } + + /* If I don't ensure the menu items are effectively removed, adding + * the same ones may simply cancel the effect of the removal, hence + * losing the menu reordering. */ + gtk_ui_manager_ensure_update (manager); + + for (i = new_index; i < n_display; i++) + { + GimpObject *d = gimp_container_get_child_by_index (container, i); + + windows_menu_display_add (container, GIMP_DISPLAY (d), manager); + } +} + static void windows_menu_image_notify (GimpDisplay *display, const GParamSpec *unused,