summaryrefslogtreecommitdiff
path: root/desktop/treeview.c
diff options
context:
space:
mode:
authorMichael Drake <tlsa@netsurf-browser.org>2013-07-25 16:06:34 +0100
committerMichael Drake <tlsa@netsurf-browser.org>2013-07-25 16:06:34 +0100
commit4697d1ccc1d6190788b931352b1e3a931dd0a0f7 (patch)
treef862555e46115d1db360db9ad2e509784b9b5739 /desktop/treeview.c
parent17abee0045e51b72a1dda9de0c187c71c252fc56 (diff)
downloadnetsurf-4697d1ccc1d6190788b931352b1e3a931dd0a0f7.tar.gz
netsurf-4697d1ccc1d6190788b931352b1e3a931dd0a0f7.tar.bz2
Expose treeview walker.
Diffstat (limited to 'desktop/treeview.c')
-rw-r--r--desktop/treeview.c44
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;