mirror of
https://github.com/netsurf-browser/netsurf
synced 2024-11-24 15:29:45 +03:00
Call redraw function on clicks. Enable treewalker to skip the children of collapsed nodes.
This commit is contained in:
parent
83b9c85074
commit
ab403b2517
@ -546,22 +546,24 @@ nserror treeview_destroy(struct treeview *tree)
|
||||
/* Walk a treeview subtree, calling a callback at each node (depth first)
|
||||
*
|
||||
* \param root Root to walk tree from (doesn't get a callback call)
|
||||
* \param full Iff true, visit children of collapsed nodes
|
||||
* \param callback Function to call on each node
|
||||
* \param ctx Context to pass to callback
|
||||
* \return true iff callback caused premature abort
|
||||
*/
|
||||
static bool treeview_walk(struct treeview_node *root,
|
||||
static bool treeview_walk(struct treeview_node *root, bool full,
|
||||
bool (*callback)(struct treeview_node *node,
|
||||
int inset, void *ctx),
|
||||
void *ctx)
|
||||
{
|
||||
struct treeview_node *node;
|
||||
struct treeview_node *node, *next;
|
||||
int inset = tree_g.window_padding - tree_g.step_width;
|
||||
|
||||
node = root;
|
||||
|
||||
while (node != NULL) {
|
||||
struct treeview_node *next = node->children;
|
||||
next = (full || (node->flags & TREE_NODE_EXPANDED)) ?
|
||||
node->children : NULL;
|
||||
|
||||
if (next != NULL) {
|
||||
/* down to children */
|
||||
@ -674,7 +676,7 @@ nserror treeview_node_expand(struct treeview *tree,
|
||||
}
|
||||
|
||||
/* Update the node */
|
||||
node->flags &= TREE_NODE_EXPANDED;
|
||||
node->flags |= TREE_NODE_EXPANDED;
|
||||
|
||||
/* And parent's heights */
|
||||
do {
|
||||
@ -725,7 +727,7 @@ nserror treeview_node_contract(struct treeview *tree,
|
||||
}
|
||||
|
||||
/* Contract children. */
|
||||
treeview_walk(node, treeview_node_contract_cb, NULL);
|
||||
treeview_walk(node, false, treeview_node_contract_cb, NULL);
|
||||
|
||||
/* Contract node */
|
||||
treeview_node_contract_cb(node, 0, NULL);
|
||||
@ -746,7 +748,7 @@ void treeview_redraw(struct treeview *tree, int x, int y, struct rect *clip,
|
||||
const struct redraw_context *ctx)
|
||||
{
|
||||
struct redraw_context new_ctx = *ctx;
|
||||
struct treeview_node *node, *root;
|
||||
struct treeview_node *node, *root, *next;
|
||||
struct treeview_node_entry *entry;
|
||||
struct treeview_node_style *style = &plot_style_odd;
|
||||
struct content_redraw_data data;
|
||||
@ -787,7 +789,7 @@ void treeview_redraw(struct treeview *tree, int x, int y, struct rect *clip,
|
||||
|
||||
while (node != NULL) {
|
||||
int i;
|
||||
struct treeview_node *next = node->flags & TREE_NODE_EXPANDED ?
|
||||
next = (node->flags & TREE_NODE_EXPANDED) ?
|
||||
node->children : NULL;
|
||||
|
||||
if (next != NULL) {
|
||||
@ -883,7 +885,6 @@ void treeview_redraw(struct treeview *tree, int x, int y, struct rect *clip,
|
||||
|
||||
/* Rendered the node */
|
||||
render_y += tree_g.line_height;
|
||||
|
||||
if (render_y > clip->y1) {
|
||||
/* Passed the bottom of what's in the clip region.
|
||||
* Done. */
|
||||
@ -956,6 +957,7 @@ void treeview_redraw(struct treeview *tree, int x, int y, struct rect *clip,
|
||||
}
|
||||
|
||||
struct treeview_mouse_action {
|
||||
struct treeview *tree;
|
||||
browser_mouse_state mouse;
|
||||
int x;
|
||||
int y;
|
||||
@ -965,6 +967,7 @@ static bool treeview_node_mouse_action_cb(struct treeview_node *node,
|
||||
int inset, void *ctx)
|
||||
{
|
||||
struct treeview_mouse_action *ma = ctx;
|
||||
struct rect r;
|
||||
|
||||
/* Skip line if we've not reached mouse y */
|
||||
if (ma->y > ma->current_y + tree_g.line_height) {
|
||||
@ -972,9 +975,16 @@ static bool treeview_node_mouse_action_cb(struct treeview_node *node,
|
||||
return false; /* Don't want to abort tree walk */
|
||||
}
|
||||
|
||||
if (ma->mouse & BROWSER_MOUSE_CLICK_1)
|
||||
if (ma->mouse & BROWSER_MOUSE_CLICK_1) {
|
||||
node->flags ^= TREE_NODE_SELECTED;
|
||||
|
||||
r.x0 = 0;
|
||||
r.y0 = ma->current_y;
|
||||
r.x1 = INT_MAX;
|
||||
r.y1 = ma->current_y + tree_g.line_height;
|
||||
ma->tree->cw_t->redraw_request(ma->tree->cw_h, r);
|
||||
}
|
||||
|
||||
return true; /* Reached line with click; stop walking tree */
|
||||
}
|
||||
void treeview_mouse_action(struct treeview *tree,
|
||||
@ -982,12 +992,13 @@ void treeview_mouse_action(struct treeview *tree,
|
||||
{
|
||||
struct treeview_mouse_action ma;
|
||||
|
||||
ma.tree = tree;
|
||||
ma.mouse = mouse;
|
||||
ma.x = x;
|
||||
ma.y = y;
|
||||
ma.current_y = 0;
|
||||
|
||||
treeview_walk(tree->root, treeview_node_mouse_action_cb, &ma);
|
||||
treeview_walk(tree->root, false, treeview_node_mouse_action_cb, &ma);
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user