summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--desktop/cookie_manager.c8
-rw-r--r--desktop/treeview.c31
-rw-r--r--desktop/treeview.h14
3 files changed, 36 insertions, 17 deletions
diff --git a/desktop/cookie_manager.c b/desktop/cookie_manager.c
index 7c2b4a4de..f369eb068 100644
--- a/desktop/cookie_manager.c
+++ b/desktop/cookie_manager.c
@@ -137,8 +137,8 @@ static nserror cookie_manager_find_entry(treeview_node *root,
.entry = NULL
};
- err = treeview_walk(cm_ctx.tree, root, cookie_manager_walk_cb, &tw,
- TREE_NODE_ENTRY);
+ err = treeview_walk(cm_ctx.tree, root, cookie_manager_walk_cb, NULL,
+ &tw, TREE_NODE_ENTRY);
if (err != NSERROR_OK)
return err;
@@ -167,8 +167,8 @@ static nserror cookie_manager_find_folder(treeview_node *root,
.entry = NULL
};
- err = treeview_walk(cm_ctx.tree, root, cookie_manager_walk_cb, &tw,
- TREE_NODE_FOLDER);
+ err = treeview_walk(cm_ctx.tree, root, cookie_manager_walk_cb, NULL,
+ &tw, TREE_NODE_FOLDER);
if (err != NSERROR_OK)
return err;
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);
}
diff --git a/desktop/treeview.h b/desktop/treeview.h
index f7432aef5..42dd4ca6b 100644
--- a/desktop/treeview.h
+++ b/desktop/treeview.h
@@ -240,7 +240,7 @@ nserror treeview_update_node_entry(treeview *tree,
* \param abort Set to true to abort treeview walk prematurely
* \return NSERROR_OK on success, or appropriate error otherwise
*/
-typedef nserror (*treeview_walk_callback)(void *ctx, void *node_data,
+typedef nserror (*treeview_walk_cb)(void *ctx, void *node_data,
enum treeview_node_type type, bool *abort);
/**
@@ -249,17 +249,21 @@ typedef nserror (*treeview_walk_callback)(void *ctx, void *node_data,
*
* \param tree Treeview object to walk
* \param root Root node to walk tree from (or NULL for tree root)
- * \param walk_cb Function to call on each node
+ * \param enter_cb Function to call on entering nodes, or NULL
+ * \param leave_cb Function to call on leaving nodes, or NULL
* \param ctx Client context, passed back to callback function
* \param type The node type(s) of interest
* \return NSERROR_OK on success, or appropriate error otherwise
*
- * Note, if deleting returned node, walk_cb must terminate the treeview walk by
+ * Example usage: To export a treeview as XML, XML elements can be opened in
+ * enter_cb, and closed in leave_cb.
+ *
+ * Note, if deleting returned node in enter_cb, the walk must be terminated by
* setting abort to true.
*/
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);
/**
* Delete a treeview node