[gnome-builder] tree: add gb_tree_find_child_node()
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] tree: add gb_tree_find_child_node()
- Date: Sat, 20 Jun 2015 09:44:27 +0000 (UTC)
commit 1b737ff94370fb5c03a09ea122fe4dc66c33607a
Author: Christian Hergert <christian hergert me>
Date: Sun Jun 14 16:56:26 2015 -0700
tree: add gb_tree_find_child_node()
This is a helper to find a direct child of a particular node. If
GbTreeFindFunc returns TRUE, the node is condered to match the
lookup request.
src/tree/gb-tree.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++
src/tree/gb-tree.h | 17 ++++++++++
2 files changed, 101 insertions(+), 0 deletions(-)
---
diff --git a/src/tree/gb-tree.c b/src/tree/gb-tree.c
index 8931dfe..98ef9b6 100644
--- a/src/tree/gb-tree.c
+++ b/src/tree/gb-tree.c
@@ -1441,3 +1441,87 @@ _gb_tree_invalidate (GbTree *self,
gtk_tree_path_free (path);
}
+
+/**
+ * gb_tree_find_child_node:
+ * @self: A #GbTree
+ * @node: A #GbTreeNode
+ * @find_func: (call scope): A callback to locate the child
+ * @user_data: user data for @find_func
+ *
+ * Searches through the direct children of @node for a matching child.
+ * @find_func should return %TRUE if the child matches, otherwise %FALSE.
+ *
+ * Returns: (transfer none) (nullable): A #GbTreeNode or %NULL.
+ */
+GbTreeNode *
+gb_tree_find_child_node (GbTree *self,
+ GbTreeNode *node,
+ GbTreeFindFunc find_func,
+ gpointer user_data)
+{
+ GbTreePrivate *priv = gb_tree_get_instance_private (self);
+ GtkTreeModel *model;
+ GtkTreePath *path;
+ GtkTreeIter iter;
+ GtkTreeIter children;
+
+ g_return_val_if_fail (GB_IS_TREE (self), NULL);
+ g_return_val_if_fail (!node || GB_IS_TREE_NODE (node), NULL);
+ g_return_val_if_fail (find_func, NULL);
+
+ if (node == NULL)
+ node = priv->root;
+
+ if (node == NULL)
+ {
+ g_warning ("Cannot find node. No root node has been set on %s.",
+ g_type_name (G_OBJECT_TYPE (self)));
+ return NULL;
+ }
+
+ if (_gb_tree_node_get_needs_build (node))
+ gb_tree_build_node (self, node);
+
+ model = GTK_TREE_MODEL (priv->store);
+ path = gb_tree_node_get_path (node);
+
+ if (path != NULL)
+ {
+ if (!gtk_tree_model_get_iter (model, &iter, path))
+ goto failure;
+
+ if (!gtk_tree_model_iter_children (model, &children, &iter))
+ goto failure;
+ }
+ else
+ {
+ if (!gtk_tree_model_iter_children (model, &children, NULL))
+ goto failure;
+ }
+
+ do
+ {
+ GbTreeNode *child = NULL;
+
+ gtk_tree_model_get (model, &children, 0, &child, -1);
+
+ if (find_func (self, node, child, user_data))
+ {
+ /*
+ * We want to returned a borrowed reference to the child node.
+ * It is safe to unref the child here before we return.
+ */
+ g_object_unref (child);
+ return child;
+ }
+
+ g_clear_object (&child);
+ }
+ while (gtk_tree_model_iter_next (model, &children));
+
+failure:
+ g_clear_pointer (&path, gtk_tree_path_free);
+
+ return NULL;
+}
diff --git a/src/tree/gb-tree.h b/src/tree/gb-tree.h
index 6fdfc7b..ec39e2c 100644
--- a/src/tree/gb-tree.h
+++ b/src/tree/gb-tree.h
@@ -27,6 +27,19 @@
G_BEGIN_DECLS
+/**
+ * GbTreeFindFunc:
+ *
+ * Callback to check @child, a child of @node, matches a lookup
+ * request. Returns %TRUE if @child matches, %FALSE if not.
+ *
+ * Returns: %TRUE if @child matched
+ */
+typedef gboolean (*GbTreeFindFunc) (GbTree *tree,
+ GbTreeNode *node,
+ GbTreeNode *child,
+ gpointer user_data);
+
struct _GbTreeClass
{
GtkTreeViewClass parent_class;
@@ -66,6 +79,10 @@ void gb_tree_scroll_to_node (GbTree *self,
GbTreeNode *node);
void gb_tree_expand_to_node (GbTree *self,
GbTreeNode *node);
+GbTreeNode *gb_tree_find_child_node (GbTree *self,
+ GbTreeNode *node,
+ GbTreeFindFunc find_func,
+ gpointer user_data);
G_END_DECLS
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]