From 541724fb0dc4ba82bce76ad779770d37266c1818 Mon Sep 17 00:00:00 2001 From: Michael Drake Date: Tue, 3 Sep 2013 19:43:59 +0100 Subject: [PATCH] Add hotlist iteration function. --- desktop/hotlist.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++ desktop/hotlist.h | 48 +++++++++++++++++++++++++++++++++++++ 2 files changed, 109 insertions(+) diff --git a/desktop/hotlist.c b/desktop/hotlist.c index 9f981387c..68caa2097 100644 --- a/desktop/hotlist.c +++ b/desktop/hotlist.c @@ -948,6 +948,67 @@ nserror hotlist_export(const char *path, const char *title) } +struct hotlist_iterate_ctx { + hotlist_folder_enter_cb enter_cb; + hotlist_address_cb address_cb; + hotlist_folder_leave_cb leave_cb; + void *ctx; +}; +/** Callback for hotlist_iterate node entering */ +static nserror hotlist_iterate_enter_cb(void *ctx, void *node_data, + enum treeview_node_type type, bool *abort) +{ + struct hotlist_iterate_ctx *data = ctx; + + if (type == TREE_NODE_ENTRY && data->address_cb != NULL) { + struct hotlist_entry *e = node_data; + data->address_cb(data->ctx, e->url, + e->data[HL_TITLE].value); + + } else if (type == TREE_NODE_FOLDER && data->enter_cb != NULL) { + struct hotlist_folder *f = node_data; + data->enter_cb(data->ctx, f->data.value); + } + + return NSERROR_OK; +} +/** Callback for hotlist_iterate node leaving */ +static nserror hotlist_iterate_leave_cb(void *ctx, void *node_data, + enum treeview_node_type type, bool *abort) +{ + struct hotlist_iterate_ctx *data = ctx; + + if (type == TREE_NODE_FOLDER && data->leave_cb != NULL) { + data->leave_cb(data->ctx); + } + + return NSERROR_OK; +} +/* Exported interface, documented in hotlist.h */ +nserror hotlist_iterate(void *ctx, + hotlist_folder_enter_cb enter_cb, + hotlist_address_cb address_cb, + hotlist_folder_leave_cb leave_cb) +{ + struct hotlist_iterate_ctx data; + nserror err; + + data.enter_cb = enter_cb; + data.address_cb = address_cb; + data.leave_cb = leave_cb; + data.ctx = ctx; + + err = treeview_walk(hl_ctx.tree, NULL, + hotlist_iterate_enter_cb, + hotlist_iterate_leave_cb, + &data, TREE_NODE_ENTRY | TREE_NODE_FOLDER); + if (err != NSERROR_OK) + return err; + + return NSERROR_OK; +} + + /** * Initialise the treeview entry feilds * diff --git a/desktop/hotlist.h b/desktop/hotlist.h index 121eb95ef..c6e74f2cc 100644 --- a/desktop/hotlist.h +++ b/desktop/hotlist.h @@ -117,6 +117,54 @@ nserror hotlist_add_folder(const char *title, bool at_y, int y); */ nserror hotlist_export(const char *path, const char *title); +/** + * Client callback for hotlist_iterate, reporting entry into folder + * + * \param ctx Client context + * \param title The entered folder's title + * \return NSERROR_OK on success, or appropriate error otherwise + */ +typedef nserror (*hotlist_folder_enter_cb)(void *ctx, const char *title); + +/** + * Client callback for hotlist_iterate, reporting a hotlist address + * + * \param ctx Client context + * \param url The entry's address + * \param title The entry's title + * \return NSERROR_OK on success, or appropriate error otherwise + */ +typedef nserror (*hotlist_address_cb)(void *ctx, nsurl *url, const char *title); + +/** + * Client callback for hotlist_iterate, reporting a hotlist folder departure + * + * \param ctx Client context + * \param title The departed folder's title + * \return NSERROR_OK on success, or appropriate error otherwise + */ +typedef nserror (*hotlist_folder_leave_cb)(void *ctx); + + +/** + * Walk (depth first) the hotlist, calling callbacks on entering folders, + * address nodes, and on leaving folders. + * + * \param ctx Client context, passed back to callback function + * \param enter_cb Function to call on entering nodes, or NULL + * \param address_cb Function to call on address nodes, or NULL + * \param leave_cb Function to call on leaving nodes, or NULL + * \return NSERROR_OK on success, or appropriate error otherwise + * + * Example usage: Generate a menu containing hotlist entries. For flat list + * set enter_cb and leave_cb to NULL, or for hierarchical menu + * provide the folder callbacks. + */ +nserror hotlist_iterate(void *ctx, + hotlist_folder_enter_cb enter_cb, + hotlist_address_cb address_cb, + hotlist_folder_leave_cb leave_cb); + /** * Redraw the hotlist. *