[gtk/inspector-trees: 1/2] Add gtk_css_node_observe_children
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/inspector-trees: 1/2] Add gtk_css_node_observe_children
- Date: Fri, 7 Oct 2022 19:55:06 +0000 (UTC)
commit f8357512d028cf123ae4cb07103d782732db4329
Author: Matthias Clasen <mclasen redhat com>
Date: Fri Oct 7 15:51:02 2022 -0400
Add gtk_css_node_observe_children
gtk/gtkcssnode.c | 41 +++++++++++++++++++++++++++++++++++++++++
gtk/gtkcssnodeprivate.h | 5 +++++
2 files changed, 46 insertions(+)
---
diff --git a/gtk/gtkcssnode.c b/gtk/gtkcssnode.c
index b092da15a8..db53aee187 100644
--- a/gtk/gtkcssnode.c
+++ b/gtk/gtkcssnode.c
@@ -241,6 +241,9 @@ gtk_css_node_dispose (GObject *object)
g_clear_pointer (&cssnode->cache, gtk_css_node_style_cache_unref);
+ if (cssnode->children_observer)
+ gtk_list_list_model_clear (cssnode->children_observer);
+
G_OBJECT_CLASS (gtk_css_node_parent_class)->dispose (object);
}
@@ -506,6 +509,9 @@ gtk_css_node_real_node_removed (GtkCssNode *parent,
node->previous_sibling = NULL;
node->next_sibling = NULL;
node->parent = NULL;
+
+ if (parent->children_observer)
+ gtk_list_list_model_item_removed (parent->children_observer, previous);
}
static void
@@ -713,10 +719,13 @@ gtk_css_node_reposition (GtkCssNode *node,
GtkCssNode *previous)
{
GtkCssNode *old_parent;
+ GtkCssNode *old_previous;
g_assert (! (new_parent == NULL && previous != NULL));
old_parent = node->parent;
+ old_previous = node->previous_sibling;
+
/* Take a reference here so the whole function has a reference */
g_object_ref (node);
@@ -801,6 +810,14 @@ gtk_css_node_reposition (GtkCssNode *node,
| (node->previous_sibling ? 0 : GTK_CSS_CHANGE_FIRST_CHILD)
| (node->next_sibling ? 0 : GTK_CSS_CHANGE_LAST_CHILD));
+ if (new_parent && new_parent->children_observer)
+ {
+ if (old_previous)
+ gtk_list_list_model_item_moved (new_parent->children_observer, node, old_previous);
+ else
+ gtk_list_list_model_item_added (new_parent->children_observer, node);
+ }
+
g_object_unref (node);
}
@@ -1442,3 +1459,27 @@ gtk_css_node_print (GtkCssNode *cssnode,
gtk_css_node_print (node, flags, string, indent + 2);
}
}
+
+static void
+gtk_css_node_child_observer_destroyed (gpointer cssnode)
+{
+ GTK_CSS_NODE (cssnode)->children_observer = NULL;
+}
+
+GListModel *
+gtk_css_node_observe_children (GtkCssNode *cssnode)
+{
+ if (cssnode->children_observer)
+ return g_object_ref (G_LIST_MODEL (cssnode->children_observer));
+
+ cssnode->children_observer = gtk_list_list_model_new ((gpointer) gtk_css_node_get_first_child,
+ (gpointer) gtk_css_node_get_next_sibling,
+ (gpointer) gtk_css_node_get_previous_sibling,
+ (gpointer) gtk_css_node_get_last_child,
+ (gpointer) g_object_ref,
+ cssnode,
+ gtk_css_node_child_observer_destroyed);
+
+ return G_LIST_MODEL (cssnode->children_observer);
+}
+
diff --git a/gtk/gtkcssnodeprivate.h b/gtk/gtkcssnodeprivate.h
index ae07da00cb..e696ec49bc 100644
--- a/gtk/gtkcssnodeprivate.h
+++ b/gtk/gtkcssnodeprivate.h
@@ -25,6 +25,7 @@
#include "gtkbitmaskprivate.h"
#include "gtkcsstypesprivate.h"
#include "gtkstylecontext.h"
+#include "gtklistlistmodelprivate.h"
G_BEGIN_DECLS
@@ -47,6 +48,8 @@ struct _GtkCssNode
GtkCssNode *first_child;
GtkCssNode *last_child;
+ GtkListListModel *children_observer;
+
GtkCssNodeDeclaration *decl;
GtkCssStyle *style;
GtkCssNodeStyleCache *cache; /* cache for children to look up styles */
@@ -157,6 +160,8 @@ void gtk_css_node_print (GtkCssNode
GString *string,
guint indent);
+GListModel * gtk_css_node_observe_children (GtkCssNode *cssnode);
+
G_END_DECLS
#endif /* __GTK_CSS_NODE_PRIVATE_H__ */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]