From 8fc3baa48d164f8f4fa5b94bf498fdb30eac3daa Mon Sep 17 00:00:00 2001 From: Michael Drake Date: Tue, 20 Dec 2011 14:46:29 +0000 Subject: When deleting multiple treeview nodes, don't redraw after every node is deleted, only after the whole lot has gone. (Much faster.) Fix redraw to clear bottom of treeview after deleting nodes. svn path=/trunk/netsurf/; revision=13306 --- desktop/tree.c | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) (limited to 'desktop/tree.c') diff --git a/desktop/tree.c b/desktop/tree.c index 7818b376d..0432fe051 100644 --- a/desktop/tree.c +++ b/desktop/tree.c @@ -1132,7 +1132,8 @@ static void tree_delete_node_internal(struct tree *tree, struct node *node, */ void tree_delete(struct tree *tree) { - tree_set_redraw(tree, false); + tree->redraw = false; + if (tree->root->child != NULL) tree_delete_node_internal(tree, tree->root->child, true); @@ -1164,11 +1165,19 @@ bool tree_get_redraw(struct tree *tree) void tree_delete_node(struct tree *tree, struct node *node, bool siblings) { int y = node->box.y; + int height = tree->height; + bool redraw_setting = tree->redraw; + + tree->redraw = false; + tree_delete_node_internal(tree, node, siblings); tree_recalculate_node_positions(tree, tree->root); + + tree->redraw = redraw_setting; + if (tree->redraw) - tree->callbacks->redraw_request(0, y, tree->width, tree->height, - tree->client_data); + tree->callbacks->redraw_request(0, y, + tree->width, height, tree->client_data); tree_recalculate_size(tree); } @@ -2107,10 +2116,22 @@ struct node_element *tree_node_find_element(struct node *node, void tree_delete_selected_nodes(struct tree *tree, struct node *node) { struct node *next; + int y = node->box.y; + int height = tree->height; + bool redraw_setting = tree->redraw; + + tree->redraw = false; if (node == tree->root) { if (node->child != NULL) tree_delete_selected_nodes(tree, node->child); + + tree->redraw = redraw_setting; + + if (tree->redraw) + tree->callbacks->redraw_request(0, y, + tree->width, height, + tree->client_data); return; } @@ -2122,6 +2143,13 @@ void tree_delete_selected_nodes(struct tree *tree, struct node *node) tree_delete_selected_nodes(tree, node->child); node = next; } + + tree->redraw = redraw_setting; + + if (tree->redraw) + tree->callbacks->redraw_request(0, y, + tree->width, height, + tree->client_data); } -- cgit v1.2.3