[gimp] app: make ImageMergeLayersDialog private and provide a cutom callback instead
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] app: make ImageMergeLayersDialog private and provide a cutom callback instead
- Date: Fri, 23 Sep 2016 17:45:13 +0000 (UTC)
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]