[gimp] Bug 701090: allowing to reorder shell tabs by drag'n drop in single-window-mode.



commit 34a197e3044b6abe8060e8ac6a0a5f7fcc480d9f
Author: Jehan <jehan girinstud io>
Date:   Tue May 28 00:52:13 2013 +0900

    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(+), 0 deletions(-)
---
diff --git a/app/actions/windows-actions.c b/app/actions/windows-actions.c
index 04ecbe4..c486cac 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;
@@ -255,6 +262,15 @@ windows_actions_display_remove (GimpContainer   *container,
 }
 
 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,
                               GimpActionGroup  *group)
diff --git a/app/display/gimpimagewindow.c b/app/display/gimpimagewindow.c
index ffec137..a171010 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));
 }
@@ -1719,6 +1729,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)
 {
   GimpImageWindowPrivate *private        = GIMP_IMAGE_WINDOW_GET_PRIVATE (window);
diff --git a/app/menus/windows-menu.c b/app/menus/windows-menu.c
index d0e587e..ba1157d 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;
@@ -179,6 +186,35 @@ windows_menu_display_remove (GimpContainer *container,
 }
 
 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,
                            GimpUIManager    *manager)


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]