Commit: c68dff9ff71ca5a8b330309b09854b90fab798cb
Author: Nathan Craddock
Date:   Thu Jun 27 17:50:21 2019 -0600
Branches: soc-2019-outliner
https://developer.blender.org/rBc68dff9ff71ca5a8b330309b09854b90fab798cb

Outliner: Add extend selection to walk select

Walk select now extends the selection when shift is pressed.
This implementation works well, though if there are existing
selections in the tree the behavior may not work as expected.
This could be improved on in the future if that is a problem.

===================================================================

M       release/scripts/presets/keyconfig/keymap_data/blender_default.py
M       source/blender/editors/space_outliner/outliner_select.c

===================================================================

diff --git a/release/scripts/presets/keyconfig/keymap_data/blender_default.py 
b/release/scripts/presets/keyconfig/keymap_data/blender_default.py
index 6b02d4a4564..128f97fed1b 100644
--- a/release/scripts/presets/keyconfig/keymap_data/blender_default.py
+++ b/release/scripts/presets/keyconfig/keymap_data/blender_default.py
@@ -715,7 +715,11 @@ def km_outliner(params):
         ("outliner.select_box", {"type": 'EVT_TWEAK_L', "value": 'ANY', 
"ctrl": True},
          {"properties": [("tweak", True), ("mode", "SUB")]}),
         ("outliner.select_walk", {"type": 'UP_ARROW', "value": 'PRESS'}, 
{"properties": [("direction", 'UP')]}),
+        ("outliner.select_walk", {"type": 'UP_ARROW', "value": 'PRESS', 
"shift": True},
+         {"properties": [("direction", 'UP'), ("extend", True)]}),
         ("outliner.select_walk", {"type": 'DOWN_ARROW', "value": 'PRESS'}, 
{"properties": [("direction", 'DOWN')]}),
+        ("outliner.select_walk", {"type": 'DOWN_ARROW', "value": 'PRESS', 
"shift": True},
+         {"properties": [("direction", 'DOWN'), ("extend", True)]}),
         ("outliner.select_walk", {"type": 'LEFT_ARROW', "value": 'PRESS'}, 
{"properties": [("direction", 'LEFT')]}),
         ("outliner.select_walk", {"type": 'RIGHT_ARROW', "value": 'PRESS'}, 
{"properties": [("direction", 'RIGHT')]}),
         ("outliner.item_openclose", {"type": 'RET', "value": 'PRESS'},
diff --git a/source/blender/editors/space_outliner/outliner_select.c 
b/source/blender/editors/space_outliner/outliner_select.c
index 048a915a10b..29e5ba92cf7 100644
--- a/source/blender/editors/space_outliner/outliner_select.c
+++ b/source/blender/editors/space_outliner/outliner_select.c
@@ -1634,11 +1634,16 @@ static TreeElement 
*do_outliner_select_walk_down(SpaceOutliner *soops, TreeEleme
   return active;
 }
 
-static void do_outliner_select_walk(SpaceOutliner *soops, TreeElement *active, 
const int direction)
+static void do_outliner_select_walk(SpaceOutliner *soops,
+                                    TreeElement *active,
+                                    const int direction,
+                                    const bool extend)
 {
   TreeStoreElem *tselem = TREESTORE(active);
 
-  outliner_flag_set(&soops->tree, TSE_SELECTED, false);
+  if (!extend) {
+    outliner_flag_set(&soops->tree, TSE_SELECTED, false);
+  }
   tselem->flag &= ~TSE_ACTIVE;
 
   switch (direction) {
@@ -1663,9 +1668,15 @@ static void do_outliner_select_walk(SpaceOutliner 
*soops, TreeElement *active, c
       }
       break;
   }
+  TreeStoreElem *tselem_new = TREESTORE(active);
+
+  if (extend) {
+    const short new_flag = (extend && (tselem_new->flag & TSE_SELECTED)) ? 0 : 
TSE_SELECTED;
+    tselem->flag &= ~(TSE_ACTIVE | TSE_SELECTED);
+    tselem->flag |= new_flag;
+  }
 
-  tselem = TREESTORE(active);
-  tselem->flag |= TSE_SELECTED | TSE_ACTIVE;
+  tselem_new->flag |= TSE_SELECTED | TSE_ACTIVE;
 }
 
 static int outliner_walk_select_invoke(bContext *C, wmOperator *op, const 
wmEvent *UNUSED(event))
@@ -1673,6 +1684,7 @@ static int outliner_walk_select_invoke(bContext *C, 
wmOperator *op, const wmEven
   SpaceOutliner *soops = CTX_wm_space_outliner(C);
   ARegion *ar = CTX_wm_region(C);
   const int direction = RNA_enum_get(op->ptr, "direction");
+  const bool extend = RNA_boolean_get(op->ptr, "extend");
 
   TreeElement *active = outliner_find_active_element(&soops->tree);
 
@@ -1698,7 +1710,7 @@ static int outliner_walk_select_invoke(bContext *C, 
wmOperator *op, const wmEven
       tselem->flag |= TSE_SELECTED;
     }
     else {
-      do_outliner_select_walk(soops, active, direction);
+      do_outliner_select_walk(soops, active, direction, extend);
     }
   }
 
@@ -1738,6 +1750,8 @@ void OUTLINER_OT_select_walk(wmOperatorType *ot)
                       "Walk Direction",
                       "Select file in this direction");
   RNA_def_property_flag(prop, PROP_SKIP_SAVE);
+  prop = RNA_def_boolean(ot->srna, "extend", false, "Extend", "Extend 
selection on walk");
+  RNA_def_property_flag(prop, PROP_SKIP_SAVE);
 }
 
 /* ****************************************************** */

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to