[gimp] app: add a "detach" button to all on-canvas tool dialogs



commit 072cb068b2bdc0109437cb261cbd1484ef1b3841
Author: Michael Natterer <mitch gimp org>
Date:   Fri May 1 18:00:05 2015 -0400

    app: add a "detach" button to all on-canvas tool dialogs
    
    which turns them from being automatically attached/detached (depending
    on canvas size) into always being a separate window.

 app/display/gimptoolgui.c       |   15 +++++++++-
 app/widgets/gimpoverlaydialog.c |   56 ++++++++++++++++++++++++++++++++++++++-
 app/widgets/gimpoverlaydialog.h |    5 +++
 po/POTFILES.in                  |    1 +
 4 files changed, 74 insertions(+), 3 deletions(-)
---
diff --git a/app/display/gimptoolgui.c b/app/display/gimptoolgui.c
index 7fa0be4..16a4419 100644
--- a/app/display/gimptoolgui.c
+++ b/app/display/gimptoolgui.c
@@ -810,8 +810,19 @@ gimp_tool_gui_dialog_response (GtkWidget   *dialog,
                                gint         response_id,
                                GimpToolGui *gui)
 {
-  g_signal_emit (gui, signals[RESPONSE], 0,
-                 response_id);
+  if (response_id == GIMP_RESPONSE_DETACH)
+    {
+      gimp_tool_gui_set_auto_overlay (gui, FALSE);
+      gimp_tool_gui_set_overlay (gui,
+                                 gtk_widget_get_screen (dialog),
+                                 gimp_widget_get_monitor (dialog),
+                                 FALSE);
+    }
+  else
+    {
+      g_signal_emit (gui, signals[RESPONSE], 0,
+                     response_id);
+    }
 }
 
 static void
diff --git a/app/widgets/gimpoverlaydialog.c b/app/widgets/gimpoverlaydialog.c
index 744f65e..a5a05b8 100644
--- a/app/widgets/gimpoverlaydialog.c
+++ b/app/widgets/gimpoverlaydialog.c
@@ -33,6 +33,8 @@
 
 #include "gimpoverlaydialog.h"
 
+#include "gimp-intl.h"
+
 
 enum
 {
@@ -44,6 +46,7 @@ enum
 enum
 {
   RESPONSE,
+  DETACH,
   CLOSE,
   LAST_SIGNAL
 };
@@ -79,6 +82,9 @@ static void       gimp_overlay_dialog_forall        (GtkContainer      *containe
                                                      GtkCallback        callback,
                                                      gpointer           callback_data);
 
+static void       gimp_overlay_dialog_detach        (GimpOverlayDialog *dialog);
+static void       gimp_overlay_dialog_real_detach   (GimpOverlayDialog *dialog);
+
 static void       gimp_overlay_dialog_close         (GimpOverlayDialog *dialog);
 static void       gimp_overlay_dialog_real_close    (GimpOverlayDialog *dialog);
 
@@ -112,6 +118,7 @@ gimp_overlay_dialog_class_init (GimpOverlayDialogClass *klass)
 
   container_class->forall     = gimp_overlay_dialog_forall;
 
+  klass->detach               = gimp_overlay_dialog_real_detach;
   klass->close                = gimp_overlay_dialog_real_close;
 
   g_object_class_install_property (object_class, PROP_TITLE,
@@ -138,6 +145,15 @@ gimp_overlay_dialog_class_init (GimpOverlayDialogClass *klass)
                   G_TYPE_NONE, 1,
                   G_TYPE_INT);
 
+  signals[DETACH] =
+    g_signal_new ("detach",
+                  G_OBJECT_CLASS_TYPE (klass),
+                  G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+                  G_STRUCT_OFFSET (GimpOverlayDialogClass, detach),
+                  NULL, NULL,
+                  gimp_marshal_VOID__VOID,
+                  G_TYPE_NONE, 0);
+
   signals[CLOSE] =
     g_signal_new ("close",
                   G_OBJECT_CLASS_TYPE (klass),
@@ -202,6 +218,26 @@ gimp_overlay_dialog_constructed (GObject *object)
                            G_CALLBACK (gimp_overlay_dialog_close),
                            G_OBJECT (dialog),
                            G_CONNECT_SWAPPED);
+
+  dialog->detach_button = button = gtk_button_new ();
+  gtk_widget_set_can_focus (button, FALSE);
+  gtk_button_set_relief (GTK_BUTTON (button), GTK_RELIEF_NONE);
+  gtk_box_pack_end (GTK_BOX (dialog->header), button, FALSE, FALSE, 0);
+  gtk_widget_show (button);
+
+  gimp_help_set_help_data (dialog->close_button,
+                           _("Detach dialog from canvas"), NULL);
+
+  image = gtk_image_new_from_icon_name (GIMP_STOCK_MENU_LEFT,
+                                        GTK_ICON_SIZE_MENU);
+  gtk_image_set_pixel_size (GTK_IMAGE (image), 12);
+  gtk_container_add (GTK_CONTAINER (button), image);
+  gtk_widget_show (image);
+
+  g_signal_connect_object (button, "clicked",
+                           G_CALLBACK (gimp_overlay_dialog_detach),
+                           G_OBJECT (dialog),
+                           G_CONNECT_SWAPPED);
 }
 
 static void
@@ -411,6 +447,18 @@ gimp_overlay_dialog_forall (GtkContainer *container,
 }
 
 static void
+gimp_overlay_dialog_detach (GimpOverlayDialog *dialog)
+{
+  g_signal_emit (dialog, signals[DETACH], 0);
+}
+
+static void
+gimp_overlay_dialog_real_detach (GimpOverlayDialog *dialog)
+{
+  gimp_overlay_dialog_response (dialog, GIMP_RESPONSE_DETACH);
+}
+
+static void
 gimp_overlay_dialog_close (GimpOverlayDialog *dialog)
 {
   g_signal_emit (dialog, signals[CLOSE], 0);
@@ -497,7 +545,8 @@ gimp_overlay_dialog_add_button (GimpOverlayDialog *dialog,
   g_return_val_if_fail (button_text != NULL, NULL);
 
   if (response_id == GTK_RESPONSE_CANCEL ||
-      response_id == GTK_RESPONSE_CLOSE)
+      response_id == GTK_RESPONSE_CLOSE  ||
+      response_id == GIMP_RESPONSE_DETACH)
     return NULL;
 
   button = gtk_button_new_from_stock (button_text);
@@ -557,6 +606,11 @@ gimp_overlay_dialog_set_response_sensitive (GimpOverlayDialog *overlay,
       gtk_widget_set_sensitive (overlay->close_button, sensitive);
     }
 
+  if (response_id == GIMP_RESPONSE_DETACH)
+    {
+      gtk_widget_set_sensitive (overlay->detach_button, sensitive);
+    }
+
   children = gtk_container_get_children (GTK_CONTAINER (overlay->action_area));
 
   for (list = children; list; list = g_list_next (list))
diff --git a/app/widgets/gimpoverlaydialog.h b/app/widgets/gimpoverlaydialog.h
index 6afa020..08ee420 100644
--- a/app/widgets/gimpoverlaydialog.h
+++ b/app/widgets/gimpoverlaydialog.h
@@ -25,6 +25,9 @@
 #include "gimpoverlayframe.h"
 
 
+#define GIMP_RESPONSE_DETACH 100
+
+
 #define GIMP_TYPE_OVERLAY_DIALOG            (gimp_overlay_dialog_get_type ())
 #define GIMP_OVERLAY_DIALOG(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_OVERLAY_DIALOG, 
GimpOverlayDialog))
 #define GIMP_OVERLAY_DIALOG_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_OVERLAY_DIALOG, 
GimpOverlayDialogClass))
@@ -46,6 +49,7 @@ struct _GimpOverlayDialog
   GtkWidget        *header;
   GtkWidget        *icon_image;
   GtkWidget        *title_label;
+  GtkWidget        *detach_button;
   GtkWidget        *close_button;
   GtkWidget        *action_area;
 };
@@ -57,6 +61,7 @@ struct _GimpOverlayDialogClass
   void (* response) (GimpOverlayDialog *overlay,
                      gint               response_id);
 
+  void (* detach)   (GimpOverlayDialog *overlay);
   void (* close)    (GimpOverlayDialog *overlay);
 };
 
diff --git a/po/POTFILES.in b/po/POTFILES.in
index fe01e59..bc6ddfb 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -489,6 +489,7 @@ app/widgets/gimplanguagestore-parser.c
 app/widgets/gimplayertreeview.c
 app/widgets/gimpmenudock.c
 app/widgets/gimpmessagebox.c
+app/widgets/gimpoverlaydialog.c
 app/widgets/gimppaletteeditor.c
 app/widgets/gimppanedbox.c
 app/widgets/gimppdbdialog.c


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