Outliner: Add range extend select

Add support for ctrl+shift+lmb to default and industry compatible
keymaps to select a range without removing the existing selection.
This commit is contained in:
Nathan Craddock 2019-08-17 17:06:02 -06:00
parent 74d05eb71a
commit 4421eb684d
3 changed files with 12 additions and 5 deletions

View File

@ -707,6 +707,8 @@ def km_outliner(params):
{"properties": [("extend", True), ("deselect_all", not params.legacy)]}),
("outliner.item_activate", {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True},
{"properties": [("extend", False), ("extend_range", True), ("deselect_all", not params.legacy)]}),
("outliner.item_activate", {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True, "shift": True},
{"properties": [("extend", True), ("extend_range", True), ("deselect_all", not params.legacy)]}),
("outliner.select_box", {"type": 'B', "value": 'PRESS'}, None),
("outliner.select_box", {"type": 'EVT_TWEAK_L', "value": 'ANY'}, {"properties": [("tweak", True)]}),
("outliner.select_box", {"type": 'EVT_TWEAK_L', "value": 'ANY', "shift": True},

View File

@ -450,6 +450,8 @@ def km_outliner(params):
{"properties": [("extend", True), ("deselect_all", True)]}),
("outliner.item_activate", {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True},
{"properties": [("extend", False), ("extend_range", True), ("deselect_all", True)]}),
("outliner.item_activate", {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True, "shift": True},
{"properties": [("extend", True), ("extend_range", True), ("deselect_all", True)]}),
("outliner.select_box", {"type": 'EVT_TWEAK_L', "value": 'ANY'}, {"properties": [("tweak", True)]}),
("outliner.select_box", {"type": 'EVT_TWEAK_L', "value": 'ANY', "shift": True},
{"properties": [("tweak", True), ("mode", "ADD")]}),

View File

@ -1269,7 +1269,10 @@ static void do_outliner_range_select_recursive(ListBase *lb,
}
/* Select a range of items between cursor and active element */
static void do_outliner_range_select(bContext *C, SpaceOutliner *soops, TreeElement *cursor)
static void do_outliner_range_select(bContext *C,
SpaceOutliner *soops,
TreeElement *cursor,
const bool extend)
{
TreeElement *active = outliner_find_element_with_flag(&soops->tree, TSE_ACTIVE);
outliner_flag_set(&soops->tree, TSE_ACTIVE_WALK, false);
@ -1283,7 +1286,9 @@ static void do_outliner_range_select(bContext *C, SpaceOutliner *soops, TreeElem
TreeStoreElem *tselem = TREESTORE(active);
const bool active_selected = (tselem->flag & TSE_SELECTED);
outliner_flag_set(&soops->tree, TSE_SELECTED | TSE_ACTIVE_WALK, false);
if (!extend) {
outliner_flag_set(&soops->tree, TSE_SELECTED | TSE_ACTIVE_WALK, false);
}
/* Select active if under cursor */
if (active == cursor) {
@ -1298,8 +1303,6 @@ static void do_outliner_range_select(bContext *C, SpaceOutliner *soops, TreeElem
return;
}
outliner_flag_set(&soops->tree, TSE_SELECTED, false);
bool selecting = false;
do_outliner_range_select_recursive(&soops->tree, active, cursor, &selecting);
}
@ -1380,7 +1383,7 @@ static int outliner_item_do_activate_from_cursor(bContext *C,
TreeStoreElem *activate_tselem = TREESTORE(activate_te);
if (use_range) {
do_outliner_range_select(C, soops, activate_te);
do_outliner_range_select(C, soops, activate_te, extend);
}
else {
outliner_item_select(soops, activate_te, extend, extend);