[gimp] app: replace the hue-saturation tool by a generic filter action



commit 109f23af39701adcd819750430dc4d30008a195e
Author: Michael Natterer <mitch gimp org>
Date:   Mon Jun 5 18:29:07 2017 +0200

    app: replace the hue-saturation tool by a generic filter action
    
    Move the GUI to a custom gimppropgui function.

 app/actions/filters-actions.c               |    6 +
 app/operations/gimpoperationhuesaturation.c |    4 +-
 app/tools/Makefile.am                       |    2 -
 app/tools/gimp-tools.c                      |    2 -
 app/tools/gimphuesaturationtool.c           |  454 ---------------------------
 app/tools/gimphuesaturationtool.h           |   57 ----
 app/widgets/Makefile.am                     |    2 +
 app/widgets/gimppropgui-hue-saturation.c    |  286 +++++++++++++++++
 app/widgets/gimppropgui-hue-saturation.h    |   34 ++
 app/widgets/gimppropgui.c                   |    3 +
 menus/image-menu.xml.in                     |    3 +-
 po/POTFILES.in                              |    3 +-
 12 files changed, 337 insertions(+), 519 deletions(-)
---
diff --git a/app/actions/filters-actions.c b/app/actions/filters-actions.c
index 800202d..29189a9 100644
--- a/app/actions/filters-actions.c
+++ b/app/actions/filters-actions.c
@@ -368,6 +368,11 @@ static const GimpStringActionEntry filters_interactive_actions[] =
     "gegl:hue-chroma",
     GIMP_HELP_FILTER_HUE_CHROMA },
 
+  { "filters-hue-saturation", GIMP_ICON_TOOL_HUE_SATURATION,
+    NC_("filters-action", "Hue-_Saturation..."), NULL, NULL,
+    "gimp:hue-saturation",
+    GIMP_HELP_TOOL_HUE_SATURATION },
+
   { "filters-illusion", GIMP_ICON_GEGL,
     NC_("filters-action", "_Illusion..."), NULL, NULL,
     "gegl:illusion",
@@ -828,6 +833,7 @@ filters_actions_update (GimpActionGroup *group,
   SET_SENSITIVE ("filters-grid",                    writable);
   SET_SENSITIVE ("filters-high-pass",               writable);
   SET_SENSITIVE ("filters-hue-chroma",              writable);
+  SET_SENSITIVE ("filters-hue-saturation",          writable && !gray);
   SET_SENSITIVE ("filters-illusion",                writable);
   SET_SENSITIVE ("filters-invert-linear",           writable);
   SET_SENSITIVE ("filters-invert-perceptual",       writable);
diff --git a/app/operations/gimpoperationhuesaturation.c b/app/operations/gimpoperationhuesaturation.c
index 7dbc69a..b769cff 100644
--- a/app/operations/gimpoperationhuesaturation.c
+++ b/app/operations/gimpoperationhuesaturation.c
@@ -32,6 +32,8 @@
 #include "gimphuesaturationconfig.h"
 #include "gimpoperationhuesaturation.h"
 
+#include "gimp-intl.h"
+
 
 static gboolean gimp_operation_hue_saturation_process (GeglOperation       *operation,
                                                        void                *in_buf,
@@ -60,7 +62,7 @@ gimp_operation_hue_saturation_class_init (GimpOperationHueSaturationClass *klass
   gegl_operation_class_set_keys (operation_class,
                                  "name",        "gimp:hue-saturation",
                                  "categories",  "color",
-                                 "description", "GIMP Hue-Saturation operation",
+                                 "description", _("Adjust hue, saturation, and lightness"),
                                  NULL);
 
   point_class->process = gimp_operation_hue_saturation_process;
diff --git a/app/tools/Makefile.am b/app/tools/Makefile.am
index 1fbe7b6..02257f9 100644
--- a/app/tools/Makefile.am
+++ b/app/tools/Makefile.am
@@ -106,8 +106,6 @@ libapptools_a_sources = \
        gimphealtool.h                  \
        gimphistogramoptions.c          \
        gimphistogramoptions.h          \
-       gimphuesaturationtool.c         \
-       gimphuesaturationtool.h         \
        gimpinkoptions-gui.c            \
        gimpinkoptions-gui.h            \
        gimpinktool.c                   \
diff --git a/app/tools/gimp-tools.c b/app/tools/gimp-tools.c
index f7c31ea..1418faf 100644
--- a/app/tools/gimp-tools.c
+++ b/app/tools/gimp-tools.c
@@ -60,7 +60,6 @@
 #include "gimpgegltool.h"
 #include "gimphandletransformtool.h"
 #include "gimphealtool.h"
-#include "gimphuesaturationtool.h"
 #include "gimpinktool.h"
 #include "gimpiscissorstool.h"
 #include "gimplevelstool.h"
@@ -175,7 +174,6 @@ gimp_tools_init (Gimp *gimp)
 
     /*  color tools  */
 
-    gimp_hue_saturation_tool_register,
     gimp_brightness_contrast_tool_register,
     gimp_threshold_tool_register,
     gimp_levels_tool_register,
diff --git a/app/widgets/Makefile.am b/app/widgets/Makefile.am
index 87366c0..ad0a5ce 100644
--- a/app/widgets/Makefile.am
+++ b/app/widgets/Makefile.am
@@ -315,6 +315,8 @@ libappwidgets_a_sources = \
        gimppropgui-eval.h              \
        gimppropgui-generic.c           \
        gimppropgui-generic.h           \
+       gimppropgui-hue-saturation.c    \
+       gimppropgui-hue-saturation.h    \
        gimppropwidgets.c               \
        gimppropwidgets.h               \
        gimpradioaction.c               \
diff --git a/app/widgets/gimppropgui-hue-saturation.c b/app/widgets/gimppropgui-hue-saturation.c
new file mode 100644
index 0000000..df54137
--- /dev/null
+++ b/app/widgets/gimppropgui-hue-saturation.c
@@ -0,0 +1,286 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995-1997 Spencer Kimball and Peter Mattis
+ *
+ * gimppropgui-hue-saturation.c
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <gegl.h>
+#include <gtk/gtk.h>
+
+#include "libgimpwidgets/gimpwidgets.h"
+
+#include "widgets-types.h"
+
+#include "operations/gimphuesaturationconfig.h"
+#include "operations/gimpoperationhuesaturation.h"
+
+#include "core/gimpcontext.h"
+
+#include "gimppropgui.h"
+#include "gimppropgui-hue-saturation.h"
+#include "gimppropwidgets.h"
+
+#include "gimp-intl.h"
+
+
+#define COLOR_WIDTH  40
+#define COLOR_HEIGHT 20
+
+
+static void
+hue_saturation_config_notify (GObject          *object,
+                              const GParamSpec *pspec,
+                              GtkWidget        *color_area)
+{
+  GimpHueSaturationConfig *config = GIMP_HUE_SATURATION_CONFIG (object);
+  GimpHueRange             range;
+  GimpRGB                  color;
+
+  static const GimpRGB default_colors[7] =
+  {
+    {   0,   0,   0, },
+    { 1.0,   0,   0, },
+    { 1.0, 1.0,   0, },
+    {   0, 1.0,   0, },
+    {   0, 1.0, 1.0, },
+    {   0,   0, 1.0, },
+    { 1.0,   0, 1.0, }
+  };
+
+  range = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (color_area),
+                                              "hue-range"));
+  color = default_colors[range];
+
+  gimp_operation_hue_saturation_map (config, &color, range, &color);
+
+  gimp_color_area_set_color (GIMP_COLOR_AREA (color_area), &color);
+}
+
+static void
+hue_saturation_range_callback (GtkWidget *widget,
+                               GObject   *config)
+{
+  if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)))
+    {
+      GimpHueRange range;
+
+      gimp_radio_button_update (widget, &range);
+      g_object_set (config,
+                    "range", range,
+                    NULL);
+    }
+}
+
+static void
+hue_saturation_range_notify (GObject          *object,
+                             const GParamSpec *pspec,
+                             GtkWidget        *range_radio)
+{
+  GimpHueSaturationConfig *config = GIMP_HUE_SATURATION_CONFIG (object);
+
+  gimp_int_radio_group_set_active (GTK_RADIO_BUTTON (range_radio),
+                                   config->range);
+}
+
+GtkWidget *
+_gimp_prop_gui_new_hue_saturation (GObject              *config,
+                                   GParamSpec          **param_specs,
+                                   guint                 n_param_specs,
+                                   GeglRectangle        *area,
+                                   GimpContext          *context,
+                                   GimpCreatePickerFunc  create_picker_func,
+                                   gpointer              picker_creator)
+{
+  GtkWidget *main_vbox;
+  GtkWidget *frame;
+  GtkWidget *vbox;
+  GtkWidget *abox;
+  GtkWidget *table;
+  GtkWidget *scale;
+  GtkWidget *button;
+  GtkWidget *hbox;
+  GtkWidget *range_radio;
+  GSList    *group = NULL;
+  gint       i;
+
+  const struct
+  {
+    const gchar *label;
+    const gchar *tooltip;
+    gint         label_col;
+    gint         label_row;
+    gint         frame_col;
+    gint         frame_row;
+  }
+  hue_range_table[] =
+  {
+    { N_("M_aster"), N_("Adjust all colors"), 2, 3, 0, 0 },
+    { N_("_R"),      N_("Red"),               2, 1, 2, 0 },
+    { N_("_Y"),      N_("Yellow"),            1, 2, 0, 2 },
+    { N_("_G"),      N_("Green"),             1, 4, 0, 4 },
+    { N_("_C"),      N_("Cyan"),              2, 5, 2, 6 },
+    { N_("_B"),      N_("Blue"),              3, 4, 4, 4 },
+    { N_("_M"),      N_("Magenta"),           3, 2, 4, 2 }
+  };
+
+  g_return_val_if_fail (G_IS_OBJECT (config), NULL);
+  g_return_val_if_fail (param_specs != NULL, NULL);
+  g_return_val_if_fail (n_param_specs > 0, NULL);
+  g_return_val_if_fail (GIMP_IS_CONTEXT (context), NULL);
+
+  main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 4);
+
+  frame = gimp_frame_new (_("Select Primary Color to Adjust"));
+  gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
+  gtk_widget_show (frame);
+
+  vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
+  gtk_container_add (GTK_CONTAINER (frame), vbox);
+  gtk_widget_show (vbox);
+
+  abox = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
+  gtk_box_pack_start (GTK_BOX (vbox), abox, TRUE, TRUE, 0);
+  gtk_widget_show (abox);
+
+  /*  The table containing hue ranges  */
+  table = gtk_table_new (7, 5, FALSE);
+  gtk_table_set_col_spacing (GTK_TABLE (table), 0, 4);
+  gtk_table_set_col_spacing (GTK_TABLE (table), 3, 4);
+  gtk_table_set_row_spacing (GTK_TABLE (table), 0, 2);
+  gtk_table_set_row_spacing (GTK_TABLE (table), 5, 2);
+  gtk_container_add (GTK_CONTAINER (abox), table);
+
+  /*  the radio buttons for hue ranges  */
+  for (i = 0; i < G_N_ELEMENTS (hue_range_table); i++)
+    {
+      button = gtk_radio_button_new_with_mnemonic (group,
+                                                   gettext (hue_range_table[i].label));
+      group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (button));
+      g_object_set_data (G_OBJECT (button), "gimp-item-data",
+                         GINT_TO_POINTER (i));
+
+      gimp_help_set_help_data (button,
+                               gettext (hue_range_table[i].tooltip),
+                               NULL);
+
+      if (i == 0)
+        {
+          gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
+
+          range_radio = button;
+        }
+
+      gtk_table_attach (GTK_TABLE (table), button,
+                        hue_range_table[i].label_col,
+                        hue_range_table[i].label_col + 1,
+                        hue_range_table[i].label_row,
+                        hue_range_table[i].label_row + 1,
+                        GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
+
+      if (i > 0)
+        {
+          GtkWidget *color_area;
+          GimpRGB    color = { 0, };
+
+          frame = gtk_frame_new (NULL);
+          gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
+          gtk_table_attach (GTK_TABLE (table), frame,
+                            hue_range_table[i].frame_col,
+                            hue_range_table[i].frame_col + 1,
+                            hue_range_table[i].frame_row,
+                            hue_range_table[i].frame_row + 1,
+                            GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
+          gtk_widget_show (frame);
+
+          color_area = gimp_color_area_new (&color, GIMP_COLOR_AREA_FLAT, 0);
+          gtk_widget_set_size_request (color_area, COLOR_WIDTH, COLOR_HEIGHT);
+          gtk_container_add (GTK_CONTAINER (frame), color_area);
+          gtk_widget_show (color_area);
+
+          g_object_set_data (G_OBJECT (color_area), "hue-range",
+                             GINT_TO_POINTER (i));
+          g_signal_connect_object (config, "notify",
+                                   G_CALLBACK (hue_saturation_config_notify),
+                                   color_area, 0);
+          hue_saturation_config_notify (config, NULL, color_area);
+        }
+
+      g_signal_connect (button, "toggled",
+                        G_CALLBACK (hue_saturation_range_callback),
+                        config);
+
+      gtk_widget_show (button);
+    }
+
+  gtk_widget_show (table);
+
+  /* Create the 'Overlap' option slider */
+  scale = gimp_prop_spin_scale_new (config, "overlap",
+                                    _("_Overlap"), 0.01, 0.1, 0);
+  gimp_prop_widget_set_factor (scale, 100.0, 0.0, 0.0, 1);
+  gtk_box_pack_start (GTK_BOX (vbox), scale, FALSE, FALSE, 0);
+  gtk_widget_show (scale);
+
+  frame = gimp_frame_new (_("Adjust Selected Color"));
+  gtk_box_pack_start (GTK_BOX (main_vbox), frame, FALSE, FALSE, 0);
+  gtk_widget_show (frame);
+
+  vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 4);
+  gtk_container_add (GTK_CONTAINER (frame), vbox);
+  gtk_widget_show (vbox);
+
+  /*  Create the hue scale widget  */
+  scale = gimp_prop_spin_scale_new (config, "hue",
+                                    _("_Hue"), 1.0 / 180.0, 15.0 / 180.0, 0);
+  gimp_prop_widget_set_factor (scale, 180.0, 0.0, 0.0, 1);
+  gtk_box_pack_start (GTK_BOX (vbox), scale, FALSE, FALSE, 0);
+  gtk_widget_show (scale);
+
+  /*  Create the lightness scale widget  */
+  scale = gimp_prop_spin_scale_new (config, "lightness",
+                                    _("_Lightness"), 0.01, 0.1, 0);
+  gimp_prop_widget_set_factor (scale, 100.0, 0.0, 0.0, 1);
+  gtk_box_pack_start (GTK_BOX (vbox), scale, FALSE, FALSE, 0);
+  gtk_widget_show (scale);
+
+  /*  Create the saturation scale widget  */
+  scale = gimp_prop_spin_scale_new (config, "saturation",
+                                    _("_Saturation"), 0.01, 0.1, 0);
+  gimp_prop_widget_set_factor (scale, 100.0, 0.0, 0.0, 1);
+  gtk_box_pack_start (GTK_BOX (vbox), scale, FALSE, FALSE, 0);
+  gtk_widget_show (scale);
+
+  hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
+  gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
+  gtk_widget_show (hbox);
+
+  button = gtk_button_new_with_mnemonic (_("R_eset Color"));
+  gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
+  gtk_widget_show (button);
+
+  g_signal_connect_swapped (button, "clicked",
+                            G_CALLBACK (gimp_hue_saturation_config_reset_range),
+                            config);
+
+  g_signal_connect_object (config, "notify::range",
+                           G_CALLBACK (hue_saturation_range_notify),
+                           range_radio, 0);
+  hue_saturation_range_notify (config, NULL, range_radio);
+
+  return main_vbox;
+}
diff --git a/app/widgets/gimppropgui-hue-saturation.h b/app/widgets/gimppropgui-hue-saturation.h
new file mode 100644
index 0000000..e349e2e
--- /dev/null
+++ b/app/widgets/gimppropgui-hue-saturation.h
@@ -0,0 +1,34 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995-1997 Spencer Kimball and Peter Mattis
+ *
+ * gimppropgui-hue-saturation.h
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __GIMP_PROP_GUI_HUE_SATURATION_H__
+#define __GIMP_PROP_GUI_HUE_SATURATION_H__
+
+
+GtkWidget *
+_gimp_prop_gui_new_hue_saturation (GObject              *config,
+                                   GParamSpec          **param_specs,
+                                   guint                 n_param_specs,
+                                   GeglRectangle        *area,
+                                   GimpContext          *context,
+                                   GimpCreatePickerFunc  create_picker_func,
+                                   gpointer              picker_creator);
+
+
+#endif /* __GIMP_PROP_GUI_HUE_SATURATION_H__ */
diff --git a/app/widgets/gimppropgui.c b/app/widgets/gimppropgui.c
index 8241931..2c1e281 100644
--- a/app/widgets/gimppropgui.c
+++ b/app/widgets/gimppropgui.c
@@ -50,6 +50,7 @@
 #include "gimppropgui-diffration-patterns.h"
 #include "gimppropgui-eval.h"
 #include "gimppropgui-generic.h"
+#include "gimppropgui-hue-saturation.h"
 #include "gimppropwidgets.h"
 #include "gimpwidgets-utils.h"
 
@@ -438,6 +439,8 @@ gui_new_funcs[] =
 {
   { "GimpColorBalanceConfig",
     _gimp_prop_gui_new_color_balance },
+  { "GimpHueSaturationConfig",
+    _gimp_prop_gui_new_hue_saturation },
   { "GimpGegl-gegl-color-rotate-config",
     _gimp_prop_gui_new_color_rotate },
   { "GimpGegl-gegl-convolution-matrix-config",
diff --git a/menus/image-menu.xml.in b/menus/image-menu.xml.in
index adef32d..ca4ad03 100644
--- a/menus/image-menu.xml.in
+++ b/menus/image-menu.xml.in
@@ -559,7 +559,7 @@
       <menuitem action="filters-color-balance" />
       <menuitem action="filters-color-temperature" />
       <menuitem action="filters-hue-chroma" />
-      <menuitem action="tools-hue-saturation" />
+      <menuitem action="filters-hue-saturation" />
       <menuitem action="filters-saturation" />
       <menuitem action="filters-exposure" />
       <menuitem action="tools-brightness-contrast" />
@@ -664,7 +664,6 @@
        -->
       </menu>
       <menu action="tools-color-menu" name="Color Tools">
-        <menuitem action="tools-hue-saturation" />
         <menuitem action="tools-brightness-contrast" />
         <menuitem action="tools-threshold" />
         <menuitem action="tools-levels" />
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 68d85c7..701a277 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -274,6 +274,7 @@ app/operations/gimpoperationcagetransform.c
 app/operations/gimpoperationcolorbalance.c
 app/operations/gimpoperationcolorize.c
 app/operations/gimpoperationdesaturate.c
+app/operations/gimpoperationhuesaturation.c
 app/operations/gimpoperationposterize.c
 app/operations/gimpoperationsemiflatten.c
 app/operations/gimpoperationthreshold.c
@@ -409,7 +410,6 @@ app/tools/gimphandletransformoptions.c
 app/tools/gimphandletransformtool.c
 app/tools/gimphealtool.c
 app/tools/gimphistogramoptions.c
-app/tools/gimphuesaturationtool.c
 app/tools/gimpinkoptions-gui.c
 app/tools/gimpinktool.c
 app/tools/gimpiscissorsoptions.c
@@ -543,6 +543,7 @@ app/widgets/gimppropgui-color-rotate.c
 app/widgets/gimppropgui-convolution-matrix.c
 app/widgets/gimppropgui-diffration-patterns.c
 app/widgets/gimppropgui-generic.c
+app/widgets/gimppropgui-hue-saturation.c
 app/widgets/gimppropgui.c
 app/widgets/gimppropwidgets.c
 app/widgets/gimpsavedialog.c


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