[libdazzle] tree: add dzl_tree_node_insert()
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libdazzle] tree: add dzl_tree_node_insert()
- Date: Fri, 22 Dec 2017 01:36:22 +0000 (UTC)
commit 125c9f9afa718c7dec1c69b1521b8fd2fb95b0b3
Author: Christian Hergert <chergert redhat com>
Date: Thu Dec 21 16:55:51 2017 -0800
tree: add dzl_tree_node_insert()
This allows insertion of a node at a given offset. This is
useful in situations where the data is already sorted, like that
coming from a GListModel.
src/tree/dzl-tree-node.c | 21 +++++++++++++++++++++
src/tree/dzl-tree-node.h | 4 ++++
src/tree/dzl-tree-private.h | 4 ++++
src/tree/dzl-tree.c | 40 ++++++++++++++++++++++++++++++++++++++++
4 files changed, 69 insertions(+), 0 deletions(-)
---
diff --git a/src/tree/dzl-tree-node.c b/src/tree/dzl-tree-node.c
index a420de2..6847805 100644
--- a/src/tree/dzl-tree-node.c
+++ b/src/tree/dzl-tree-node.c
@@ -133,6 +133,27 @@ _dzl_tree_node_set_tree (DzlTreeNode *node,
}
/**
+ * dzl_tree_node_insert:
+ * @self: a #DzlTreeNode
+ * @child: a #DzlTreeNode
+ * @position: the position for the child
+ *
+ * Inserts @child as a child of @self at @position.
+ *
+ * Since: 3.28
+ */
+void
+dzl_tree_node_insert (DzlTreeNode *self,
+ DzlTreeNode *child,
+ guint position)
+{
+ g_return_if_fail (DZL_IS_TREE_NODE (self));
+ g_return_if_fail (DZL_IS_TREE_NODE (child));
+
+ _dzl_tree_insert (self->tree, self, child, position);
+}
+
+/**
* dzl_tree_node_insert_sorted:
* @node: A #DzlTreeNode.
* @child: A #DzlTreeNode.
diff --git a/src/tree/dzl-tree-node.h b/src/tree/dzl-tree-node.h
index 3cf1637..0f0aa7e 100644
--- a/src/tree/dzl-tree-node.h
+++ b/src/tree/dzl-tree-node.h
@@ -30,6 +30,10 @@ DzlTreeNode *dzl_tree_node_new (void);
DZL_AVAILABLE_IN_ALL
void dzl_tree_node_append (DzlTreeNode *node,
DzlTreeNode *child);
+DZL_AVAILABLE_IN_3_28
+void dzl_tree_node_insert (DzlTreeNode *self,
+ DzlTreeNode *child,
+ guint position);
DZL_AVAILABLE_IN_ALL
void dzl_tree_node_insert_sorted (DzlTreeNode *node,
DzlTreeNode *child,
diff --git a/src/tree/dzl-tree-private.h b/src/tree/dzl-tree-private.h
index 169d488..9a4913e 100644
--- a/src/tree/dzl-tree-private.h
+++ b/src/tree/dzl-tree-private.h
@@ -31,6 +31,10 @@ void _dzl_tree_build_children (DzlTree
DzlTreeNode *node);
void _dzl_tree_build_node (DzlTree *self,
DzlTreeNode *node);
+void _dzl_tree_insert (DzlTree *self,
+ DzlTreeNode *node,
+ DzlTreeNode *child,
+ guint position);
void _dzl_tree_append (DzlTree *self,
DzlTreeNode *node,
DzlTreeNode *child);
diff --git a/src/tree/dzl-tree.c b/src/tree/dzl-tree.c
index 2c047b2..bac4af6 100644
--- a/src/tree/dzl-tree.c
+++ b/src/tree/dzl-tree.c
@@ -487,6 +487,46 @@ text_func (GtkCellLayout *cell_layout,
}
}
+void
+_dzl_tree_insert (DzlTree *self,
+ DzlTreeNode *parent,
+ DzlTreeNode *child,
+ guint position)
+{
+ DzlTreePrivate *priv = dzl_tree_get_instance_private (self);
+ GtkTreeIter parent_iter;
+ GtkTreeIter iter;
+
+ g_return_if_fail (DZL_IS_TREE (self));
+ g_return_if_fail (DZL_IS_TREE_NODE (parent));
+ g_return_if_fail (DZL_IS_TREE_NODE (child));
+
+ g_object_ref_sink (child);
+
+ if (dzl_tree_node_get_iter (parent, &parent_iter))
+ {
+ _dzl_tree_node_set_tree (child, self);
+ _dzl_tree_node_set_parent (child, parent);
+
+ gtk_tree_store_insert_with_values (priv->store, &iter, &parent_iter, position,
+ 0, child,
+ -1);
+
+ _dzl_tree_build_node (self, child);
+
+ if (dzl_tree_node_get_children_possible (child))
+ _dzl_tree_node_add_dummy_child (child);
+
+ if (priv->always_expand)
+ {
+ _dzl_tree_build_children (self, child);
+ dzl_tree_node_expand (child, TRUE);
+ }
+ }
+
+ g_object_unref (child);
+}
+
static void
dzl_tree_add (DzlTree *self,
DzlTreeNode *node,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]