diff options
author | Michael Drake <tlsa@netsurf-browser.org> | 2013-08-16 20:34:41 +0100 |
---|---|---|
committer | Michael Drake <tlsa@netsurf-browser.org> | 2013-08-16 20:34:41 +0100 |
commit | 304523553c3a5bde577d08ee7abe1ef1760addd8 (patch) | |
tree | 8dbd99dbfcbea864cef1929e5ad84ad0178af051 | |
parent | a9cad3cfa80d8c6bcb14cc2ffa26f34bcfc428f3 (diff) | |
download | netsurf-304523553c3a5bde577d08ee7abe1ef1760addd8.tar.gz netsurf-304523553c3a5bde577d08ee7abe1ef1760addd8.tar.bz2 |
Start optimising drop indicator redraw.
-rw-r--r-- | desktop/treeview.c | 58 |
1 files changed, 37 insertions, 21 deletions
diff --git a/desktop/treeview.c b/desktop/treeview.c index 4bc50bb94..d443b9bc6 100644 --- a/desktop/treeview.c +++ b/desktop/treeview.c @@ -65,6 +65,13 @@ enum treeview_node_flags { TREE_NODE_SELECTED = (1 << 1) /**< Whether node is selected */ }; +enum treeview_target_pos { + TV_TARGET_ABOVE, + TV_TARGET_INSIDE, + TV_TARGET_BELOW, + TV_TARGET_NONE +}; + struct treeview_node { enum treeview_node_flags flags; /**< Node flags */ enum treeview_node_type type; /**< Node type */ @@ -122,12 +129,7 @@ struct treeview { struct treeview_drag drag; /**< Drag state */ treeview_node *target; /**< Move target */ treeview_node *target_display; /**< Target indicator render node */ - enum { - TV_TARGET_ABOVE, - TV_TARGET_INSIDE, - TV_TARGET_BELOW, - TV_TARGET_NONE - } target_pos; /**< Drag type */ + enum treeview_target_pos target_pos; /**< Pos wrt render node */ const struct treeview_callback_table *callbacks; /**< For node events */ @@ -1796,33 +1798,37 @@ static bool treeview_set_move_indicator(treeview *tree, browser_mouse_state mouse, treeview_node *node, int node_height, int mouse_pos, struct rect *rect) { + treeview_node *target; + treeview_node *target_display; + enum treeview_target_pos target_pos; + switch (node->type) { case TREE_NODE_FOLDER: if (mouse_pos <= node_height / 4) { - tree->target = node; - tree->target_display = node; - tree->target_pos = TV_TARGET_ABOVE; + target = node; + target_display = node; + target_pos = TV_TARGET_ABOVE; } else if (mouse_pos <= (3 * node_height) / 4 || node->flags & TREE_NODE_EXPANDED) { - tree->target = node; - tree->target_display = node; - tree->target_pos = TV_TARGET_INSIDE; + target = node; + target_display = node; + target_pos = TV_TARGET_INSIDE; } else { - tree->target = node; - tree->target_display = treeview_node_next(node, false); - tree->target_pos = TV_TARGET_BELOW; + target = node; + target_display = treeview_node_next(node, false); + target_pos = TV_TARGET_BELOW; } break; case TREE_NODE_ENTRY: if (mouse_pos <= node_height / 2) { - tree->target = node; - tree->target_display = node; - tree->target_pos = TV_TARGET_ABOVE; + target = node; + target_display = node; + target_pos = TV_TARGET_ABOVE; } else { - tree->target = node; - tree->target_display = treeview_node_next(node, false); - tree->target_pos = TV_TARGET_BELOW; + target = node; + target_display = treeview_node_next(node, false); + target_pos = TV_TARGET_BELOW; } break; @@ -1831,6 +1837,16 @@ static bool treeview_set_move_indicator(treeview *tree, return false; } + if (target == tree->target && target_display == tree->target_display && + target_pos == tree->target_pos) { + /* No change */ + return false; + } + + tree->target = target; + tree->target_display = target_display; + tree->target_pos = target_pos; + /* TODO: proper values */ rect->x0 = 0; rect->y0 = 0; |