[gimp] app: Handle special case "Toolbox" in GimpSingleWindowStrategy
- From: Martin Nordholts <martinn src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] app: Handle special case "Toolbox" in GimpSingleWindowStrategy
- Date: Sat, 30 Jul 2011 16:24:20 +0000 (UTC)
commit 3ce4c49314210f993f4fba47d8b1e6c0e9a403cb
Author: Martin Nordholts <martinn src gnome org>
Date: Wed Jul 20 16:31:12 2011 +0200
app: Handle special case "Toolbox" in GimpSingleWindowStrategy
The special case isn't pretty, but the current design can't handle it
nicely. This is not the first special case for the toolbox.
app/actions/dialogs-actions.c | 40 +++++++++++++++----
app/display/gimpimagewindow.c | 36 ++++++++++++++++++
app/display/gimpimagewindow.h | 2 +
app/display/gimpsinglewindowstrategy.c | 64 +++++++++++++++++++++++--------
4 files changed, 116 insertions(+), 26 deletions(-)
---
diff --git a/app/actions/dialogs-actions.c b/app/actions/dialogs-actions.c
index 532a7e4..5d0eb19 100644
--- a/app/actions/dialogs-actions.c
+++ b/app/actions/dialogs-actions.c
@@ -23,19 +23,24 @@
#include "actions-types.h"
+#include "core/gimp.h"
+
#include "widgets/gimpactiongroup.h"
#include "widgets/gimpdialogfactory.h"
#include "widgets/gimphelp-ids.h"
#include "widgets/gimpsessioninfo.h"
#include "widgets/gimptoolbox.h"
+#include "display/gimpimagewindow.h"
+
+#include "actions.h"
#include "dialogs-actions.h"
#include "dialogs-commands.h"
#include "gimp-intl.h"
-static gboolean dialogs_actions_toolbox_exists (void);
+static gboolean dialogs_actions_toolbox_exists (Gimp *gimp);
const GimpStringActionEntry dialogs_dockable_actions[] =
@@ -264,18 +269,34 @@ static const GimpStringActionEntry dialogs_toplevel_actions[] =
static gboolean
-dialogs_actions_toolbox_exists (void)
+dialogs_actions_toolbox_exists (Gimp *gimp)
{
- GimpDialogFactory *factory = gimp_dialog_factory_get_singleton ();
- GtkWidget *widget = NULL;
- GimpSessionInfo *info = NULL;
+ GimpDialogFactory *factory = gimp_dialog_factory_get_singleton ();
+ GimpSessionInfo *info = NULL;
+ GList *windows = gimp ? gimp_get_image_windows (gimp) : NULL;
+ gboolean toolbox_found = FALSE;
+ GList *iter;
+ /* First look in session managed windows */
info = gimp_dialog_factory_find_session_info (factory, "gimp-toolbox-window");
+ toolbox_found = info && gimp_session_info_get_widget (info);
- if (info)
- widget = gimp_session_info_get_widget (info);
+ /* Then in image windows */
+ if (! toolbox_found)
+ {
+ for (iter = windows; iter; iter = g_list_next (iter))
+ {
+ GimpImageWindow *window = GIMP_IMAGE_WINDOW (windows->data);
+
+ if (gimp_image_window_has_toolbox (window))
+ {
+ toolbox_found = TRUE;
+ break;
+ }
+ }
+ }
- return widget != NULL;
+ return toolbox_found;
}
void
@@ -296,10 +317,11 @@ void
dialogs_actions_update (GimpActionGroup *group,
gpointer data)
{
+ Gimp *gimp = action_data_get_gimp (data);
const gchar *toolbox_label = NULL;
const gchar *toolbox_tooltip = NULL;
- if (dialogs_actions_toolbox_exists ())
+ if (dialogs_actions_toolbox_exists (gimp))
{
toolbox_label = _("Toolbox");
toolbox_tooltip = _("Raise the toolbox");
diff --git a/app/display/gimpimagewindow.c b/app/display/gimpimagewindow.c
index e5a9460..319dd3e 100644
--- a/app/display/gimpimagewindow.c
+++ b/app/display/gimpimagewindow.c
@@ -44,6 +44,7 @@
#include "widgets/gimpsessioninfo-aux.h"
#include "widgets/gimpsessionmanaged.h"
#include "widgets/gimpsessioninfo-dock.h"
+#include "widgets/gimptoolbox.h"
#include "widgets/gimpuimanager.h"
#include "widgets/gimpview.h"
@@ -1169,6 +1170,41 @@ gimp_image_window_is_iconified (GimpImageWindow *window)
return (private->window_state & GDK_WINDOW_STATE_ICONIFIED) != 0;
}
+/**
+ * gimp_image_window_has_toolbox:
+ * @window:
+ *
+ * Returns: %TRUE if the image window contains a GimpToolbox.
+ **/
+gboolean
+gimp_image_window_has_toolbox (GimpImageWindow *window)
+{
+ GimpImageWindowPrivate *private;
+ GList *iter = NULL;
+
+ g_return_val_if_fail (GIMP_IS_IMAGE_WINDOW (window), FALSE);
+
+ private = GIMP_IMAGE_WINDOW_GET_PRIVATE (window);
+
+ for (iter = gimp_dock_columns_get_docks (GIMP_DOCK_COLUMNS (private->left_docks));
+ iter;
+ iter = g_list_next (iter))
+ {
+ if (GIMP_IS_TOOLBOX (iter->data))
+ return TRUE;
+ }
+
+ for (iter = gimp_dock_columns_get_docks (GIMP_DOCK_COLUMNS (private->right_docks));
+ iter;
+ iter = g_list_next (iter))
+ {
+ if (GIMP_IS_TOOLBOX (iter->data))
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
void
gimp_image_window_shrink_wrap (GimpImageWindow *window,
gboolean grow_only)
diff --git a/app/display/gimpimagewindow.h b/app/display/gimpimagewindow.h
index 239c240..826d8ba 100644
--- a/app/display/gimpimagewindow.h
+++ b/app/display/gimpimagewindow.h
@@ -82,6 +82,8 @@ gboolean gimp_image_window_get_show_statusbar (GimpImageWindow *win
gboolean gimp_image_window_is_iconified (GimpImageWindow *window);
+gboolean gimp_image_window_has_toolbox (GimpImageWindow *window);
+
void gimp_image_window_shrink_wrap (GimpImageWindow *window,
gboolean grow_only);
diff --git a/app/display/gimpsinglewindowstrategy.c b/app/display/gimpsinglewindowstrategy.c
index b82cdc7..a9d555e 100644
--- a/app/display/gimpsinglewindowstrategy.c
+++ b/app/display/gimpsinglewindowstrategy.c
@@ -20,6 +20,8 @@
#include "config.h"
+#include <string.h>
+
#include <gegl.h>
#include <gtk/gtk.h>
@@ -27,8 +29,10 @@
#include "core/gimp.h"
-#include "widgets/gimpdockcolumns.h"
+#include "widgets/gimpdialogfactory.h"
+#include "widgets/gimpdock.h"
#include "widgets/gimpdockbook.h"
+#include "widgets/gimpdockcolumns.h"
#include "display/gimpimagewindow.h"
@@ -75,8 +79,7 @@ gimp_single_window_strategy_create_dockable_dialog (GimpWindowStrategy *strategy
const gchar *identifiers)
{
GList *windows = gimp_get_image_windows (gimp);
- GtkWidget *dockbook;
- GtkWidget *dockable;
+ GtkWidget *widget;
GimpImageWindow *window;
g_return_val_if_fail (g_list_length (windows) > 0, NULL);
@@ -84,27 +87,54 @@ gimp_single_window_strategy_create_dockable_dialog (GimpWindowStrategy *strategy
/* In single-window mode, there should only be one window... */
window = GIMP_IMAGE_WINDOW (windows->data);
- /* There shall not is more than one window in single-window mode */
- dockbook = gimp_image_window_get_default_dockbook (window);
-
- if (! dockbook)
+ if (strcmp ("gimp-toolbox", identifiers) == 0)
{
- GimpDockColumns *dock_columns;
+ /* Only allow one toolbox... */
+ if (! gimp_image_window_has_toolbox (window))
+ {
+ GimpDockColumns *columns;
+ GimpUIManager *ui_manager = gimp_image_window_get_ui_manager (window);
+
+ widget = gimp_dialog_factory_dialog_new (factory,
+ screen,
+ ui_manager,
+ "gimp-toolbox",
+ -1 /*view_size*/,
+ FALSE /*present*/);
+ gtk_widget_show (widget);
+
+ columns = gimp_image_window_get_left_docks (window);
+ gimp_dock_columns_add_dock (columns,
+ GIMP_DOCK (widget),
+ -1 /*index*/);
+ }
+ }
+ else
+ {
+ GtkWidget *dockbook;
+
+ dockbook = gimp_image_window_get_default_dockbook (window);
+
+ if (! dockbook)
+ {
+ GimpDockColumns *dock_columns;
+
+ /* No dock, need to add one */
+ dock_columns = gimp_image_window_get_right_docks (window);
+ gimp_dock_columns_prepare_dockbook (dock_columns,
+ -1 /*index*/,
+ &dockbook);
+ }
- /* No dock, need to add one */
- dock_columns = gimp_image_window_get_right_docks (window);
- gimp_dock_columns_prepare_dockbook (dock_columns,
- -1 /*index*/,
- &dockbook);
+ widget = gimp_dockbook_add_from_dialog_factory (GIMP_DOCKBOOK (dockbook),
+ identifiers,
+ -1 /*index*/);
}
- dockable = gimp_dockbook_add_from_dialog_factory (GIMP_DOCKBOOK (dockbook),
- identifiers,
- -1 /*index*/);
g_list_free (windows);
- return dockable;
+ return widget;
}
GimpObject *
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]