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

This commit is contained in:
Jehan 2013-05-28 00:52:13 +09:00
parent 11f8135b2c
commit 34a197e304
3 changed files with 76 additions and 0 deletions

View File

@ -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,

View File

@ -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)
{

View File

@ -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,