[gimp] Bug 791315: Using the Gaussian Blur filter twice (Re-Show)...



commit 16b0110f72540b72964c72077b7de7e6ae4545c2
Author: Massimo Valentini <mvalentini src gnome org>
Date:   Fri Dec 29 14:55:20 2017 +0100

    Bug 791315: Using the Gaussian Blur filter twice (Re-Show)...
    
    ...only remembers horizontal radius, duplicates it for vertical
    
    Keep a list of the GUI's chain buttons around. When changing the
    entire config object like on reset or selecting saved settings, unlik
    them all after remembering their "active" state, and after changing
    the settings activate the ones that were active before, but only if
    the values they link are still the same.

 app/propgui/gimppropgui-generic.c |   11 ++++
 app/tools/gimpoperationtool.c     |   97 +++++++++++++++++++++++++++++++++++++
 2 files changed, 108 insertions(+), 0 deletions(-)
---
diff --git a/app/propgui/gimppropgui-generic.c b/app/propgui/gimppropgui-generic.c
index 3b73ee4..981d9d7 100644
--- a/app/propgui/gimppropgui-generic.c
+++ b/app/propgui/gimppropgui-generic.c
@@ -68,6 +68,7 @@ _gimp_prop_gui_new_generic (GObject                  *config,
 {
   GtkWidget    *main_vbox;
   GtkSizeGroup *label_group;
+  GList        *chains = NULL;
   gint          i;
 
   g_return_val_if_fail (G_IS_OBJECT (config), NULL);
@@ -155,6 +156,13 @@ _gimp_prop_gui_new_generic (GObject                  *config,
               g_object_set_data (G_OBJECT (chain), "binding", binding);
             }
 
+          g_object_set_data_full (G_OBJECT (chain), "x-property",
+                                  g_strdup (pspec->name), g_free);
+          g_object_set_data_full (G_OBJECT (chain), "y-property",
+                                  g_strdup (next_pspec->name), g_free);
+
+          chains = g_list_prepend (chains, chain);
+
           g_signal_connect (chain, "toggled",
                             G_CALLBACK (gimp_prop_gui_chain_toggled),
                             adj_x);
@@ -255,6 +263,9 @@ _gimp_prop_gui_new_generic (GObject                  *config,
 
   g_object_unref (label_group);
 
+  g_object_set_data_full (G_OBJECT (main_vbox), "chains", chains,
+                          (GDestroyNotify) g_list_free);
+
   return main_vbox;
 }
 
diff --git a/app/tools/gimpoperationtool.c b/app/tools/gimpoperationtool.c
index 72cd56d..04b26a0 100644
--- a/app/tools/gimpoperationtool.c
+++ b/app/tools/gimpoperationtool.c
@@ -111,6 +111,9 @@ static void        gimp_operation_tool_aux_input_detach(AuxInput          *input
 static void        gimp_operation_tool_aux_input_clear (AuxInput          *input);
 static void        gimp_operation_tool_aux_input_free  (AuxInput          *input);
 
+static void        gimp_operation_tool_unlink_chains   (GimpOperationTool *op_tool);
+static void        gimp_operation_tool_relink_chains   (GimpOperationTool *op_tool);
+
 
 G_DEFINE_TYPE (GimpOperationTool, gimp_operation_tool,
                GIMP_TYPE_FILTER_TOOL)
@@ -304,10 +307,14 @@ gimp_operation_tool_reset (GimpFilterTool *filter_tool)
 {
   GimpOperationTool *op_tool = GIMP_OPERATION_TOOL (filter_tool);
 
+  gimp_operation_tool_unlink_chains (op_tool);
+
   GIMP_FILTER_TOOL_CLASS (parent_class)->reset (filter_tool);
 
   if (filter_tool->config && GIMP_TOOL (op_tool)->drawable)
     gimp_operation_tool_sync_op (op_tool, TRUE);
+
+  gimp_operation_tool_relink_chains (op_tool);
 }
 
 static void
@@ -316,10 +323,14 @@ gimp_operation_tool_set_config (GimpFilterTool *filter_tool,
 {
   GimpOperationTool *op_tool = GIMP_OPERATION_TOOL (filter_tool);
 
+  gimp_operation_tool_unlink_chains (op_tool);
+
   GIMP_FILTER_TOOL_CLASS (parent_class)->set_config (filter_tool, config);
 
   if (filter_tool->config && GIMP_TOOL (op_tool)->drawable)
     gimp_operation_tool_sync_op (op_tool, FALSE);
+
+  gimp_operation_tool_relink_chains (op_tool);
 }
 
 static void
@@ -685,6 +696,92 @@ gimp_operation_tool_aux_input_free (AuxInput *input)
   g_slice_free (AuxInput, input);
 }
 
+static void
+gimp_operation_tool_unlink_chains (GimpOperationTool *op_tool)
+{
+  GObject *options_gui = g_weak_ref_get (&op_tool->options_gui_ref);
+  GList   *chains;
+
+  g_return_if_fail (options_gui != NULL);
+
+  chains = g_object_get_data (options_gui, "chains");
+
+  while (chains)
+    {
+      GimpChainButton *chain = chains->data;
+      gboolean         active;
+
+      active = gimp_chain_button_get_active (chain);
+
+      g_object_set_data (G_OBJECT (chain), "was-active",
+                         GINT_TO_POINTER (active));
+
+      if (active)
+        {
+          gimp_chain_button_set_active (chain, FALSE);
+
+          g_signal_emit_by_name (chain, "toggled");
+        }
+
+      chains = chains->next;
+    }
+
+  g_object_unref (options_gui);
+}
+
+static void
+gimp_operation_tool_relink_chains (GimpOperationTool *op_tool)
+{
+  GimpFilterTool *filter_tool = GIMP_FILTER_TOOL (op_tool);
+  GObject        *options_gui = g_weak_ref_get (&op_tool->options_gui_ref);
+  GList          *chains;
+
+  g_return_if_fail (options_gui != NULL);
+
+  chains = g_object_get_data (options_gui, "chains");
+
+  while (chains)
+    {
+      GimpChainButton *chain = chains->data;
+
+      if (g_object_get_data (G_OBJECT (chain), "was-active"))
+        {
+          const gchar *name_x    = g_object_get_data (chains->data, "x-property");
+          const gchar *name_y    = g_object_get_data (chains->data, "y-property");
+          const gchar *names[2]  = { name_x, name_y };
+          GValue       values[2] = { G_VALUE_INIT, G_VALUE_INIT };
+          GValue       double_x  = G_VALUE_INIT;
+          GValue       double_y  = G_VALUE_INIT;
+
+          g_object_getv (filter_tool->config, 2, names, values);
+
+          g_value_init (&double_x, G_TYPE_DOUBLE);
+          g_value_init (&double_y, G_TYPE_DOUBLE);
+
+          if (g_value_transform (&values[0], &double_x) &&
+              g_value_transform (&values[1], &double_y) &&
+              g_value_get_double (&double_x) ==
+              g_value_get_double (&double_y))
+            {
+              gimp_chain_button_set_active (chain, TRUE);
+
+              g_signal_emit_by_name (chain, "toggled");
+            }
+
+          g_value_unset (&double_x);
+          g_value_unset (&double_y);
+          g_value_unset (&values[0]);
+          g_value_unset (&values[1]);
+
+          g_object_set_data (G_OBJECT (chain), "was-active", NULL);
+        }
+
+      chains = chains->next;
+    }
+
+  g_object_unref (options_gui);
+}
+
 
 /*  public functions  */
 


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