diff options
author | Michael Drake <tlsa@netsurf-browser.org> | 2013-07-25 16:06:34 +0100 |
---|---|---|
committer | Michael Drake <tlsa@netsurf-browser.org> | 2013-07-25 16:06:34 +0100 |
commit | 4697d1ccc1d6190788b931352b1e3a931dd0a0f7 (patch) | |
tree | f862555e46115d1db360db9ad2e509784b9b5739 /desktop/treeview.c | |
parent | 17abee0045e51b72a1dda9de0c187c71c252fc56 (diff) | |
download | netsurf-4697d1ccc1d6190788b931352b1e3a931dd0a0f7.tar.gz netsurf-4697d1ccc1d6190788b931352b1e3a931dd0a0f7.tar.bz2 |
Expose treeview walker.
Diffstat (limited to 'desktop/treeview.c')
-rw-r--r-- | desktop/treeview.c | 44 |
1 files changed, 38 insertions, 6 deletions
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; |