struct _TreeNode
{
+ gpointer item;
GListModel *model;
GtkTreeListRow *row;
GtkRbTree *children;
return child_aug->n_items;
}
-static guint
-tree_node_get_local_position (GtkRbTree *tree,
- TreeNode *node)
-{
- TreeNode *left, *parent;
- TreeAugment *left_aug;
- guint n;
-
- left = gtk_rb_tree_node_get_left (node);
- if (left)
- {
- left_aug = gtk_rb_tree_get_augment (tree, left);
- n = left_aug->n_local;
- }
- else
- {
- n = 0;
- }
-
- for (parent = gtk_rb_tree_node_get_parent (node);
- parent;
- parent = gtk_rb_tree_node_get_parent (node))
- {
- left = gtk_rb_tree_node_get_left (parent);
- if (left == node)
- {
- /* we are the left node, nothing changes */
- }
- else
- {
- /* we are the right node */
- n++;
- if (left)
- {
- left_aug = gtk_rb_tree_get_augment (tree, left);
- n += left_aug->n_local;
- }
- }
- node = parent;
- }
-
- return n;
-}
-
static guint
tree_node_get_position (TreeNode *node)
{
tree_node_create_model (GtkTreeListModel *self,
TreeNode *node)
{
- TreeNode *parent = node->parent;
GListModel *model;
- GObject *item;
- item = g_list_model_get_item (parent->model,
- tree_node_get_local_position (parent->children, node));
- model = self->create_func (item, self->user_data);
- g_object_unref (item);
+ model = self->create_func (node->item, self->user_data);
if (model == NULL)
node->empty = TRUE;
return model;
}
-static gpointer
-tree_node_get_item (TreeNode *node)
-{
- TreeNode *parent;
-
- parent = node->parent;
- return g_list_model_get_item (parent->model,
- tree_node_get_local_position (parent->children, node));
-}
-
static GtkTreeListRow *
tree_node_get_row (TreeNode *node)
{
{
child = gtk_rb_tree_insert_before (node->children, child);
child->parent = node;
+ child->item = g_list_model_get_item (model, position + i);
}
if (self->autoexpand)
{
static void
gtk_tree_list_model_clear_node_children (TreeNode *node)
{
+ g_clear_object (&node->item);
+
if (node->model)
{
g_signal_handlers_disconnect_by_func (node->model,
{
node = gtk_rb_tree_insert_after (self->children, node);
node->parent = self;
+ node->item = g_list_model_get_item (model, i);
if (list->autoexpand)
gtk_tree_list_model_expand_node (list, node);
}
if (self->passthrough)
{
- return tree_node_get_item (node);
+ return g_object_ref (node->item);
}
else
{
if (self->node == NULL)
return NULL;
- return tree_node_get_item (self->node);
+ return g_object_ref (self->node->item);
}
/**