[gimp] libgimpwidgets: make using GimpColorProfileComboBox easier



commit 661317f74c5314d3f8617814311e9f23e3b4e60b
Author: Michael Natterer <mitch gimp org>
Date:   Fri Apr 4 17:09:54 2014 +0200

    libgimpwidgets: make using GimpColorProfileComboBox easier
    
    If the passed dialog is a GimpColorProfileChooserDialog, handle its
    "response" signal automatically and also destroy it when the combo box
    is destroyed (before we leaked all dialogs). Remove the same callback
    from all places using GimpColorProfileComboBox.

 app/dialogs/preferences-dialog.c          |   26 ----------------
 libgimpwidgets/gimpcolorprofilecombobox.c |   46 +++++++++++++++++++++++++++++
 modules/display-filter-proof.c            |   24 ---------------
 plug-ins/common/lcms.c                    |   27 +----------------
 4 files changed, 47 insertions(+), 76 deletions(-)
---
diff --git a/app/dialogs/preferences-dialog.c b/app/dialogs/preferences-dialog.c
index 816ea31..6541597 100644
--- a/app/dialogs/preferences-dialog.c
+++ b/app/dialogs/preferences-dialog.c
@@ -777,28 +777,6 @@ prefs_table_new (gint          rows,
 }
 
 static void
-prefs_profile_combo_dialog_response (GimpColorProfileChooserDialog *dialog,
-                                     gint                           response,
-                                     GimpColorProfileComboBox      *combo)
-{
-  if (response == GTK_RESPONSE_ACCEPT)
-    {
-      gchar *filename;
-
-      filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
-
-      if (filename)
-        {
-          gimp_color_profile_combo_box_set_active (combo, filename, NULL);
-
-          g_free (filename);
-        }
-    }
-
-  gtk_widget_hide (GTK_WIDGET (dialog));
-}
-
-static void
 prefs_profile_combo_changed (GimpColorProfileComboBox *combo,
                              GObject                  *config)
 {
@@ -855,10 +833,6 @@ prefs_profile_combo_box_new (GObject      *config,
 
   g_free (filename);
 
-  g_signal_connect (dialog, "response",
-                    G_CALLBACK (prefs_profile_combo_dialog_response),
-                    combo);
-
   g_signal_connect (combo, "changed",
                     G_CALLBACK (prefs_profile_combo_changed),
                     config);
diff --git a/libgimpwidgets/gimpcolorprofilecombobox.c b/libgimpwidgets/gimpcolorprofilecombobox.c
index 2878c3c..8a6abc4 100644
--- a/libgimpwidgets/gimpcolorprofilecombobox.c
+++ b/libgimpwidgets/gimpcolorprofilecombobox.c
@@ -32,6 +32,7 @@
 
 #include "gimpwidgetstypes.h"
 
+#include "gimpcolorprofilechooserdialog.h"
 #include "gimpcolorprofilecombobox.h"
 #include "gimpcolorprofilestore.h"
 #include "gimpcolorprofilestore-private.h"
@@ -80,6 +81,10 @@ static gboolean  gimp_color_profile_row_separator_func (GtkTreeModel *model,
                                                         GtkTreeIter  *iter,
                                                         gpointer      data);
 
+static void  gimp_color_profile_combo_dialog_response  (GimpColorProfileChooserDialog *dialog,
+                                                        gint                           response,
+                                                        GimpColorProfileComboBox      *combo);
+
 
 G_DEFINE_TYPE (GimpColorProfileComboBox,
                gimp_color_profile_combo_box, GTK_TYPE_COMBO_BOX)
@@ -162,6 +167,9 @@ gimp_color_profile_combo_box_finalize (GObject *object)
 
   if (combo->dialog)
     {
+      if (GIMP_IS_COLOR_PROFILE_CHOOSER_DIALOG (combo->dialog))
+        gtk_widget_destroy (combo->dialog);
+
       g_object_unref (combo->dialog);
       combo->dialog = NULL;
     }
@@ -190,6 +198,11 @@ gimp_color_profile_combo_box_set_property (GObject      *object,
     case PROP_DIALOG:
       g_return_if_fail (combo_box->dialog == NULL);
       combo_box->dialog = g_value_dup_object (value);
+
+      if (GIMP_IS_COLOR_PROFILE_CHOOSER_DIALOG (combo_box->dialog))
+        g_signal_connect (combo_box->dialog, "response",
+                          G_CALLBACK (gimp_color_profile_combo_dialog_response),
+                          combo_box);
       break;
 
     case PROP_MODEL:
@@ -296,6 +309,17 @@ gimp_color_profile_combo_box_changed (GtkComboBox *combo)
  *  gchar *history = gimp_personal_rc_file ("profilerc");
  * </programlisting></informalexample>
  *
+ * The recommended @dialog type to use is a #GimpColorProfileChooserDialog.
+ * If a #GimpColorProfileChooserDialog is passed, #GimpColorProfileComboBox
+ * will take complete control over the dialog, which means connecting
+ * a GtkDialog::response() callback by itself, and take care of destroying
+ * the dialog when the combo box is destroyed.
+ *
+ * If another type of @dialog is passed, this has to be implemented
+ * separately.
+ *
+ * See also gimp_color_profile_combo_box_new_with_model().
+ *
  * Return value: a new #GimpColorProfileComboBox.
  *
  * Since: GIMP 2.4
@@ -493,3 +517,25 @@ gimp_color_profile_row_separator_func (GtkTreeModel *model,
       return FALSE;
     }
 }
+
+static void
+gimp_color_profile_combo_dialog_response (GimpColorProfileChooserDialog *dialog,
+                                          gint                           response,
+                                          GimpColorProfileComboBox      *combo)
+{
+  if (response == GTK_RESPONSE_ACCEPT)
+    {
+      gchar *filename;
+
+      filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
+
+      if (filename)
+        {
+          gimp_color_profile_combo_box_set_active (combo, filename, NULL);
+
+          g_free (filename);
+        }
+    }
+
+  gtk_widget_hide (GTK_WIDGET (dialog));
+}
diff --git a/modules/display-filter-proof.c b/modules/display-filter-proof.c
index 5868065..839c0a5 100644
--- a/modules/display-filter-proof.c
+++ b/modules/display-filter-proof.c
@@ -260,26 +260,6 @@ cdisplay_proof_convert_buffer (GimpColorDisplay *display,
 }
 
 static void
-cdisplay_proof_file_chooser_dialog_response (GtkFileChooser           *dialog,
-                                             gint                      response,
-                                             GimpColorProfileComboBox *combo)
-{
-  if (response == GTK_RESPONSE_ACCEPT)
-    {
-      gchar *filename = gtk_file_chooser_get_filename (dialog);
-
-      if (filename)
-        {
-          gimp_color_profile_combo_box_set_active (combo, filename, NULL);
-
-          g_free (filename);
-        }
-    }
-
-  gtk_widget_hide (GTK_WIDGET (dialog));
-}
-
-static void
 cdisplay_proof_profile_changed (GtkWidget     *combo,
                                 CdisplayProof *proof)
 {
@@ -314,10 +294,6 @@ cdisplay_proof_configure (GimpColorDisplay *display)
   combo = gimp_color_profile_combo_box_new (dialog, history);
   g_free (history);
 
-  g_signal_connect (dialog, "response",
-                    G_CALLBACK (cdisplay_proof_file_chooser_dialog_response),
-                    combo);
-
   g_signal_connect (combo, "changed",
                     G_CALLBACK (cdisplay_proof_profile_changed),
                     proof);
diff --git a/plug-ins/common/lcms.c b/plug-ins/common/lcms.c
index 49b1dec..68ba439 100644
--- a/plug-ins/common/lcms.c
+++ b/plug-ins/common/lcms.c
@@ -1237,26 +1237,6 @@ lcms_icc_apply_dialog (gint32       image,
   return run;
 }
 
-static void
-lcms_icc_file_chooser_dialog_response (GtkFileChooser           *dialog,
-                                       gint                      response,
-                                       GimpColorProfileComboBox *combo)
-{
-  if (response == GTK_RESPONSE_ACCEPT)
-    {
-      gchar *filename = gtk_file_chooser_get_filename (dialog);
-
-      if (filename)
-        {
-          gimp_color_profile_combo_box_set_active (combo, filename, NULL);
-
-          g_free (filename);
-        }
-    }
-
-  gtk_widget_hide (GTK_WIDGET (dialog));
-}
-
 static GtkWidget *
 lcms_icc_combo_box_new (GimpColorConfig *config,
                         const gchar     *filename)
@@ -1270,16 +1250,11 @@ lcms_icc_combo_box_new (GimpColorConfig *config,
   cmsHPROFILE  profile      = NULL;
 
   dialog = gimp_color_profile_chooser_dialog_new (_("Select destination profile"));
-  history = gimp_personal_rc_file ("profilerc");
 
+  history = gimp_personal_rc_file ("profilerc");
   combo = gimp_color_profile_combo_box_new (dialog, history);
-
   g_free (history);
 
-  g_signal_connect (dialog, "response",
-                    G_CALLBACK (lcms_icc_file_chooser_dialog_response),
-                    combo);
-
   if (config->rgb_profile)
     {
       GError *error = NULL;


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