[gimp] app: move the "visible" property from GimpItem to GimpFilter
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] app: move the "visible" property from GimpItem to GimpFilter
- Date: Sun, 1 May 2016 12:29:07 +0000 (UTC)
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]