[gimp] app: move the "visible" property from GimpItem to GimpFilter



commit 7ae81e70b989101fa32ddae9687651039ba3ffda
Author: Michael Natterer <mitch gimp org>
Date:   Sun May 1 14:25:37 2016 +0200

    app: move the "visible" property from GimpItem to GimpFilter
    
    Same for the "visibility_changed" signal. GimpItem keeps its
    visibility API because it adds undo over GimpItem's API.

 app/core/gimpdrawable.c |   81 +++++++++++-------------
 app/core/gimpfilter.c   |  160 ++++++++++++++++++++++++++++++++++++++++-------
 app/core/gimpfilter.h   |   11 +++-
 app/core/gimpitem.c     |   66 +------------------
 app/core/gimpitem.h     |    1 -
 5 files changed, 189 insertions(+), 130 deletions(-)
---
diff --git a/app/core/gimpdrawable.c b/app/core/gimpdrawable.c
index 570330f..bad00f4 100644
--- a/app/core/gimpdrawable.c
+++ b/app/core/gimpdrawable.c
@@ -93,10 +93,10 @@ static gboolean   gimp_drawable_get_size           (GimpViewable      *viewable,
                                                     gint              *width,
                                                     gint              *height);
 
+static void       gimp_drawable_visibility_changed (GimpFilter        *filter);
 static GeglNode * gimp_drawable_get_node           (GimpFilter        *filter);
 
 static void       gimp_drawable_removed            (GimpItem          *item);
-static void       gimp_drawable_visibility_changed (GimpItem          *item);
 static GimpItem * gimp_drawable_duplicate          (GimpItem          *item,
                                                     GType              new_type);
 static void       gimp_drawable_scale              (GimpItem          *item,
@@ -256,10 +256,10 @@ gimp_drawable_class_init (GimpDrawableClass *klass)
   viewable_class->get_new_preview    = gimp_drawable_get_new_preview;
   viewable_class->get_new_pixbuf     = gimp_drawable_get_new_pixbuf;
 
+  filter_class->visibility_changed   = gimp_drawable_visibility_changed;
   filter_class->get_node             = gimp_drawable_get_node;
 
   item_class->removed                = gimp_drawable_removed;
-  item_class->visibility_changed     = gimp_drawable_visibility_changed;
   item_class->duplicate              = gimp_drawable_duplicate;
   item_class->scale                  = gimp_drawable_scale;
   item_class->resize                 = gimp_drawable_resize;
@@ -417,6 +417,40 @@ gimp_drawable_get_size (GimpViewable *viewable,
   return TRUE;
 }
 
+static void
+gimp_drawable_visibility_changed (GimpFilter *filter)
+{
+  GimpDrawable *drawable = GIMP_DRAWABLE (filter);
+  GeglNode     *node;
+
+  /*  don't use gimp_filter_get_node() because that would create
+   *  the node.
+   */
+  node = gimp_filter_peek_node (filter);
+
+  if (node)
+    {
+      GeglNode *input  = gegl_node_get_input_proxy  (node, "input");
+      GeglNode *output = gegl_node_get_output_proxy (node, "output");
+
+      if (gimp_filter_get_visible (filter))
+        {
+          gegl_node_connect_to (input,                        "output",
+                                drawable->private->mode_node, "input");
+          gegl_node_connect_to (drawable->private->mode_node, "output",
+                                output,                       "input");
+        }
+      else
+        {
+          gegl_node_disconnect (drawable->private->mode_node, "input");
+
+          /* The rest handled by GimpFilter */
+        }
+    }
+
+  GIMP_FILTER_CLASS (parent_class)->visibility_changed (filter);
+}
+
 static GeglNode *
 gimp_drawable_get_node (GimpFilter *filter)
 {
@@ -437,7 +471,7 @@ gimp_drawable_get_node (GimpFilter *filter)
   input  = gegl_node_get_input_proxy  (node, "input");
   output = gegl_node_get_output_proxy (node, "output");
 
-  if (gimp_item_get_visible (GIMP_ITEM (drawable)))
+  if (gimp_filter_get_visible (filter))
     {
       gegl_node_connect_to (input,                        "output",
                             drawable->private->mode_node, "input");
@@ -446,8 +480,7 @@ gimp_drawable_get_node (GimpFilter *filter)
     }
   else
     {
-      gegl_node_connect_to (input,  "output",
-                            output, "input");
+      /* Handled by GimpFilter */
     }
 
   return node;
@@ -464,44 +497,6 @@ gimp_drawable_removed (GimpItem *item)
     GIMP_ITEM_CLASS (parent_class)->removed (item);
 }
 
-static void
-gimp_drawable_visibility_changed (GimpItem *item)
-{
-  GimpDrawable *drawable = GIMP_DRAWABLE (item);
-  GeglNode     *node;
-
-  /*  don't use gimp_filter_get_node() because that would create
-   *  the node.
-   */
-  node = gimp_filter_peek_node (GIMP_FILTER (item));
-
-  if (node)
-    {
-      GeglNode *input  = gegl_node_get_input_proxy  (node, "input");
-      GeglNode *output = gegl_node_get_output_proxy (node, "output");
-
-      if (gimp_item_get_visible (item))
-        {
-          gegl_node_connect_to (input,                        "output",
-                                drawable->private->mode_node, "input");
-          gegl_node_connect_to (drawable->private->mode_node, "output",
-                                output,                       "input");
-        }
-      else
-        {
-          gegl_node_disconnect (drawable->private->mode_node, "input");
-
-          gegl_node_connect_to (input,  "output",
-                                output, "input");
-        }
-
-      /* FIXME: chain up again when above floating sel special case is gone */
-      return;
-    }
-
-  GIMP_ITEM_CLASS (parent_class)->visibility_changed (item);
-}
-
 static GimpItem *
 gimp_drawable_duplicate (GimpItem *item,
                          GType     new_type)
diff --git a/app/core/gimpfilter.c b/app/core/gimpfilter.c
index 9f2448d..c14b031 100644
--- a/app/core/gimpfilter.c
+++ b/app/core/gimpfilter.c
@@ -27,11 +27,19 @@
 #include "gimp.h"
 #include "gimp-memsize.h"
 #include "gimpfilter.h"
+#include "gimpmarshal.h"
 
 
 enum
 {
+  VISIBILITY_CHANGED,
+  LAST_SIGNAL
+};
+
+enum
+{
   PROP_0,
+  PROP_VISIBLE,
   PROP_IS_LAST_NODE
 };
 
@@ -41,7 +49,9 @@ typedef struct _GimpFilterPrivate GimpFilterPrivate;
 struct _GimpFilterPrivate
 {
   GeglNode       *node;
-  gboolean        is_last_node;
+
+  guint           visible      : 1;
+  guint           is_last_node : 1;
 
   GimpApplicator *applicator;
 };
@@ -53,26 +63,29 @@ struct _GimpFilterPrivate
 
 /*  local function prototypes  */
 
-static void       gimp_filter_finalize      (GObject      *object);
-static void       gimp_filter_set_property  (GObject      *object,
-                                             guint         property_id,
-                                             const GValue *value,
-                                             GParamSpec   *pspec);
-static void       gimp_filter_get_property  (GObject      *object,
-                                             guint         property_id,
-                                             GValue       *value,
-                                             GParamSpec   *pspec);
+static void       gimp_filter_finalize                (GObject      *object);
+static void       gimp_filter_set_property            (GObject      *object,
+                                                       guint         property_id,
+                                                       const GValue *value,
+                                                       GParamSpec   *pspec);
+static void       gimp_filter_get_property            (GObject      *object,
+                                                       guint         property_id,
+                                                       GValue       *value,
+                                                       GParamSpec   *pspec);
 
-static gint64     gimp_filter_get_memsize   (GimpObject   *object,
-                                             gint64       *gui_size);
+static gint64     gimp_filter_get_memsize             (GimpObject   *object,
+                                                       gint64       *gui_size);
 
-static GeglNode * gimp_filter_real_get_node (GimpFilter *filter);
+static void       gimp_filter_real_visibility_changed (GimpFilter   *filter);
+static GeglNode * gimp_filter_real_get_node           (GimpFilter   *filter);
 
 
 G_DEFINE_TYPE (GimpFilter, gimp_filter, GIMP_TYPE_VIEWABLE)
 
 #define parent_class gimp_filter_parent_class
 
+static guint gimp_filter_signals[LAST_SIGNAL] = { 0 };
+
 
 static void
 gimp_filter_class_init (GimpFilterClass *klass)
@@ -80,14 +93,29 @@ gimp_filter_class_init (GimpFilterClass *klass)
   GObjectClass    *object_class      = G_OBJECT_CLASS (klass);
   GimpObjectClass *gimp_object_class = GIMP_OBJECT_CLASS (klass);
 
+  gimp_filter_signals[VISIBILITY_CHANGED] =
+    g_signal_new ("visibility-changed",
+                  G_TYPE_FROM_CLASS (klass),
+                  G_SIGNAL_RUN_FIRST,
+                  G_STRUCT_OFFSET (GimpFilterClass, visibility_changed),
+                  NULL, NULL,
+                  gimp_marshal_VOID__VOID,
+                  G_TYPE_NONE, 0);
+
   object_class->finalize         = gimp_filter_finalize;
   object_class->set_property     = gimp_filter_set_property;
   object_class->get_property     = gimp_filter_get_property;
 
   gimp_object_class->get_memsize = gimp_filter_get_memsize;
 
+  klass->visibility_changed      = gimp_filter_real_visibility_changed;
   klass->get_node                = gimp_filter_real_get_node;
 
+  g_object_class_install_property (object_class, PROP_VISIBLE,
+                                   g_param_spec_boolean ("visible", NULL, NULL,
+                                                         TRUE,
+                                                         GIMP_PARAM_READWRITE));
+
   g_object_class_install_property (object_class, PROP_IS_LAST_NODE,
                                    g_param_spec_boolean ("is-last-node",
                                                          NULL, NULL,
@@ -100,6 +128,9 @@ gimp_filter_class_init (GimpFilterClass *klass)
 static void
 gimp_filter_init (GimpFilter *filter)
 {
+  GimpFilterPrivate *private = GET_PRIVATE (filter);
+
+  private->visible = TRUE;
 }
 
 static void
@@ -122,12 +153,15 @@ gimp_filter_set_property (GObject      *object,
                           const GValue *value,
                           GParamSpec   *pspec)
 {
-  GimpFilterPrivate *private = GET_PRIVATE (object);
+  GimpFilter *filter = GIMP_FILTER (object);
 
   switch (property_id)
     {
+    case PROP_VISIBLE:
+      gimp_filter_set_visible (filter, g_value_get_boolean (value));
+      break;
     case PROP_IS_LAST_NODE:
-      private->is_last_node = g_value_get_boolean (value);
+      gimp_filter_set_is_last_node (filter, g_value_get_boolean (value));
       break;
 
     default:
@@ -146,6 +180,9 @@ gimp_filter_get_property (GObject    *object,
 
   switch (property_id)
     {
+    case PROP_VISIBLE:
+      g_value_set_boolean (value, private->visible);
+      break;
     case PROP_IS_LAST_NODE:
       g_value_set_boolean (value, private->is_last_node);
       break;
@@ -169,6 +206,28 @@ gimp_filter_get_memsize (GimpObject *object,
                                                                   gui_size);
 }
 
+static void
+gimp_filter_real_visibility_changed (GimpFilter *filter)
+{
+  GeglNode *node = gimp_filter_peek_node (filter);
+
+  if (node)
+    {
+      if (gimp_filter_get_visible (filter))
+        {
+          /* Leave this up to subclasses */
+        }
+      else
+        {
+          GeglNode *input  = gegl_node_get_input_proxy  (node, "input");
+          GeglNode *output = gegl_node_get_output_proxy (node, "output");
+
+          gegl_node_connect_to (input,  "output",
+                                output, "input");
+        }
+    }
+}
+
 static GeglNode *
 gimp_filter_real_get_node (GimpFilter *filter)
 {
@@ -176,6 +235,19 @@ gimp_filter_real_get_node (GimpFilter *filter)
 
   private->node = gegl_node_new ();
 
+  if (gimp_filter_get_visible (filter))
+    {
+      /* Leave this up to subclasses */
+    }
+  else
+    {
+      GeglNode *input  = gegl_node_get_input_proxy  (private->node, "input");
+      GeglNode *output = gegl_node_get_output_proxy (private->node, "output");
+
+      gegl_node_connect_to (input,  "output",
+                            output, "input");
+    }
+
   return private->node;
 }
 
@@ -216,20 +288,64 @@ gimp_filter_peek_node (GimpFilter *filter)
 }
 
 void
+gimp_filter_set_visible (GimpFilter *filter,
+                         gboolean    visible)
+{
+  g_return_if_fail (GIMP_IS_FILTER (filter));
+
+  visible = visible ? TRUE : FALSE;
+
+  if (visible != gimp_filter_get_visible (filter))
+    {
+      GET_PRIVATE (filter)->visible = visible;
+
+      g_signal_emit (filter, gimp_filter_signals[VISIBILITY_CHANGED], 0);
+
+      g_object_notify (G_OBJECT (filter), "visible");
+    }
+}
+
+gboolean
+gimp_filter_get_visible (GimpFilter *filter)
+{
+  g_return_val_if_fail (GIMP_IS_FILTER (filter), FALSE);
+
+  return GET_PRIVATE (filter)->visible;
+}
+
+gboolean
+gimp_filter_is_visible (GimpFilter *filter)
+{
+  g_return_val_if_fail (GIMP_IS_FILTER (filter), FALSE);
+
+  if (gimp_filter_get_visible (filter))
+    {
+      GimpFilter *parent;
+
+      parent = GIMP_FILTER (gimp_viewable_get_parent (GIMP_VIEWABLE (filter)));
+
+      if (parent)
+        return gimp_filter_is_visible (parent);
+
+      return TRUE;
+    }
+
+  return FALSE;
+}
+
+void
 gimp_filter_set_is_last_node (GimpFilter *filter,
                               gboolean    is_last_node)
 {
-  GimpFilterPrivate *private;
-
   g_return_if_fail (GIMP_IS_FILTER (filter));
 
-  private = GET_PRIVATE (filter);
+  is_last_node = is_last_node ? TRUE : FALSE;
 
-  if (is_last_node != private->is_last_node)
+  if (is_last_node != gimp_filter_get_is_last_node (filter))
     {
-      g_object_set (filter,
-                    "is-last-node", is_last_node ? TRUE : FALSE,
-                    NULL);
+      GET_PRIVATE (filter)->is_last_node = is_last_node;
+
+      g_object_notify (G_OBJECT (filter), "is-last-node");
     }
 }
 
diff --git a/app/core/gimpfilter.h b/app/core/gimpfilter.h
index 65feb35..ce4ca90 100644
--- a/app/core/gimpfilter.h
+++ b/app/core/gimpfilter.h
@@ -43,7 +43,11 @@ struct _GimpFilterClass
 {
   GimpViewableClass  parent_class;
 
-  GeglNode * (* get_node) (GimpFilter *filter);
+  /*  signals  */
+  void       (* visibility_changed) (GimpFilter *filter);
+
+  /*  virtual functions  */
+  GeglNode * (* get_node)           (GimpFilter *filter);
 };
 
 
@@ -53,6 +57,11 @@ GimpFilter     * gimp_filter_new              (const gchar    *name);
 GeglNode       * gimp_filter_get_node         (GimpFilter     *filter);
 GeglNode       * gimp_filter_peek_node        (GimpFilter     *filter);
 
+void             gimp_filter_set_visible      (GimpFilter     *filter,
+                                               gboolean        visible);
+gboolean         gimp_filter_get_visible      (GimpFilter     *filter);
+gboolean         gimp_filter_is_visible       (GimpFilter     *filter);
+
 void             gimp_filter_set_is_last_node (GimpFilter     *filter,
                                                gboolean        is_last_node);
 gboolean         gimp_filter_get_is_last_node (GimpFilter     *filter);
diff --git a/app/core/gimpitem.c b/app/core/gimpitem.c
index 56fd475..34ee0df 100644
--- a/app/core/gimpitem.c
+++ b/app/core/gimpitem.c
@@ -53,7 +53,6 @@
 enum
 {
   REMOVED,
-  VISIBILITY_CHANGED,
   LINKED_CHANGED,
   LOCK_CONTENT_CHANGED,
   LOCK_POSITION_CHANGED,
@@ -69,7 +68,6 @@ enum
   PROP_HEIGHT,
   PROP_OFFSET_X,
   PROP_OFFSET_Y,
-  PROP_VISIBLE,
   PROP_LINKED,
   PROP_LOCK_CONTENT,
   PROP_LOCK_POSITION
@@ -90,7 +88,6 @@ struct _GimpItemPrivate
   gint              width, height;      /*  size in pixels           */
   gint              offset_x, offset_y; /*  pixel offset in image    */
 
-  guint             visible       : 1;  /*  control visibility       */
   guint             linked        : 1;  /*  control linkage          */
   guint             lock_content  : 1;  /*  content editability      */
   guint             lock_position : 1;  /*  content movability       */
@@ -121,8 +118,6 @@ static void       gimp_item_get_property            (GObject        *object,
 static gint64     gimp_item_get_memsize             (GimpObject     *object,
                                                      gint64         *gui_size);
 
-static void       gimp_item_real_visibility_changed (GimpItem       *item);
-
 static gboolean   gimp_item_real_is_content_locked  (const GimpItem *item);
 static gboolean   gimp_item_real_is_position_locked (const GimpItem *item);
 static gboolean   gimp_item_real_bounds             (GimpItem       *item,
@@ -181,15 +176,6 @@ gimp_item_class_init (GimpItemClass *klass)
                   gimp_marshal_VOID__VOID,
                   G_TYPE_NONE, 0);
 
-  gimp_item_signals[VISIBILITY_CHANGED] =
-    g_signal_new ("visibility-changed",
-                  G_TYPE_FROM_CLASS (klass),
-                  G_SIGNAL_RUN_FIRST,
-                  G_STRUCT_OFFSET (GimpItemClass, visibility_changed),
-                  NULL, NULL,
-                  gimp_marshal_VOID__VOID,
-                  G_TYPE_NONE, 0);
-
   gimp_item_signals[LINKED_CHANGED] =
     g_signal_new ("linked-changed",
                   G_TYPE_FROM_CLASS (klass),
@@ -228,7 +214,6 @@ gimp_item_class_init (GimpItemClass *klass)
   viewable_class->get_popup_size   = gimp_item_get_popup_size;
 
   klass->removed                   = NULL;
-  klass->visibility_changed        = gimp_item_real_visibility_changed;
   klass->linked_changed            = NULL;
   klass->lock_content_changed      = NULL;
   klass->lock_position_changed     = NULL;
@@ -295,11 +280,6 @@ gimp_item_class_init (GimpItemClass *klass)
                                                      GIMP_MAX_IMAGE_SIZE, 0,
                                                      GIMP_PARAM_READABLE));
 
-  g_object_class_install_property (object_class, PROP_VISIBLE,
-                                   g_param_spec_boolean ("visible", NULL, NULL,
-                                                         TRUE,
-                                                         GIMP_PARAM_READABLE));
-
   g_object_class_install_property (object_class, PROP_LINKED,
                                    g_param_spec_boolean ("linked", NULL, NULL,
                                                          FALSE,
@@ -335,7 +315,6 @@ gimp_item_init (GimpItem *item)
   private->height        = 0;
   private->offset_x      = 0;
   private->offset_y      = 0;
-  private->visible       = TRUE;
   private->linked        = FALSE;
   private->lock_content  = FALSE;
   private->lock_position = FALSE;
@@ -428,9 +407,6 @@ gimp_item_get_property (GObject    *object,
     case PROP_OFFSET_Y:
       g_value_set_int (value, private->offset_y);
       break;
-    case PROP_VISIBLE:
-      g_value_set_boolean (value, private->visible);
-      break;
     case PROP_LINKED:
       g_value_set_boolean (value, private->linked);
       break;
@@ -461,28 +437,6 @@ gimp_item_get_memsize (GimpObject *object,
                                                                   gui_size);
 }
 
-static void
-gimp_item_real_visibility_changed (GimpItem *item)
-{
-  GeglNode *node = gimp_filter_peek_node (GIMP_FILTER (item));
-
-  if (node)
-    {
-      if (gimp_item_get_visible (item))
-        {
-          /* Leave this up to subclasses */
-        }
-      else
-        {
-          GeglNode *input  = gegl_node_get_input_proxy  (node, "input");
-          GeglNode *output = gegl_node_get_output_proxy (node, "output");
-
-          gegl_node_connect_to (input,  "output",
-                                output, "input");
-        }
-    }
-}
-
 static gboolean
 gimp_item_real_is_content_locked (const GimpItem *item)
 {
@@ -2089,11 +2043,7 @@ gimp_item_set_visible (GimpItem *item,
             gimp_image_undo_push_item_visibility (image, NULL, item);
         }
 
-      GET_PRIVATE (item)->visible = visible;
-
-      g_signal_emit (item, gimp_item_signals[VISIBILITY_CHANGED], 0);
-
-      g_object_notify (G_OBJECT (item), "visible");
+      gimp_filter_set_visible (GIMP_FILTER (item), visible);
     }
 }
 
@@ -2102,7 +2052,7 @@ gimp_item_get_visible (const GimpItem *item)
 {
   g_return_val_if_fail (GIMP_IS_ITEM (item), FALSE);
 
-  return GET_PRIVATE (item)->visible;
+  return gimp_filter_get_visible (GIMP_FILTER (item));
 }
 
 gboolean
@@ -2110,17 +2060,7 @@ gimp_item_is_visible (const GimpItem *item)
 {
   g_return_val_if_fail (GIMP_IS_ITEM (item), FALSE);
 
-  if (gimp_item_get_visible (item))
-    {
-      GimpItem *parent = gimp_item_get_parent (item);
-
-      if (parent)
-        return gimp_item_is_visible (parent);
-
-      return TRUE;
-    }
-
-  return FALSE;
+  return gimp_filter_is_visible (GIMP_FILTER (item));
 }
 
 void
diff --git a/app/core/gimpitem.h b/app/core/gimpitem.h
index 3f9fc33..ce1f7d5 100644
--- a/app/core/gimpitem.h
+++ b/app/core/gimpitem.h
@@ -43,7 +43,6 @@ struct _GimpItemClass
 
   /*  signals  */
   void            (* removed)               (GimpItem            *item);
-  void            (* visibility_changed)    (GimpItem            *item);
   void            (* linked_changed)        (GimpItem            *item);
   void            (* lock_content_changed)  (GimpItem            *item);
   void            (* lock_position_changed) (GimpItem            *item);


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