Select: Add 'deselect on nothing' to nodes selection.
authorBastien Montagne <montagne29@wanadoo.fr>
Mon, 29 Apr 2019 10:12:50 +0000 (12:12 +0200)
committerBastien Montagne <montagne29@wanadoo.fr>
Tue, 30 Apr 2019 09:34:22 +0000 (11:34 +0200)
Part of T63995.

release/scripts/presets/keyconfig/keymap_data/blender_default.py
source/blender/editors/space_node/node_select.c

index 5fd86d4..5c18d57 100644 (file)
@@ -5280,7 +5280,7 @@ def km_node_editor_tool_select(params):
         {"space_type": 'NODE_EDITOR', "region_type": 'WINDOW'},
         {"items": [
             ("node.select", {"type": params.select_mouse, "value": 'PRESS'},
-             {"properties": [("extend", False)]}),
+             {"properties": [("extend", False), ("deselect_all", not params.legacy)]}),
         ]},
     )
 
index 58531ec..2d234c5 100644 (file)
@@ -429,8 +429,13 @@ void node_select_single(bContext *C, bNode *node)
   WM_event_add_notifier(C, NC_NODE | NA_SELECTED, NULL);
 }
 
-static int node_mouse_select(
-    Main *bmain, SpaceNode *snode, ARegion *ar, const int mval[2], bool extend, bool socket_select)
+static int node_mouse_select(Main *bmain,
+                             SpaceNode *snode,
+                             ARegion *ar,
+                             const int mval[2],
+                             const bool extend,
+                             const bool socket_select,
+                             const bool deselect_all)
 {
   bNode *node, *tnode;
   bNodeSocket *sock = NULL;
@@ -500,13 +505,15 @@ static int node_mouse_select(
       /* find the closest visible node */
       node = node_under_mouse_select(snode->edittree, cursor[0], cursor[1]);
 
-      if (node) {
+      if (node != NULL || deselect_all) {
         for (tnode = snode->edittree->nodes.first; tnode; tnode = tnode->next) {
           nodeSetSelected(tnode, false);
         }
-        nodeSetSelected(node, true);
-        ED_node_set_active(bmain, snode->edittree, node);
         selected = true;
+        if (node != NULL) {
+          nodeSetSelected(node, true);
+          ED_node_set_active(bmain, snode->edittree, node);
+        }
       }
     }
   }
@@ -526,19 +533,18 @@ static int node_select_exec(bContext *C, wmOperator *op)
   SpaceNode *snode = CTX_wm_space_node(C);
   ARegion *ar = CTX_wm_region(C);
   int mval[2];
-  short extend;
-  bool socket_select;
 
   /* get settings from RNA properties for operator */
   mval[0] = RNA_int_get(op->ptr, "mouse_x");
   mval[1] = RNA_int_get(op->ptr, "mouse_y");
 
-  extend = RNA_boolean_get(op->ptr, "extend");
+  const bool extend = RNA_boolean_get(op->ptr, "extend");
   /* always do socket_select when extending selection. */
-  socket_select = extend || RNA_boolean_get(op->ptr, "socket_select");
+  const bool socket_select = extend || RNA_boolean_get(op->ptr, "socket_select");
+  const bool deselect_all = RNA_boolean_get(op->ptr, "deselect_all");
 
   /* perform the select */
-  if (node_mouse_select(bmain, snode, ar, mval, extend, socket_select)) {
+  if (node_mouse_select(bmain, snode, ar, mval, extend, socket_select, deselect_all)) {
     /* send notifiers */
     WM_event_add_notifier(C, NC_NODE | NA_SELECTED, NULL);
 
@@ -579,6 +585,11 @@ void NODE_OT_select(wmOperatorType *ot)
   RNA_def_int(ot->srna, "mouse_y", 0, INT_MIN, INT_MAX, "Mouse Y", "", INT_MIN, INT_MAX);
   RNA_def_boolean(ot->srna, "extend", false, "Extend", "");
   RNA_def_boolean(ot->srna, "socket_select", false, "Socket Select", "");
+  RNA_def_boolean(ot->srna,
+                  "deselect_all",
+                  0,
+                  "Deselect On Nothing",
+                  "Deselect all when nothing under the cursor");
 }
 
 /** \} */