[gimp] Bug 791315: Using the Gaussian Blur filter twice (Re-Show)...
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] Bug 791315: Using the Gaussian Blur filter twice (Re-Show)...
- Date: Sun, 18 Mar 2018 16:39:55 +0000 (UTC)
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]