[gimp] app: add GimpViewable::ancestry-changed signal, get_depth() function
- From: N/A <ell src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] app: add GimpViewable::ancestry-changed signal, get_depth() function
- Date: Sat, 2 Dec 2017 15:39:32 +0000 (UTC)
commit a52ff51990175d0a2df2e8ec358b1f786b490e3d
Author: Ell <ell_se yahoo com>
Date: Sat Dec 2 09:33:40 2017 -0500
app: add GimpViewable::ancestry-changed signal, get_depth() function
Add GimpViewable::ancestry-changed signal, which is emitted when
the viewable's ancestry changes, i.e., when its parent, or the
parent of one of its ancestors, changes.
Add gimp_viewable_get_depth() function, which returns the
viewable's depth in the hierarchy, i.e., its ancestor count.
app/core/gimpviewable.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++-
app/core/gimpviewable.h | 3 ++
2 files changed, 62 insertions(+), 1 deletions(-)
---
diff --git a/app/core/gimpviewable.c b/app/core/gimpviewable.c
index bd521a1..678ccef 100644
--- a/app/core/gimpviewable.c
+++ b/app/core/gimpviewable.c
@@ -33,6 +33,7 @@
#include "core-types.h"
#include "gimp-memsize.h"
+#include "gimpcontainer.h"
#include "gimpcontext.h"
#include "gimpmarshal.h"
#include "gimptempbuf.h"
@@ -55,6 +56,7 @@ enum
INVALIDATE_PREVIEW,
SIZE_CHANGED,
EXPANDED_CHANGED,
+ ANCESTRY_CHANGED,
LAST_SIGNAL
};
@@ -67,6 +69,7 @@ struct _GimpViewablePrivate
GdkPixbuf *icon_pixbuf;
gint freeze_count;
GimpViewable *parent;
+ gint depth;
GimpTempBuf *preview_temp_buf;
GdkPixbuf *preview_pixbuf;
@@ -93,6 +96,7 @@ static gint64 gimp_viewable_get_memsize (GimpObject *object,
gint64 *gui_size);
static void gimp_viewable_real_invalidate_preview (GimpViewable *viewable);
+static void gimp_viewable_real_ancestry_changed (GimpViewable *viewable);
static GdkPixbuf * gimp_viewable_real_get_new_pixbuf (GimpViewable *viewable,
GimpContext *context,
@@ -170,6 +174,15 @@ gimp_viewable_class_init (GimpViewableClass *klass)
gimp_marshal_VOID__VOID,
G_TYPE_NONE, 0);
+ viewable_signals[ANCESTRY_CHANGED] =
+ g_signal_new ("ancestry-changed",
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GimpViewableClass, ancestry_changed),
+ NULL, NULL,
+ gimp_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
+
object_class->finalize = gimp_viewable_finalize;
object_class->get_property = gimp_viewable_get_property;
object_class->set_property = gimp_viewable_set_property;
@@ -183,6 +196,7 @@ gimp_viewable_class_init (GimpViewableClass *klass)
klass->invalidate_preview = gimp_viewable_real_invalidate_preview;
klass->size_changed = NULL;
klass->expanded_changed = NULL;
+ klass->ancestry_changed = gimp_viewable_real_ancestry_changed;
klass->get_size = NULL;
klass->get_preview_size = gimp_viewable_real_get_preview_size;
@@ -338,6 +352,32 @@ gimp_viewable_real_invalidate_preview (GimpViewable *viewable)
}
static void
+gimp_viewable_real_ancestry_changed_propagate (GimpViewable *viewable,
+ GimpViewable *parent)
+{
+ GimpViewablePrivate *private = GET_PRIVATE (viewable);
+
+ private->depth = gimp_viewable_get_depth (parent) + 1;
+
+ g_signal_emit (viewable, viewable_signals[ANCESTRY_CHANGED], 0);
+}
+
+static void
+gimp_viewable_real_ancestry_changed (GimpViewable *viewable)
+{
+ GimpContainer *children;
+
+ children = gimp_viewable_get_children (viewable);
+
+ if (children)
+ {
+ gimp_container_foreach (children,
+ (GFunc) gimp_viewable_real_ancestry_changed_propagate,
+ viewable);
+ }
+}
+
+static void
gimp_viewable_real_get_preview_size (GimpViewable *viewable,
gint size,
gboolean popup,
@@ -1286,10 +1326,28 @@ void
gimp_viewable_set_parent (GimpViewable *viewable,
GimpViewable *parent)
{
+ GimpViewablePrivate *private;
+
g_return_if_fail (GIMP_IS_VIEWABLE (viewable));
g_return_if_fail (parent == NULL || GIMP_IS_VIEWABLE (parent));
- GET_PRIVATE (viewable)->parent = parent;
+ private = GET_PRIVATE (viewable);
+
+ if (parent != private->parent)
+ {
+ private->parent = parent;
+ private->depth = parent ? gimp_viewable_get_depth (parent) + 1 : 0;
+
+ g_signal_emit (viewable, viewable_signals[ANCESTRY_CHANGED], 0);
+ }
+}
+
+gint
+gimp_viewable_get_depth (GimpViewable *viewable)
+{
+ g_return_val_if_fail (GIMP_IS_VIEWABLE (viewable), 0);
+
+ return GET_PRIVATE (viewable)->depth;
}
GimpContainer *
diff --git a/app/core/gimpviewable.h b/app/core/gimpviewable.h
index a3b310c..4f07159 100644
--- a/app/core/gimpviewable.h
+++ b/app/core/gimpviewable.h
@@ -58,6 +58,7 @@ struct _GimpViewableClass
void (* invalidate_preview) (GimpViewable *viewable);
void (* size_changed) (GimpViewable *viewable);
void (* expanded_changed) (GimpViewable *viewable);
+ void (* ancestry_changed) (GimpViewable *viewable);
/* virtual functions */
gboolean (* get_size) (GimpViewable *viewable,
@@ -182,6 +183,8 @@ GimpViewable * gimp_viewable_get_parent (GimpViewable *viewable);
void gimp_viewable_set_parent (GimpViewable *viewable,
GimpViewable *parent);
+gint gimp_viewable_get_depth (GimpViewable *viewable);
+
GimpContainer * gimp_viewable_get_children (GimpViewable *viewable);
gboolean gimp_viewable_get_expanded (GimpViewable *viewable);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]