Add hotlist iteration function.
This commit is contained in:
parent
1658554437
commit
541724fb0d
|
@ -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
|
* Initialise the treeview entry feilds
|
||||||
*
|
*
|
||||||
|
|
|
@ -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);
|
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.
|
* Redraw the hotlist.
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in New Issue