From: Matthias Clasen Date: Fri, 7 Oct 2022 19:51:02 +0000 (-0400) Subject: Add gtk_css_node_observe_children X-Git-Tag: archive/raspbian/4.12.3+ds-1+rpi1~1^2^2^2~22^2~9^2~194^2~3 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=f8357512d028cf123ae4cb07103d782732db4329;p=gtk4.git Add gtk_css_node_observe_children --- 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__ */