summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Drake <tlsa@netsurf-browser.org>2013-08-16 20:34:41 +0100
committerMichael Drake <tlsa@netsurf-browser.org>2013-08-16 20:34:41 +0100
commit304523553c3a5bde577d08ee7abe1ef1760addd8 (patch)
tree8dbd99dbfcbea864cef1929e5ad84ad0178af051
parenta9cad3cfa80d8c6bcb14cc2ffa26f34bcfc428f3 (diff)
downloadnetsurf-304523553c3a5bde577d08ee7abe1ef1760addd8.tar.gz
netsurf-304523553c3a5bde577d08ee7abe1ef1760addd8.tar.bz2
Start optimising drop indicator redraw.
-rw-r--r--desktop/treeview.c58
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;