summaryrefslogtreecommitdiff
path: root/desktop/tree.c
diff options
context:
space:
mode:
authorMichael Drake <tlsa@netsurf-browser.org>2011-12-20 14:46:29 +0000
committerMichael Drake <tlsa@netsurf-browser.org>2011-12-20 14:46:29 +0000
commit8fc3baa48d164f8f4fa5b94bf498fdb30eac3daa (patch)
tree9e8a02eac248f0934659fdeeca1ce6793f024bad /desktop/tree.c
parent67501d5dfcc2d18f82421b939f7d3ad3f556a5d9 (diff)
downloadnetsurf-8fc3baa48d164f8f4fa5b94bf498fdb30eac3daa.tar.gz
netsurf-8fc3baa48d164f8f4fa5b94bf498fdb30eac3daa.tar.bz2
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
Diffstat (limited to 'desktop/tree.c')
-rw-r--r--desktop/tree.c34
1 files changed, 31 insertions, 3 deletions
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);
}