[libdazzle] tree-node: add child helpers



commit c0d0b3045cb5676dff81d23247615a86da3a6a4b
Author: Christian Hergert <chergert redhat com>
Date:   Tue Dec 5 16:10:58 2017 -0800

    tree-node: add child helpers
    
    This adds a dzl_tree_node_n_children() helper to get the number of children
    for a node. It must have already been built to query this value.
    
    It also adds dzl_tree_node_nth_child() which will get the @nth child of a
    node and also requires the node have been built (although not the children
    of the node).

 src/tree/dzl-tree-node.c |   58 ++++++++++++++++++++++++++++++++++++++++++++++
 src/tree/dzl-tree-node.h |    5 ++++
 2 files changed, 63 insertions(+), 0 deletions(-)
---
diff --git a/src/tree/dzl-tree-node.c b/src/tree/dzl-tree-node.c
index 1e1e6f9..04b0a4e 100644
--- a/src/tree/dzl-tree-node.c
+++ b/src/tree/dzl-tree-node.c
@@ -1236,3 +1236,61 @@ dzl_tree_node_set_reset_on_collapse (DzlTreeNode *self,
       g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_RESET_ON_COLLAPSE]);
     }
 }
+
+guint
+dzl_tree_node_n_children (DzlTreeNode *self)
+{
+  g_return_val_if_fail (DZL_IS_TREE_NODE (self), 0);
+
+  if (!self->needs_build && self->tree != NULL)
+    {
+      GtkTreeIter iter;
+      GtkTreeModel *model;
+
+      model = GTK_TREE_MODEL (_dzl_tree_get_store (self->tree));
+
+      if (dzl_tree_node_get_iter (self, &iter))
+        return gtk_tree_model_iter_n_children (model, &iter);
+    }
+
+  return 0;
+}
+
+/**
+ * dzl_tree_node_nth_child:
+ * @self: a #DzlTreeNode
+ * @nth: the index of the child
+ *
+ * Gets the @nth child of @self or %NULL if it does not exist.
+ *
+ * Returns: (transfer full) (nullable): a #DzlTreeNode or %NULL
+ */
+DzlTreeNode *
+dzl_tree_node_nth_child (DzlTreeNode *self,
+                         guint        nth)
+{
+  g_return_val_if_fail (DZL_IS_TREE_NODE (self), NULL);
+  g_return_val_if_fail (!self->needs_build, NULL);
+
+  if (self->tree != NULL)
+    {
+      GtkTreeIter parent;
+      GtkTreeIter iter;
+      GtkTreeModel *model;
+
+      model = GTK_TREE_MODEL (_dzl_tree_get_store (self->tree));
+
+      if (dzl_tree_node_get_iter (self, &parent) &&
+          gtk_tree_model_iter_nth_child (model, &iter, &parent, nth))
+        {
+          g_autoptr(DzlTreeNode) node = NULL;
+
+          gtk_tree_model_get (model, &iter, 0, &node, -1);
+          g_assert (DZL_IS_TREE_NODE (node));
+
+          return g_steal_pointer (&node);
+        }
+    }
+
+  return NULL;
+}
diff --git a/src/tree/dzl-tree-node.h b/src/tree/dzl-tree-node.h
index ae654ae..096b12c 100644
--- a/src/tree/dzl-tree-node.h
+++ b/src/tree/dzl-tree-node.h
@@ -48,6 +48,11 @@ GtkTreePath    *dzl_tree_node_get_path              (DzlTreeNode            *nod
 DZL_AVAILABLE_IN_ALL
 gboolean        dzl_tree_node_get_iter              (DzlTreeNode            *node,
                                                      GtkTreeIter            *iter);
+DZL_AVAILABLE_IN_3_28
+guint           dzl_tree_node_n_children            (DzlTreeNode            *self);
+DZL_AVAILABLE_IN_3_28
+DzlTreeNode    *dzl_tree_node_nth_child             (DzlTreeNode            *self,
+                                                     guint                   nth);
 DZL_AVAILABLE_IN_ALL
 void            dzl_tree_node_prepend               (DzlTreeNode            *node,
                                                      DzlTreeNode            *child);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]