summaryrefslogtreecommitdiff
path: root/desktop/treeview.c
diff options
context:
space:
mode:
authorMichael Drake <tlsa@netsurf-browser.org>2013-08-22 16:05:03 +0100
committerMichael Drake <tlsa@netsurf-browser.org>2013-08-22 16:05:03 +0100
commit1212f1d32149c12591384b9844b08c83e6b2ee36 (patch)
tree302659913623cc9d325466c3ed0ef6e33a24fe51 /desktop/treeview.c
parent1e27299cf17bb4786017239c4ad864e56415457d (diff)
downloadnetsurf-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.c31
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);
}