summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Drake <tlsa@netsurf-browser.org>2013-07-01 13:00:46 +0100
committerMichael Drake <tlsa@netsurf-browser.org>2013-07-01 13:00:46 +0100
commitb6219f6685036bb474f7b9e1ff625169aafd02d0 (patch)
tree1640fbcf36fa29f2fbe10615827d54338b0f3e5a
parentc862cd60ad7d7c6f58795dabd1e4e41baa1d62b8 (diff)
downloadnetsurf-b6219f6685036bb474f7b9e1ff625169aafd02d0.tar.gz
netsurf-b6219f6685036bb474f7b9e1ff625169aafd02d0.tar.bz2
Delete and backspace keys delete selected nodes.
-rw-r--r--desktop/treeview.c41
1 files changed, 39 insertions, 2 deletions
diff --git a/desktop/treeview.c b/desktop/treeview.c
index bca2deade..3035f9e76 100644
--- a/desktop/treeview.c
+++ b/desktop/treeview.c
@@ -1041,7 +1041,8 @@ struct treeview_selection_walk_data {
TREEVIEW_WALK_HAS_SELECTION,
TREEVIEW_WALK_CLEAR_SELECTION,
TREEVIEW_WALK_SELECT_ALL,
- TREEVIEW_WALK_COMMIT_SELECT_DRAG
+ TREEVIEW_WALK_COMMIT_SELECT_DRAG,
+ TREEVIEW_WALK_DELETE_SELECTION
} purpose;
union {
bool has_selection;
@@ -1055,6 +1056,7 @@ struct treeview_selection_walk_data {
} drag;
} data;
int current_y;
+ struct treeview *tree;
};
/** Treewalk node callback for handling selection related actions. */
static bool treeview_node_selection_walk_cb(struct treeview_node *node,
@@ -1076,6 +1078,13 @@ static bool treeview_node_selection_walk_cb(struct treeview_node *node,
}
break;
+ case TREEVIEW_WALK_DELETE_SELECTION:
+ if (node->flags & TREE_NODE_SELECTED) {
+ treeview_delete_node(sw->tree, node);
+ changed = true;
+ }
+ break;
+
case TREEVIEW_WALK_CLEAR_SELECTION:
if (node->flags & TREE_NODE_SELECTED) {
node->flags ^= TREE_NODE_SELECTED;
@@ -1196,6 +1205,34 @@ static void treeview_commit_selection_drag(struct treeview *tree)
}
+/**
+ * Commit a current selection drag, modifying the node's selection state.
+ */
+static bool treeview_delete_selection(struct treeview *tree, struct rect *rect)
+{
+ struct treeview_selection_walk_data sw;
+
+ assert(tree != NULL);
+ assert(tree->root != NULL);
+
+ rect->x0 = 0;
+ rect->y0 = 0;
+ rect->x1 = REDRAW_MAX;
+ rect->y1 = tree->root->height;
+
+ sw.purpose = TREEVIEW_WALK_DELETE_SELECTION;
+ sw.data.redraw.required = false;
+ sw.data.redraw.rect = rect;
+ sw.current_y = 0;
+ sw.tree = tree;
+
+ treeview_walk_internal(tree->root, false,
+ treeview_node_selection_walk_cb, &sw);
+
+ return sw.data.redraw.required;
+}
+
+
/* Exported interface, documented in treeview.h */
bool treeview_keypress(struct treeview *tree, uint32_t key)
{
@@ -1213,7 +1250,7 @@ bool treeview_keypress(struct treeview *tree, uint32_t key)
break;
case KEY_DELETE_LEFT:
case KEY_DELETE_RIGHT:
- /* TODO: Delete selection */
+ redraw = treeview_delete_selection(tree, &r);
break;
case KEY_CR:
case KEY_NL: