[gimp] app: add a callback to the offset dialog



commit bbbfe5cafcf5509d27604dc2221b40f646e41127
Author: Michael Natterer <mitch gimp org>
Date:   Mon Sep 26 23:08:29 2016 +0200

    app: add a callback to the offset dialog
    
    and move the actual offset call to drawable-commands.c.

 app/actions/drawable-commands.c |   38 ++++++-
 app/dialogs/offset-dialog.c     |  261 ++++++++++++++++++--------------------
 app/dialogs/offset-dialog.h     |   17 ++-
 3 files changed, 175 insertions(+), 141 deletions(-)
---
diff --git a/app/actions/drawable-commands.c b/app/actions/drawable-commands.c
index ba64263..bbdfdc3 100644
--- a/app/actions/drawable-commands.c
+++ b/app/actions/drawable-commands.c
@@ -27,6 +27,7 @@
 #include "core/gimp.h"
 #include "core/gimpdrawable-equalize.h"
 #include "core/gimpdrawable-levels.h"
+#include "core/gimpdrawable-offset.h"
 #include "core/gimpdrawable-operation.h"
 #include "core/gimpimage.h"
 #include "core/gimpimage-undo.h"
@@ -44,6 +45,17 @@
 #include "gimp-intl.h"
 
 
+/*  local function prototypes  */
+
+static void   drawable_offset_callback (GtkWidget      *dialog,
+                                        GimpDrawable   *drawable,
+                                        GimpContext    *context,
+                                        gboolean        wrap_around,
+                                        GimpOffsetType  fill_type,
+                                        gint            offset_x,
+                                        gint            offset_y);
+
+
 /*  public functions  */
 
 void
@@ -198,7 +210,9 @@ drawable_offset_cmd_callback (GtkAction *action,
   if (! dialog)
     {
       dialog = offset_dialog_new (drawable, action_data_get_context (data),
-                                  widget);
+                                  widget,
+                                  drawable_offset_callback,
+                                  NULL);
 
       dialogs_attach_dialog (G_OBJECT (drawable),
                              OFFSET_DIALOG_KEY, dialog);
@@ -419,3 +433,25 @@ drawable_rotate_cmd_callback (GtkAction *action,
 
   gimp_image_flush (image);
 }
+
+
+/*  private functions  */
+
+static void
+drawable_offset_callback (GtkWidget      *dialog,
+                          GimpDrawable   *drawable,
+                          GimpContext    *context,
+                          gboolean        wrap_around,
+                          GimpOffsetType  fill_type,
+                          gint            offset_x,
+                          gint            offset_y)
+{
+  GimpImage *image = gimp_item_get_image (GIMP_ITEM (drawable));
+
+  gimp_drawable_offset (drawable, context,
+                        wrap_around, fill_type,
+                        offset_x, offset_y);
+  gimp_image_flush (image);
+
+  gtk_widget_destroy (dialog);
+}
diff --git a/app/dialogs/offset-dialog.c b/app/dialogs/offset-dialog.c
index 06b0d7d..52bf96b 100644
--- a/app/dialogs/offset-dialog.c
+++ b/app/dialogs/offset-dialog.c
@@ -26,10 +26,8 @@
 #include "dialogs-types.h"
 
 #include "core/gimp.h"
-#include "core/gimpchannel.h"
 #include "core/gimpcontext.h"
 #include "core/gimpdrawable.h"
-#include "core/gimpdrawable-offset.h"
 #include "core/gimpitem.h"
 #include "core/gimplayer.h"
 #include "core/gimplayermask.h"
@@ -49,40 +47,43 @@
 
 typedef struct
 {
-  GimpContext    *context;
+  GimpDrawable       *drawable;
+  GimpContext        *context;
+  GimpOffsetType      fill_type;
+  GimpOffsetCallback  callback;
+  gpointer            user_data;
 
-  GtkWidget      *dialog;
-  GtkWidget      *off_se;
-
-  GimpOffsetType  fill_type;
-
-  GimpImage      *image;
+  GtkWidget          *off_se;
 } OffsetDialog;
 
 
 /*  local function prototypes  */
 
-static void  offset_response         (GtkWidget    *widget,
-                                      gint          response_id,
-                                      OffsetDialog *dialog);
-static void  offset_half_xy_callback (GtkWidget    *widget,
-                                      OffsetDialog *dialog);
-static void  offset_half_x_callback  (GtkWidget    *widget,
-                                      OffsetDialog *dialog);
-static void  offset_half_y_callback  (GtkWidget    *widget,
-                                      OffsetDialog *dialog);
-static void  offset_dialog_free      (OffsetDialog *dialog);
+static void  offset_dialog_response         (GtkWidget    *dialog,
+                                             gint          response_id,
+                                             OffsetDialog *private);
+static void  offset_dialog_half_xy_callback (GtkWidget    *widget,
+                                             OffsetDialog *private);
+static void  offset_dialog_half_x_callback  (GtkWidget    *widget,
+                                             OffsetDialog *private);
+static void  offset_dialog_half_y_callback  (GtkWidget    *widget,
+                                             OffsetDialog *private);
+static void  offset_dialog_free             (OffsetDialog *private);
 
 
 /*  public functions  */
 
 GtkWidget *
-offset_dialog_new (GimpDrawable *drawable,
-                   GimpContext  *context,
-                   GtkWidget    *parent)
+offset_dialog_new (GimpDrawable       *drawable,
+                   GimpContext        *context,
+                   GtkWidget          *parent,
+                   GimpOffsetCallback  callback,
+                   gpointer            user_data)
 {
+  OffsetDialog  *private;
+  GimpImage     *image;
   GimpItem      *item;
-  OffsetDialog  *dialog;
+  GtkWidget     *dialog;
   GtkWidget     *main_vbox;
   GtkWidget     *vbox;
   GtkWidget     *hbox;
@@ -98,15 +99,20 @@ offset_dialog_new (GimpDrawable *drawable,
   g_return_val_if_fail (GIMP_IS_DRAWABLE (drawable), NULL);
   g_return_val_if_fail (GIMP_IS_CONTEXT (context), NULL);
   g_return_val_if_fail (GTK_IS_WIDGET (parent), NULL);
+  g_return_val_if_fail (callback != NULL, NULL);
 
-  dialog = g_slice_new0 (OffsetDialog);
+  item  = GIMP_ITEM (drawable);
+  image = gimp_item_get_image (item);
 
-  dialog->context   = context;
-  dialog->fill_type = gimp_drawable_has_alpha (drawable) | WRAP_AROUND;
-  item = GIMP_ITEM (drawable);
-  dialog->image     = gimp_item_get_image (item);
+  private = g_slice_new0 (OffsetDialog);
 
-  gimp_image_get_resolution (dialog->image, &xres, &yres);
+  private->drawable  = drawable;
+  private->context   = context;
+  private->fill_type = gimp_drawable_has_alpha (drawable) | WRAP_AROUND;
+  private->callback  = callback;
+  private->user_data = user_data;
+
+  gimp_image_get_resolution (image, &xres, &yres);
 
   if (GIMP_IS_LAYER (drawable))
     title = _("Offset Layer");
@@ -117,38 +123,37 @@ offset_dialog_new (GimpDrawable *drawable,
   else
     g_warning ("%s: unexpected drawable type", G_STRFUNC);
 
-  dialog->dialog =
-    gimp_viewable_dialog_new (GIMP_VIEWABLE (drawable), context,
-                              _("Offset"), "gimp-drawable-offset",
-                              GIMP_STOCK_TOOL_MOVE,
-                              title,
-                              parent,
-                              gimp_standard_help_func,
-                              GIMP_HELP_LAYER_OFFSET,
+  dialog = gimp_viewable_dialog_new (GIMP_VIEWABLE (drawable), context,
+                                     _("Offset"), "gimp-drawable-offset",
+                                     GIMP_STOCK_TOOL_MOVE,
+                                     title,
+                                     parent,
+                                     gimp_standard_help_func,
+                                     GIMP_HELP_LAYER_OFFSET,
 
-                              GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-                              /*  offset, used as a verb  */
-                              _("_Offset"),     GTK_RESPONSE_OK,
+                                     GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                                     /*  offset, used as a verb  */
+                                     _("_Offset"),     GTK_RESPONSE_OK,
 
-                              NULL);
+                                     NULL);
 
-  gtk_dialog_set_alternative_button_order (GTK_DIALOG (dialog->dialog),
+  gtk_dialog_set_alternative_button_order (GTK_DIALOG (dialog),
                                            GTK_RESPONSE_OK,
                                            GTK_RESPONSE_CANCEL,
                                            -1);
 
-  gtk_window_set_resizable (GTK_WINDOW (dialog->dialog), FALSE);
+  gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
 
-  g_object_weak_ref (G_OBJECT (dialog->dialog),
-                     (GWeakNotify) offset_dialog_free, dialog);
+  g_object_weak_ref (G_OBJECT (dialog),
+                     (GWeakNotify) offset_dialog_free, private);
 
-  g_signal_connect (dialog->dialog, "response",
-                    G_CALLBACK (offset_response),
-                    dialog);
+  g_signal_connect (dialog, "response",
+                    G_CALLBACK (offset_dialog_response),
+                    private);
 
   main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
   gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 12);
-  gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog->dialog))),
+  gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))),
                       main_vbox, TRUE, TRUE, 0);
   gtk_widget_show (main_vbox);
 
@@ -167,57 +172,57 @@ offset_dialog_new (GimpDrawable *drawable,
   gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbutton), TRUE);
   gtk_entry_set_width_chars (GTK_ENTRY (spinbutton), 10);
 
-  dialog->off_se = gimp_size_entry_new (1, GIMP_UNIT_PIXEL, "%a",
+  private->off_se = gimp_size_entry_new (1, GIMP_UNIT_PIXEL, "%a",
                                         TRUE, TRUE, FALSE, 10,
                                         GIMP_SIZE_ENTRY_UPDATE_SIZE);
 
-  gtk_table_set_col_spacing (GTK_TABLE (dialog->off_se), 0, 4);
-  gtk_table_set_col_spacing (GTK_TABLE (dialog->off_se), 1, 4);
-  gtk_table_set_row_spacing (GTK_TABLE (dialog->off_se), 0, 2);
+  gtk_table_set_col_spacing (GTK_TABLE (private->off_se), 0, 4);
+  gtk_table_set_col_spacing (GTK_TABLE (private->off_se), 1, 4);
+  gtk_table_set_row_spacing (GTK_TABLE (private->off_se), 0, 2);
 
-  gimp_size_entry_add_field (GIMP_SIZE_ENTRY (dialog->off_se),
+  gimp_size_entry_add_field (GIMP_SIZE_ENTRY (private->off_se),
                              GTK_SPIN_BUTTON (spinbutton), NULL);
-  gtk_table_attach_defaults (GTK_TABLE (dialog->off_se), spinbutton,
+  gtk_table_attach_defaults (GTK_TABLE (private->off_se), spinbutton,
                              1, 2, 0, 1);
   gtk_widget_show (spinbutton);
 
-  gimp_size_entry_attach_label (GIMP_SIZE_ENTRY (dialog->off_se),
+  gimp_size_entry_attach_label (GIMP_SIZE_ENTRY (private->off_se),
                                 _("_X:"), 0, 0, 0.0);
-  gimp_size_entry_attach_label (GIMP_SIZE_ENTRY (dialog->off_se),
+  gimp_size_entry_attach_label (GIMP_SIZE_ENTRY (private->off_se),
                                 _("_Y:"), 1, 0, 0.0);
 
-  gtk_box_pack_start (GTK_BOX (vbox), dialog->off_se, FALSE, FALSE, 0);
-  gtk_widget_show (dialog->off_se);
+  gtk_box_pack_start (GTK_BOX (vbox), private->off_se, FALSE, FALSE, 0);
+  gtk_widget_show (private->off_se);
 
-  gimp_size_entry_set_unit (GIMP_SIZE_ENTRY (dialog->off_se), GIMP_UNIT_PIXEL);
+  gimp_size_entry_set_unit (GIMP_SIZE_ENTRY (private->off_se), GIMP_UNIT_PIXEL);
 
-  gimp_size_entry_set_resolution (GIMP_SIZE_ENTRY (dialog->off_se), 0,
+  gimp_size_entry_set_resolution (GIMP_SIZE_ENTRY (private->off_se), 0,
                                   xres, FALSE);
-  gimp_size_entry_set_resolution (GIMP_SIZE_ENTRY (dialog->off_se), 1,
+  gimp_size_entry_set_resolution (GIMP_SIZE_ENTRY (private->off_se), 1,
                                   yres, FALSE);
 
-  gimp_size_entry_set_refval_boundaries (GIMP_SIZE_ENTRY (dialog->off_se), 0,
+  gimp_size_entry_set_refval_boundaries (GIMP_SIZE_ENTRY (private->off_se), 0,
                                          - gimp_item_get_width (item),
                                          gimp_item_get_width (item));
-  gimp_size_entry_set_refval_boundaries (GIMP_SIZE_ENTRY (dialog->off_se), 1,
+  gimp_size_entry_set_refval_boundaries (GIMP_SIZE_ENTRY (private->off_se), 1,
                                          - gimp_item_get_height (item),
                                          gimp_item_get_height (item));
 
-  gimp_size_entry_set_size (GIMP_SIZE_ENTRY (dialog->off_se), 0,
+  gimp_size_entry_set_size (GIMP_SIZE_ENTRY (private->off_se), 0,
                             0, gimp_item_get_width (item));
-  gimp_size_entry_set_size (GIMP_SIZE_ENTRY (dialog->off_se), 1,
+  gimp_size_entry_set_size (GIMP_SIZE_ENTRY (private->off_se), 1,
                             0, gimp_item_get_height (item));
 
-  gimp_size_entry_set_refval (GIMP_SIZE_ENTRY (dialog->off_se), 0, 0);
-  gimp_size_entry_set_refval (GIMP_SIZE_ENTRY (dialog->off_se), 1, 0);
+  gimp_size_entry_set_refval (GIMP_SIZE_ENTRY (private->off_se), 0, 0);
+  gimp_size_entry_set_refval (GIMP_SIZE_ENTRY (private->off_se), 1, 0);
 
   button = gtk_button_new_with_mnemonic (_("By width/_2, height/2"));
   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
   gtk_widget_show (button);
 
   g_signal_connect (button, "clicked",
-                    G_CALLBACK (offset_half_xy_callback),
-                    dialog);
+                    G_CALLBACK (offset_dialog_half_xy_callback),
+                    private);
 
   hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
   gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
@@ -228,21 +233,21 @@ offset_dialog_new (GimpDrawable *drawable,
   gtk_widget_show (button);
 
   g_signal_connect (button, "clicked",
-                    G_CALLBACK (offset_half_x_callback),
-                    dialog);
+                    G_CALLBACK (offset_dialog_half_x_callback),
+                    private);
 
   button = gtk_button_new_with_mnemonic ("By _height/2");
   gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
   gtk_widget_show (button);
 
   g_signal_connect (button, "clicked",
-                    G_CALLBACK (offset_half_y_callback),
-                    dialog);
+                    G_CALLBACK (offset_dialog_half_y_callback),
+                    private);
 
   /*  The edge behavior frame  */
   frame = gimp_int_radio_group_new (TRUE, _("Edge Behavior"),
                                     G_CALLBACK (gimp_radio_button_update),
-                                    &dialog->fill_type, dialog->fill_type,
+                                    &private->fill_type, private->fill_type,
 
                                     _("W_rap around"),
                                     WRAP_AROUND, NULL,
@@ -260,95 +265,77 @@ offset_dialog_new (GimpDrawable *drawable,
   gtk_box_pack_start (GTK_BOX (main_vbox), frame, FALSE, FALSE, 0);
   gtk_widget_show (frame);
 
-  return dialog->dialog;
+  return dialog;
 }
 
 
 /*  private functions  */
 
 static void
-offset_response (GtkWidget    *widget,
-                 gint          response_id,
-                 OffsetDialog *dialog)
+offset_dialog_response (GtkWidget    *dialog,
+                        gint          response_id,
+                        OffsetDialog *private)
 {
   if (response_id == GTK_RESPONSE_OK)
     {
-      GimpImage *image = dialog->image;
-
-      if (image)
-        {
-          GimpDrawable *drawable = gimp_image_get_active_drawable (image);
-          gint          offset_x;
-          gint          offset_y;
-
-          offset_x =
-            RINT (gimp_size_entry_get_refval (GIMP_SIZE_ENTRY (dialog->off_se),
-                                              0));
-          offset_y =
-            RINT (gimp_size_entry_get_refval (GIMP_SIZE_ENTRY (dialog->off_se),
-                                              1));
-
-          gimp_drawable_offset (drawable,
-                                dialog->context,
-                                dialog->fill_type & WRAP_AROUND ? TRUE : FALSE,
-                                dialog->fill_type & FILL_MASK,
-                                offset_x, offset_y);
-          gimp_image_flush (image);
-        }
+      gint offset_x;
+      gint offset_y;
+
+      offset_x =
+        RINT (gimp_size_entry_get_refval (GIMP_SIZE_ENTRY (private->off_se),
+                                          0));
+      offset_y =
+        RINT (gimp_size_entry_get_refval (GIMP_SIZE_ENTRY (private->off_se),
+                                          1));
+
+      private->callback (dialog,
+                         private->drawable,
+                         private->context,
+                         private->fill_type & WRAP_AROUND ? TRUE : FALSE,
+                         private->fill_type & FILL_MASK,
+                         offset_x,
+                         offset_y);
+    }
+  else
+    {
+      gtk_widget_destroy (dialog);
     }
-
-  gtk_widget_destroy (dialog->dialog);
 }
 
 static void
-offset_half_xy_callback (GtkWidget    *widget,
-                         OffsetDialog *dialog)
+offset_dialog_half_xy_callback (GtkWidget    *widget,
+                                OffsetDialog *private)
 {
-  GimpImage *image = dialog->image;
+  GimpItem *item = GIMP_ITEM (private->drawable);
 
-  if (image)
-    {
-      GimpItem *item = GIMP_ITEM (gimp_image_get_active_drawable (image));
-
-      gimp_size_entry_set_refval (GIMP_SIZE_ENTRY (dialog->off_se),
-                                  0, gimp_item_get_width (item) / 2);
-      gimp_size_entry_set_refval (GIMP_SIZE_ENTRY (dialog->off_se),
-                                  1, gimp_item_get_height (item) / 2);
-   }
+  gimp_size_entry_set_refval (GIMP_SIZE_ENTRY (private->off_se),
+                              0, gimp_item_get_width (item) / 2);
+  gimp_size_entry_set_refval (GIMP_SIZE_ENTRY (private->off_se),
+                              1, gimp_item_get_height (item) / 2);
 }
 
 static void
-offset_half_x_callback (GtkWidget    *widget,
-                        OffsetDialog *dialog)
+offset_dialog_half_x_callback (GtkWidget    *widget,
+                               OffsetDialog *private)
 {
-  GimpImage *image = dialog->image;
-
-  if (image)
-    {
-      GimpItem *item = GIMP_ITEM (gimp_image_get_active_drawable (image));
+  GimpItem *item = GIMP_ITEM (private->drawable);
 
-      gimp_size_entry_set_refval (GIMP_SIZE_ENTRY (dialog->off_se),
-                                  0, gimp_item_get_width (item) / 2);
-   }
+  gimp_size_entry_set_refval (GIMP_SIZE_ENTRY (private->off_se),
+                              0, gimp_item_get_width (item) / 2);
 }
 
 static void
-offset_half_y_callback (GtkWidget    *widget,
-                        OffsetDialog *dialog)
+offset_dialog_half_y_callback (GtkWidget    *widget,
+                               OffsetDialog *private)
 {
-  GimpImage *image = dialog->image;
-
-  if (image)
-    {
-      GimpItem *item = GIMP_ITEM (gimp_image_get_active_drawable (image));
+  GimpItem *item = GIMP_ITEM (private->drawable);
 
-      gimp_size_entry_set_refval (GIMP_SIZE_ENTRY (dialog->off_se),
-                                  1, gimp_item_get_height (item) / 2);
-   }
+  gimp_size_entry_set_refval (GIMP_SIZE_ENTRY (private->off_se),
+                              1, gimp_item_get_height (item) / 2);
 }
 
 static void
-offset_dialog_free (OffsetDialog *dialog)
+offset_dialog_free (OffsetDialog *private)
 {
-  g_slice_free (OffsetDialog, dialog);
+  g_slice_free (OffsetDialog, private);
 }
diff --git a/app/dialogs/offset-dialog.h b/app/dialogs/offset-dialog.h
index e2de350..0555359 100644
--- a/app/dialogs/offset-dialog.h
+++ b/app/dialogs/offset-dialog.h
@@ -19,9 +19,20 @@
 #define __OFFSET_DIALOG_H__
 
 
-GtkWidget * offset_dialog_new (GimpDrawable *drawable,
-                               GimpContext  *context,
-                               GtkWidget    *parent);
+typedef void (* GimpOffsetCallback) (GtkWidget      *dialog,
+                                     GimpDrawable   *drawable,
+                                     GimpContext    *context,
+                                     gboolean        wrap_around,
+                                     GimpOffsetType  fill_type,
+                                     gint            offset_x,
+                                     gint            offset_y);
+
+
+GtkWidget * offset_dialog_new (GimpDrawable       *drawable,
+                               GimpContext        *context,
+                               GtkWidget          *parent,
+                               GimpOffsetCallback  callback,
+                               gpointer            user_data);
 
 
 #endif  /*  __OFFSET_DIALOG_H__  */


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