Delete and backspace keys delete selected nodes.

This commit is contained in:
Michael Drake 2013-07-01 13:00:46 +01:00
parent c862cd60ad
commit b6219f6685

View File

@ -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: