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);
}
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
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);
| (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);
}
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);
+}
+
#include "gtkbitmaskprivate.h"
#include "gtkcsstypesprivate.h"
#include "gtkstylecontext.h"
+#include "gtklistlistmodelprivate.h"
G_BEGIN_DECLS
GtkCssNode *first_child;
GtkCssNode *last_child;
+ GtkListListModel *children_observer;
+
GtkCssNodeDeclaration *decl;
GtkCssStyle *style;
GtkCssNodeStyleCache *cache; /* cache for children to look up styles */
GString *string,
guint indent);
+GListModel * gtk_css_node_observe_children (GtkCssNode *cssnode);
+
G_END_DECLS
#endif /* __GTK_CSS_NODE_PRIVATE_H__ */