[gimp] app: make ImageMergeLayersDialog private and provide a cutom callback instead



commit 14fc49a0015a3ffe15abd41cdc49285a393162cd
Author: Michael Natterer <mitch gimp org>
Date:   Fri Sep 23 19:44:11 2016 +0200

    app: make ImageMergeLayersDialog private and provide a cutom callback instead
    
    and attach the dialog to the image so we can't have multiple dialogs.

 app/actions/image-commands.c            |   74 ++++++++++--------
 app/dialogs/image-merge-layers-dialog.c |  128 +++++++++++++++++++++----------
 app/dialogs/image-merge-layers-dialog.h |   38 ++++-----
 3 files changed, 147 insertions(+), 93 deletions(-)
---
diff --git a/app/actions/image-commands.c b/app/actions/image-commands.c
index 2d64bbb..9b9a0f0 100644
--- a/app/actions/image-commands.c
+++ b/app/actions/image-commands.c
@@ -114,9 +114,12 @@ static void   image_scale_callback         (GtkWidget              *dialog,
                                             GimpUnit                resolution_unit,
                                             gpointer                user_data);
 
-static void   image_merge_layers_response  (GtkWidget              *widget,
-                                            gint                    response_id,
-                                            ImageMergeLayersDialog *dialog);
+static void   image_merge_layers_callback  (GtkWidget              *dialog,
+                                            GimpImage              *image,
+                                            GimpContext            *context,
+                                            GimpMergeType           merge_type,
+                                            gboolean                merge_active_group,
+                                            gboolean                discard_invisible);
 
 
 /*  private variables  */
@@ -778,24 +781,31 @@ void
 image_merge_layers_cmd_callback (GtkAction *action,
                                  gpointer   data)
 {
-  ImageMergeLayersDialog *dialog;
-  GimpImage              *image;
-  GtkWidget              *widget;
+  GtkWidget *dialog;
+  GimpImage *image;
+  GtkWidget *widget;
   return_if_no_image (image, data);
   return_if_no_widget (widget, data);
 
-  dialog = image_merge_layers_dialog_new (image,
-                                          action_data_get_context (data),
-                                          widget,
-                                          image_merge_layers_type,
-                                          image_merge_layers_merge_active_group,
-                                          image_merge_layers_discard_invisible);
+#define MERGE_LAYERS_DIALOG_KEY "gimp-merge-layers-dialog"
 
-  g_signal_connect (dialog->dialog, "response",
-                    G_CALLBACK (image_merge_layers_response),
-                    dialog);
+  dialog = dialogs_get_dialog (G_OBJECT (image), MERGE_LAYERS_DIALOG_KEY);
 
-  gtk_widget_show (dialog->dialog);
+  if (! dialog)
+    {
+      dialog = image_merge_layers_dialog_new (image,
+                                              action_data_get_context (data),
+                                              widget,
+                                              image_merge_layers_type,
+                                              image_merge_layers_merge_active_group,
+                                              image_merge_layers_discard_invisible,
+                                              image_merge_layers_callback,
+                                              NULL);
+
+      dialogs_attach_dialog (G_OBJECT (image), MERGE_LAYERS_DIALOG_KEY, dialog);
+    }
+
+  gtk_window_present (GTK_WINDOW (dialog));
 }
 
 void
@@ -1028,24 +1038,24 @@ image_scale_callback (GtkWidget              *dialog,
 }
 
 static void
-image_merge_layers_response (GtkWidget              *widget,
-                             gint                    response_id,
-                             ImageMergeLayersDialog *dialog)
+image_merge_layers_callback (GtkWidget     *dialog,
+                             GimpImage     *image,
+                             GimpContext   *context,
+                             GimpMergeType  merge_type,
+                             gboolean       merge_active_group,
+                             gboolean       discard_invisible)
 {
-  if (response_id == GTK_RESPONSE_OK)
-    {
-      image_merge_layers_type               = dialog->merge_type;
-      image_merge_layers_merge_active_group = dialog->merge_active_group;
-      image_merge_layers_discard_invisible  = dialog->discard_invisible;
+  image_merge_layers_type               = merge_type;
+  image_merge_layers_merge_active_group = merge_active_group;
+  image_merge_layers_discard_invisible  = discard_invisible;
 
-      gimp_image_merge_visible_layers (dialog->image,
-                                       dialog->context,
-                                       image_merge_layers_type,
-                                       image_merge_layers_merge_active_group,
-                                       image_merge_layers_discard_invisible);
+  gimp_image_merge_visible_layers (image,
+                                   context,
+                                   image_merge_layers_type,
+                                   image_merge_layers_merge_active_group,
+                                   image_merge_layers_discard_invisible);
 
-      gimp_image_flush (dialog->image);
-    }
+  gimp_image_flush (image);
 
-  gtk_widget_destroy (widget);
+  gtk_widget_destroy (dialog);
 }
diff --git a/app/dialogs/image-merge-layers-dialog.c b/app/dialogs/image-merge-layers-dialog.c
index adf9f00..435a4ba 100644
--- a/app/dialogs/image-merge-layers-dialog.c
+++ b/app/dialogs/image-merge-layers-dialog.c
@@ -36,18 +36,42 @@
 #include "gimp-intl.h"
 
 
-static void  image_merge_layers_dialog_free (ImageMergeLayersDialog *dialog);
+typedef struct _ImageMergeLayersDialog ImageMergeLayersDialog;
 
-
-ImageMergeLayersDialog *
-image_merge_layers_dialog_new (GimpImage     *image,
-                               GimpContext   *context,
-                               GtkWidget     *parent,
-                               GimpMergeType  merge_type,
-                               gboolean       merge_active_group,
-                               gboolean       discard_invisible)
+struct _ImageMergeLayersDialog
+{
+  GimpImage               *image;
+  GimpContext             *context;
+  GimpMergeType            merge_type;
+  gboolean                 merge_active_group;
+  gboolean                 discard_invisible;
+  GimpMergeLayersCallback  callback;
+  gpointer                 user_data;
+};
+
+
+/*  local function prototypes  */
+
+static void  image_merge_layers_dialog_response (GtkWidget              *dialog,
+                                                 gint                    response_id,
+                                                 ImageMergeLayersDialog *private);
+static void  image_merge_layers_dialog_free     (ImageMergeLayersDialog *private);
+
+
+/*  public functions  */
+
+GtkWidget *
+image_merge_layers_dialog_new (GimpImage               *image,
+                               GimpContext             *context,
+                               GtkWidget               *parent,
+                               GimpMergeType            merge_type,
+                               gboolean                 merge_active_group,
+                               gboolean                 discard_invisible,
+                               GimpMergeLayersCallback  callback,
+                               gpointer                 user_data)
 {
-  ImageMergeLayersDialog *dialog;
+  ImageMergeLayersDialog *private;
+  GtkWidget              *dialog;
   GtkWidget              *vbox;
   GtkWidget              *frame;
   GtkWidget              *button;
@@ -55,47 +79,52 @@ image_merge_layers_dialog_new (GimpImage     *image,
   g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
   g_return_val_if_fail (GIMP_IS_CONTEXT (context), NULL);
 
-  dialog = g_slice_new0 (ImageMergeLayersDialog);
+  private = g_slice_new0 (ImageMergeLayersDialog);
 
-  dialog->image              = image;
-  dialog->context            = context;
-  dialog->merge_type         = GIMP_EXPAND_AS_NECESSARY;
-  dialog->merge_active_group = merge_active_group;
-  dialog->discard_invisible  = discard_invisible;
+  private->image              = image;
+  private->context            = context;
+  private->merge_type         = merge_type;
+  private->merge_active_group = merge_active_group;
+  private->discard_invisible  = discard_invisible;
+  private->callback           = callback;
+  private->user_data          = user_data;
 
-  dialog->dialog =
-    gimp_viewable_dialog_new (GIMP_VIEWABLE (image), context,
-                              _("Merge Layers"), "gimp-image-merge-layers",
-                              GIMP_STOCK_MERGE_DOWN,
-                              _("Layers Merge Options"),
-                              parent,
-                              gimp_standard_help_func,
-                              GIMP_HELP_IMAGE_MERGE_LAYERS,
+  dialog = gimp_viewable_dialog_new (GIMP_VIEWABLE (image), context,
+                                     _("Merge Layers"), "gimp-image-merge-layers",
+                                     GIMP_STOCK_MERGE_DOWN,
+                                     _("Layers Merge Options"),
+                                     parent,
+                                     gimp_standard_help_func,
+                                     GIMP_HELP_IMAGE_MERGE_LAYERS,
 
-                              GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-                              _("_Merge"),      GTK_RESPONSE_OK,
+                                     GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                                     _("_Merge"),      GTK_RESPONSE_OK,
 
-                              NULL);
+                                     NULL);
 
-  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) image_merge_layers_dialog_free, dialog);
+  g_object_weak_ref (G_OBJECT (dialog),
+                     (GWeakNotify) image_merge_layers_dialog_free, private);
 
-  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);
 
+  g_signal_connect (dialog, "response",
+                    G_CALLBACK (image_merge_layers_dialog_response),
+                    private);
+
   vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
   gtk_container_set_border_width (GTK_CONTAINER (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))),
                       vbox, TRUE, TRUE, 0);
   gtk_widget_show (vbox);
 
   frame = gimp_int_radio_group_new (TRUE, _("Final, Merged Layer should be:"),
                                     G_CALLBACK (gimp_radio_button_update),
-                                    &dialog->merge_type, dialog->merge_type,
+                                    &private->merge_type, private->merge_type,
 
                                     _("Expanded as necessary"),
                                     GIMP_EXPAND_AS_NECESSARY, NULL,
@@ -113,33 +142,52 @@ image_merge_layers_dialog_new (GimpImage     *image,
 
   button = gtk_check_button_new_with_mnemonic (_("Merge within active _group only"));
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
-                                dialog->merge_active_group);
+                                private->merge_active_group);
   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
   gtk_widget_show (button);
 
   g_signal_connect (button, "toggled",
                     G_CALLBACK (gimp_toggle_button_update),
-                    &dialog->merge_active_group);
+                    &private->merge_active_group);
 
   if (gimp_item_stack_is_flat (GIMP_ITEM_STACK (gimp_image_get_layers (image))))
     gtk_widget_set_sensitive (button, FALSE);
 
   button = gtk_check_button_new_with_mnemonic (_("_Discard invisible layers"));
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
-                                dialog->discard_invisible);
+                                private->discard_invisible);
   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
   gtk_widget_show (button);
 
   g_signal_connect (button, "toggled",
                     G_CALLBACK (gimp_toggle_button_update),
-                    &dialog->discard_invisible);
-
+                    &private->discard_invisible);
 
   return dialog;
 }
 
 static void
-image_merge_layers_dialog_free (ImageMergeLayersDialog *dialog)
+image_merge_layers_dialog_response (GtkWidget              *dialog,
+                                    gint                    response_id,
+                                    ImageMergeLayersDialog *private)
+{
+  if (response_id == GTK_RESPONSE_OK)
+    {
+      private->callback (dialog,
+                         private->image,
+                         private->context,
+                         private->merge_type,
+                         private->merge_active_group,
+                         private->discard_invisible);
+    }
+  else
+    {
+      gtk_widget_destroy (dialog);
+    }
+}
+
+static void
+image_merge_layers_dialog_free (ImageMergeLayersDialog *private)
 {
-  g_slice_free (ImageMergeLayersDialog, dialog);
+  g_slice_free (ImageMergeLayersDialog, private);
 }
diff --git a/app/dialogs/image-merge-layers-dialog.h b/app/dialogs/image-merge-layers-dialog.h
index 1271fd7..a9d0164 100644
--- a/app/dialogs/image-merge-layers-dialog.h
+++ b/app/dialogs/image-merge-layers-dialog.h
@@ -19,27 +19,23 @@
 #define __IMAGE_MERGE_LAYERS_DIALOG_H__
 
 
-typedef struct _ImageMergeLayersDialog ImageMergeLayersDialog;
-
-struct _ImageMergeLayersDialog
-{
-  GtkWidget     *dialog;
-
-  GimpImage     *image;
-  GimpContext   *context;
-  GimpMergeType  merge_type;
-  gboolean       merge_active_group;
-  gboolean       discard_invisible;
-};
-
-
-ImageMergeLayersDialog *
-  image_merge_layers_dialog_new (GimpImage     *image,
-                                 GimpContext   *context,
-                                 GtkWidget     *parent,
-                                 GimpMergeType  merge_type,
-                                 gboolean       merge_active_group,
-                                 gboolean       discard_invisible);
+typedef void (* GimpMergeLayersCallback) (GtkWidget     *dialog,
+                                          GimpImage     *image,
+                                          GimpContext   *context,
+                                          GimpMergeType  merge_type,
+                                          gboolean       merge_active_group,
+                                          gboolean       discard_invisible);
+
+
+GtkWidget *
+  image_merge_layers_dialog_new (GimpImage               *image,
+                                 GimpContext             *context,
+                                 GtkWidget               *parent,
+                                 GimpMergeType            merge_type,
+                                 gboolean                 merge_active_group,
+                                 gboolean                 discard_invisible,
+                                 GimpMergeLayersCallback  callback,
+                                 gpointer                 user_data);
 
 
 #endif /* __IMAGE_MERGE_LAYERS_DIALOG_H__ */


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