[gimp] app: clean up template-options-dialog like other dialogs



commit bc6679974b143754e7bef4cb2d8f4595e55927ba
Author: Michael Natterer <mitch gimp org>
Date:   Sun Oct 30 20:54:47 2016 +0100

    app: clean up template-options-dialog like other dialogs

 app/actions/templates-commands.c      |  133 +++++++++++++++++----------------
 app/dialogs/template-options-dialog.c |  101 ++++++++++++++++++-------
 app/dialogs/template-options-dialog.h |   37 ++++-----
 3 files changed, 161 insertions(+), 110 deletions(-)
---
diff --git a/app/actions/templates-commands.c b/app/actions/templates-commands.c
index d4a0dd5..ab165ce 100644
--- a/app/actions/templates-commands.c
+++ b/app/actions/templates-commands.c
@@ -42,6 +42,7 @@
 #include "widgets/gimptemplateview.h"
 #include "widgets/gimpwidgets-utils.h"
 
+#include "dialogs/dialogs.h"
 #include "dialogs/template-options-dialog.h"
 
 #include "actions.h"
@@ -60,16 +61,20 @@ typedef struct
 
 /*  local function prototypes  */
 
-static void   templates_new_response     (GtkWidget             *dialog,
-                                          gint                   response_id,
-                                          TemplateOptionsDialog *options);
-static void   templates_edit_response    (GtkWidget             *widget,
-                                          gint                   response_id,
-                                          TemplateOptionsDialog *options);
-static void   templates_delete_response  (GtkWidget             *dialog,
-                                          gint                   response_id,
-                                          TemplateDeleteData    *delete_data);
-static void   templates_delete_data_free (TemplateDeleteData    *delete_data);
+static void   templates_new_callback     (GtkWidget          *dialog,
+                                          GimpTemplate       *template,
+                                          GimpTemplate       *edit_template,
+                                          GimpContext        *context,
+                                          gpointer            user_data);
+static void   templates_edit_callback    (GtkWidget          *dialog,
+                                          GimpTemplate       *template,
+                                          GimpTemplate       *edit_template,
+                                          GimpContext        *context,
+                                          gpointer            user_data);
+static void   templates_delete_response  (GtkWidget          *dialog,
+                                          gint                response_id,
+                                          TemplateDeleteData *delete_data);
+static void   templates_delete_data_free (TemplateDeleteData *delete_data);
 
 
 /*  public functions */
@@ -109,25 +114,32 @@ void
 templates_new_cmd_callback (GtkAction *action,
                             gpointer   data)
 {
-  GimpContainerEditor   *editor = GIMP_CONTAINER_EDITOR (data);
-  GimpContext           *context;
-  TemplateOptionsDialog *options;
+  GimpContainerEditor *editor = GIMP_CONTAINER_EDITOR (data);
+  GimpContext         *context;
+  GtkWidget           *dialog;
 
   context = gimp_container_view_get_context (editor->view);
 
-  options = template_options_dialog_new (NULL, context,
-                                         GTK_WIDGET (editor),
-                                         _("New Template"),
-                                         "gimp-template-new",
-                                         GIMP_STOCK_TEMPLATE,
-                                         _("Create a New Template"),
-                                         GIMP_HELP_TEMPLATE_NEW);
+#define NEW_DIALOG_KEY "gimp-template-new-dialog"
+
+  dialog = dialogs_get_dialog (G_OBJECT (context->gimp), NEW_DIALOG_KEY);
 
-  g_signal_connect (options->dialog, "response",
-                    G_CALLBACK (templates_new_response),
-                    options);
+  if (! dialog)
+    {
+      dialog = template_options_dialog_new (NULL, context,
+                                            GTK_WIDGET (editor),
+                                            _("New Template"),
+                                            "gimp-template-new",
+                                            GIMP_STOCK_TEMPLATE,
+                                            _("Create a New Template"),
+                                            GIMP_HELP_TEMPLATE_NEW,
+                                            templates_new_callback,
+                                            NULL);
+
+      dialogs_attach_dialog (G_OBJECT (context->gimp), NEW_DIALOG_KEY, dialog);
+    }
 
-  gtk_widget_show (options->dialog);
+  gtk_window_present (GTK_WINDOW (dialog));
 }
 
 void
@@ -176,21 +188,28 @@ templates_edit_cmd_callback (GtkAction *action,
 
   if (template && gimp_container_have (container, GIMP_OBJECT (template)))
     {
-      TemplateOptionsDialog *options;
+      GtkWidget *dialog;
 
-      options = template_options_dialog_new (template, context,
-                                             GTK_WIDGET (editor),
-                                             _("Edit Template"),
-                                             "gimp-template-edit",
-                                             "gtk-edit",
-                                             _("Edit Template"),
-                                             GIMP_HELP_TEMPLATE_EDIT);
+#define EDIT_DIALOG_KEY "gimp-template-edit-dialog"
 
-      g_signal_connect (options->dialog, "response",
-                        G_CALLBACK (templates_edit_response),
-                        options);
+      dialog = dialogs_get_dialog (G_OBJECT (template), EDIT_DIALOG_KEY);
 
-      gtk_widget_show (options->dialog);
+      if (! dialog)
+        {
+          dialog = template_options_dialog_new (template, context,
+                                                GTK_WIDGET (editor),
+                                                _("Edit Template"),
+                                                "gimp-template-edit",
+                                                "gtk-edit",
+                                                _("Edit Template"),
+                                                GIMP_HELP_TEMPLATE_EDIT,
+                                                templates_edit_callback,
+                                                NULL);
+
+          dialogs_attach_dialog (G_OBJECT (template), EDIT_DIALOG_KEY, dialog);
+        }
+
+      gtk_window_present (GTK_WINDOW (dialog));
     }
 }
 
@@ -256,40 +275,28 @@ templates_delete_cmd_callback (GtkAction *action,
 /*  private functions  */
 
 static void
-templates_new_response (GtkWidget             *dialog,
-                        gint                   response_id,
-                        TemplateOptionsDialog *options)
+templates_new_callback (GtkWidget    *dialog,
+                        GimpTemplate *template,
+                        GimpTemplate *edit_template,
+                        GimpContext  *context,
+                        gpointer      user_data)
 {
-  if (response_id == GTK_RESPONSE_OK)
-    {
-      GimpTemplateEditor *editor = GIMP_TEMPLATE_EDITOR (options->editor);
-      GimpTemplate       *template;
-
-      template = gimp_template_editor_get_template (editor);
-
-      gimp_container_add (options->gimp->templates, GIMP_OBJECT (template));
-      gimp_context_set_template (gimp_get_user_context (options->gimp),
-                                 template);
-    }
+  gimp_container_add (context->gimp->templates, GIMP_OBJECT (edit_template));
+  gimp_context_set_template (gimp_get_user_context (context->gimp),
+                             edit_template);
 
   gtk_widget_destroy (dialog);
 }
 
 static void
-templates_edit_response (GtkWidget             *dialog,
-                         gint                   response_id,
-                         TemplateOptionsDialog *options)
+templates_edit_callback (GtkWidget    *dialog,
+                         GimpTemplate *template,
+                         GimpTemplate *edit_template,
+                         GimpContext  *context,
+                         gpointer      user_data)
 {
-  if (response_id == GTK_RESPONSE_OK)
-    {
-      GimpTemplateEditor *editor = GIMP_TEMPLATE_EDITOR (options->editor);
-      GimpTemplate       *template;
-
-      template = gimp_template_editor_get_template (editor);
-
-      gimp_config_sync (G_OBJECT (template),
-                        G_OBJECT (options->template), 0);
-    }
+  gimp_config_sync (G_OBJECT (edit_template),
+                    G_OBJECT (template), 0);
 
   gtk_widget_destroy (dialog);
 }
diff --git a/app/dialogs/template-options-dialog.c b/app/dialogs/template-options-dialog.c
index 393514d..ecfcf0d 100644
--- a/app/dialogs/template-options-dialog.c
+++ b/app/dialogs/template-options-dialog.c
@@ -39,14 +39,30 @@
 #include "gimp-intl.h"
 
 
+typedef struct _TemplateOptionsDialog TemplateOptionsDialog;
+
+struct _TemplateOptionsDialog
+{
+  GimpTemplate                *template;
+  GimpContext                 *context;
+  GimpTemplateOptionsCallback  callback;
+  gpointer                     user_data;
+
+  GtkWidget                   *editor;
+};
+
+
 /*  local function prototypes  */
 
-static void  template_options_dialog_free (TemplateOptionsDialog *dialog);
+static void   template_options_dialog_free     (TemplateOptionsDialog *private);
+static void   template_options_dialog_response (GtkWidget             *dialog,
+                                                gint                   response_id,
+                                                TemplateOptionsDialog *private);
 
 
 /*  public function  */
 
-TemplateOptionsDialog *
+GtkWidget *
 template_options_dialog_new (GimpTemplate *template,
                              GimpContext  *context,
                              GtkWidget    *parent,
@@ -54,9 +70,12 @@ template_options_dialog_new (GimpTemplate *template,
                              const gchar  *role,
                              const gchar  *icon_name,
                              const gchar  *desc,
-                             const gchar  *help_id)
+                             const gchar  *help_id,
+                             GimpTemplateOptionsCallback  callback,
+                             gpointer                     user_data)
 {
-  TemplateOptionsDialog *options;
+  TemplateOptionsDialog *private;
+  GtkWidget             *dialog;
   GimpViewable          *viewable = NULL;
   GtkWidget             *vbox;
 
@@ -68,11 +87,14 @@ template_options_dialog_new (GimpTemplate *template,
   g_return_val_if_fail (icon_name != NULL, NULL);
   g_return_val_if_fail (desc != NULL, NULL);
   g_return_val_if_fail (help_id != NULL, NULL);
+  g_return_val_if_fail (callback != NULL, NULL);
 
-  options = g_slice_new0 (TemplateOptionsDialog);
+  private = g_slice_new0 (TemplateOptionsDialog);
 
-  options->gimp     = context->gimp;
-  options->template = template;
+  private->template  = template;
+  private->context   = context;
+  private->callback  = callback;
+  private->user_data = user_data;
 
   if (template)
     {
@@ -82,52 +104,77 @@ template_options_dialog_new (GimpTemplate *template,
   else
     {
       template =
-        gimp_config_duplicate (GIMP_CONFIG (options->gimp->config->default_image));
+        gimp_config_duplicate (GIMP_CONFIG (context->gimp->config->default_image));
       viewable = GIMP_VIEWABLE (template);
 
       gimp_object_set_static_name (GIMP_OBJECT (template), _("Unnamed"));
     }
 
-  options->dialog =
-    gimp_viewable_dialog_new (viewable, context,
-                              title, role, icon_name, desc,
-                              parent,
-                              gimp_standard_help_func, help_id,
+  dialog = gimp_viewable_dialog_new (viewable, context,
+                                     title, role, icon_name, desc,
+                                     parent,
+                                     gimp_standard_help_func, help_id,
 
-                              GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-                              GTK_STOCK_OK,     GTK_RESPONSE_OK,
+                                     GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                                     GTK_STOCK_OK,     GTK_RESPONSE_OK,
 
-                              NULL);
+                                     NULL);
 
-  gtk_window_set_resizable (GTK_WINDOW (options->dialog), FALSE);
-  gtk_dialog_set_alternative_button_order (GTK_DIALOG (options->dialog),
+  gtk_dialog_set_alternative_button_order (GTK_DIALOG (dialog),
                                            GTK_RESPONSE_OK,
                                            GTK_RESPONSE_CANCEL,
                                            -1);
 
-  g_object_weak_ref (G_OBJECT (options->dialog),
-                     (GWeakNotify) template_options_dialog_free, options);
+  gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
+
+  g_object_weak_ref (G_OBJECT (dialog),
+                     (GWeakNotify) template_options_dialog_free, private);
+
+  g_signal_connect (dialog, "response",
+                    G_CALLBACK (template_options_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 (options->dialog))),
+  gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))),
                       vbox, TRUE, TRUE, 0);
   gtk_widget_show (vbox);
 
-  options->editor = gimp_template_editor_new (template, options->gimp, TRUE);
-  gtk_box_pack_start (GTK_BOX (vbox), options->editor, FALSE, FALSE, 0);
-  gtk_widget_show (options->editor);
+  private->editor = gimp_template_editor_new (template, context->gimp, TRUE);
+  gtk_box_pack_start (GTK_BOX (vbox), private->editor, FALSE, FALSE, 0);
+  gtk_widget_show (private->editor);
 
   g_object_unref (template);
 
-  return options;
+  return dialog;
 }
 
 
 /*  private functions  */
 
 static void
-template_options_dialog_free (TemplateOptionsDialog *dialog)
+template_options_dialog_free (TemplateOptionsDialog *private)
 {
-  g_slice_free (TemplateOptionsDialog, dialog);
+  g_slice_free (TemplateOptionsDialog, private);
+}
+
+static void
+template_options_dialog_response (GtkWidget             *dialog,
+                                  gint                   response_id,
+                                  TemplateOptionsDialog *private)
+{
+  if (response_id == GTK_RESPONSE_OK)
+    {
+      GimpTemplateEditor *editor = GIMP_TEMPLATE_EDITOR (private->editor);
+
+      private->callback (dialog,
+                         private->template,
+                         gimp_template_editor_get_template (editor),
+                         private->context,
+                         private->user_data);
+    }
+  else
+    {
+      gtk_widget_destroy (dialog);
+    }
 }
diff --git a/app/dialogs/template-options-dialog.h b/app/dialogs/template-options-dialog.h
index 41d6e21..0bb5389 100644
--- a/app/dialogs/template-options-dialog.h
+++ b/app/dialogs/template-options-dialog.h
@@ -19,26 +19,23 @@
 #define __TEMPLATE_OPTIONS_DIALOG_H__
 
 
-typedef struct _TemplateOptionsDialog TemplateOptionsDialog;
-
-struct _TemplateOptionsDialog
-{
-  GtkWidget    *dialog;
-  GtkWidget    *editor;
-
-  Gimp         *gimp;
-  GimpTemplate *template;
-};
-
-
-TemplateOptionsDialog * template_options_dialog_new (GimpTemplate *template,
-                                                     GimpContext  *context,
-                                                     GtkWidget    *parent,
-                                                     const gchar  *title,
-                                                     const gchar  *role,
-                                                     const gchar  *icon_name,
-                                                     const gchar  *desc,
-                                                     const gchar  *help_id);
+typedef void (* GimpTemplateOptionsCallback) (GtkWidget    *dialog,
+                                              GimpTemplate *template,
+                                              GimpTemplate *edit_template,
+                                              GimpContext  *context,
+                                              gpointer      user_data);
+
+
+GtkWidget * template_options_dialog_new (GimpTemplate                *template,
+                                         GimpContext                 *context,
+                                         GtkWidget                   *parent,
+                                         const gchar                 *title,
+                                         const gchar                 *role,
+                                         const gchar                 *icon_name,
+                                         const gchar                 *desc,
+                                         const gchar                 *help_id,
+                                         GimpTemplateOptionsCallback  callback,
+                                         gpointer                     user_data);
 
 
 #endif /* __TEMPLATE_OPTIONS_DIALOG_H__ */


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