[libdazzle] tree: add dzl_tree_node_insert()



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]