diff options
author | Michael Drake <tlsa@netsurf-browser.org> | 2013-08-22 16:05:03 +0100 |
---|---|---|
committer | Michael Drake <tlsa@netsurf-browser.org> | 2013-08-22 16:05:03 +0100 |
commit | 1212f1d32149c12591384b9844b08c83e6b2ee36 (patch) | |
tree | 302659913623cc9d325466c3ed0ef6e33a24fe51 /desktop/treeview.c | |
parent | 1e27299cf17bb4786017239c4ad864e56415457d (diff) | |
download | netsurf-1212f1d32149c12591384b9844b08c83e6b2ee36.tar.gz netsurf-1212f1d32149c12591384b9844b08c83e6b2ee36.tar.bz2 |
Expose leaving node callback in public treeview walker interface.
Diffstat (limited to 'desktop/treeview.c')
-rw-r--r-- | desktop/treeview.c | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/desktop/treeview.c b/desktop/treeview.c index a63adef47..bf2d0ef37 100644 --- a/desktop/treeview.c +++ b/desktop/treeview.c @@ -713,29 +713,42 @@ static int treeview_node_y(treeview *tree, treeview_node *node) struct treeview_walk_ctx { - treeview_walk_callback walk_cb; + treeview_walk_cb enter_cb; + treeview_walk_cb leave_cb; void *ctx; enum treeview_node_type type; }; -/** Treewalk node callback. */ -static nserror treeview_walk_cb(treeview_node *n, void *ctx, +/** Treewalk node enter callback. */ +static nserror treeview_walk_fwd_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 tw->enter_cb(tw->ctx, n->client_data, n->type, end); + } + + return NSERROR_OK; +} +/** Treewalk node leave callback. */ +static nserror treeview_walk_bwd_cb(treeview_node *n, void *ctx, bool *end) +{ + struct treeview_walk_ctx *tw = ctx; + + if (n->type & tw->type) { + return tw->leave_cb(tw->ctx, n->client_data, n->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) + treeview_walk_cb enter_cb, treeview_walk_cb leave_cb, + void *ctx, enum treeview_node_type type) { struct treeview_walk_ctx tw = { - .walk_cb = walk_cb, + .enter_cb = enter_cb, + .leave_cb = leave_cb, .ctx = ctx, .type = type }; @@ -746,7 +759,9 @@ nserror treeview_walk(treeview *tree, treeview_node *root, if (root == NULL) root = tree->root; - return treeview_walk_internal(root, true, NULL, treeview_walk_cb, &tw); + return treeview_walk_internal(root, true, + (leave_cb != NULL) ? treeview_walk_bwd_cb : NULL, + (enter_cb != NULL) ? treeview_walk_fwd_cb : NULL, &tw); } |