From 4697d1ccc1d6190788b931352b1e3a931dd0a0f7 Mon Sep 17 00:00:00 2001 From: Michael Drake Date: Thu, 25 Jul 2013 16:06:34 +0100 Subject: Expose treeview walker. --- desktop/treeview.c | 44 ++++++++++++++++++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 6 deletions(-) (limited to 'desktop/treeview.c') diff --git a/desktop/treeview.c b/desktop/treeview.c index b9200735b..c45e91435 100644 --- a/desktop/treeview.c +++ b/desktop/treeview.c @@ -39,12 +39,6 @@ struct treeview_globals { int icon_step; } tree_g; -enum treeview_node_type { - TREE_NODE_ROOT, - TREE_NODE_FOLDER, - TREE_NODE_ENTRY -}; - enum treeview_node_section { TV_NODE_SECTION_TOGGLE, /**< Expansion toggle */ TV_NODE_SECTION_ON_NODE, /**< Node content (text, icon) */ @@ -573,6 +567,44 @@ static nserror treeview_walk_internal(treeview_node *root, bool full, } +struct treeview_walk_ctx { + treeview_walk_callback walk_cb; + void *ctx; + enum treeview_node_type type; +}; +/** Treewalk node callback. */ +static nserror treeview_walk_cb(treeview_node *n, void *ctx, + bool *skip_children, bool *end) +{ + struct treeview_walk_ctx *tw = ctx; + + if (n->type & tw->type) { + return tw->walk_cb(tw->ctx, n->client_data, tw->type, end); + } + + return NSERROR_OK; +} +/* Exported interface, documented in treeview.h */ +nserror treeview_walk(treeview *tree, treeview_node *root, + treeview_walk_callback walk_cb, void *ctx, + enum treeview_node_type type) +{ + struct treeview_walk_ctx tw = { + .walk_cb = walk_cb, + .ctx = ctx, + .type = type + }; + + assert(tree != NULL); + assert(tree->root != NULL); + + if (root == NULL) + root = tree->root; + + return treeview_walk_internal(root, true, NULL, treeview_walk_cb, &tw); +} + + struct treeview_node_delete { treeview *tree; int height_reduction; -- cgit v1.2.3