[Bf-blender-cvs] [d356edf420b] master: UV: support "Tweak Tool: Left Mouse Select & Move"

Campbell Barton noreply at git.blender.org
Wed Mar 23 06:09:54 CET 2022


Commit: d356edf420ba13b3a544dcc598a0e31a36e1d86c
Author: Campbell Barton
Date:   Fri Mar 18 00:28:15 2022 +1100
Branches: master
https://developer.blender.org/rBd356edf420ba13b3a544dcc598a0e31a36e1d86c

UV: support "Tweak Tool: Left Mouse Select & Move"

- Follow the same conventions as the 3D viewport for UV selection
  (using SelectPick_Params internally).

- Use WM_operator_properties_mouse_select for selection properties.

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

M	release/scripts/presets/keyconfig/keymap_data/blender_default.py
M	release/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py
M	source/blender/editors/uvedit/uvedit_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 ac9258d53ca..35197c93015 100644
--- a/release/scripts/presets/keyconfig/keymap_data/blender_default.py
+++ b/release/scripts/presets/keyconfig/keymap_data/blender_default.py
@@ -4716,7 +4716,7 @@ def _template_uv_select(*, type, value, legacy):
         ("uv.select", {"type": type, "value": value},
          {"properties": [("deselect_all", not legacy)]}),
         ("uv.select", {"type": type, "value": value, "shift": True},
-         {"properties": [("extend", True)]}),
+         {"properties": [("toggle", True)]}),
     ]
 
 
@@ -6306,7 +6306,7 @@ def km_image_editor_tool_uv_select(params, *, fallback):
         {"space_type": 'IMAGE_EDITOR', "region_type": 'WINDOW'},
         {"items": [
             *([] if (fallback and (params.select_mouse == 'RIGHTMOUSE')) else _template_items_tool_select(
-                params, "uv.select", "uv.cursor_set", fallback, extend="extend")),
+                params, "uv.select", "uv.cursor_set", fallback, extend="toggle")),
             *([] if (not params.use_fallback_tool_rmb) else _template_uv_select(
                 type=params.select_mouse, value=params.select_mouse_value, legacy=params.legacy)),
         ]},
diff --git a/release/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py b/release/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py
index 55ee91af7cd..6661031552e 100644
--- a/release/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py
+++ b/release/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py
@@ -564,9 +564,9 @@ def km_uv_editor(params):
          {"properties": [("type", 'ISLAND')]}),
 
         ("uv.select", {"type": 'LEFTMOUSE', "value": 'CLICK'},
-         {"properties": [("extend", False), ("deselect_all", True)]}),
+         {"properties": [("deselect_all", True)]}),
         ("uv.select", {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True},
-         {"properties": [("extend", True), ("deselect_all", False)]}),
+         {"properties": [("toggle", True), ("deselect_all", False)]}),
 
         ("transform.translate", {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, None),
         ("uv.select_loop", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK', "shift": True},
diff --git a/source/blender/editors/uvedit/uvedit_select.c b/source/blender/editors/uvedit/uvedit_select.c
index 938b798f4b6..ed4aa6985c4 100644
--- a/source/blender/editors/uvedit/uvedit_select.c
+++ b/source/blender/editors/uvedit/uvedit_select.c
@@ -2388,12 +2388,11 @@ void UV_OT_select_all(wmOperatorType *ot)
 /** \name Mouse Select Operator
  * \{ */
 
-static int uv_mouse_select_multi(bContext *C,
-                                 Object **objects,
-                                 uint objects_len,
-                                 const float co[2],
-                                 const bool extend,
-                                 const bool deselect_all)
+static bool uv_mouse_select_multi(bContext *C,
+                                  Object **objects,
+                                  uint objects_len,
+                                  const float co[2],
+                                  const struct SelectPick_Params *params)
 {
   Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C);
   const ARegion *region = CTX_wm_region(C);
@@ -2477,117 +2476,145 @@ static int uv_mouse_select_multi(bContext *C,
     }
   }
 
-  if (!found_item) {
-    if (deselect_all) {
-      uv_select_all_perform_multi(scene, objects, objects_len, SEL_DESELECT);
+  bool found = found_item;
+  bool changed = false;
+
+  bool is_selected = false;
+  if (found) {
+    Object *obedit = hit.ob;
+    BMEditMesh *em = BKE_editmesh_from_object(obedit);
+    const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
+    if (selectmode == UV_SELECT_FACE) {
+      is_selected = uvedit_face_select_test(scene, hit.efa, cd_loop_uv_offset);
+    }
+    else if (selectmode == UV_SELECT_EDGE) {
+      is_selected = uvedit_edge_select_test(scene, hit.l, cd_loop_uv_offset);
+    }
+    else { /* Vertex or island. */
+      is_selected = uvedit_uv_select_test(scene, hit.l, cd_loop_uv_offset);
+    }
+  }
 
+  if (params->sel_op == SEL_OP_SET) {
+    if ((found && params->select_passthrough) && is_selected) {
+      found = false;
+    }
+    else if (found || params->deselect_all) {
+      /* Deselect everything. */
+      uv_select_all_perform_multi(scene, objects, objects_len, SEL_DESELECT);
       for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
         Object *obedit = objects[ob_index];
         uv_select_tag_update_for_object(depsgraph, ts, obedit);
       }
-
-      return OPERATOR_PASS_THROUGH | OPERATOR_FINISHED;
+      changed = true;
     }
-    return OPERATOR_CANCELLED;
   }
 
-  Object *obedit = hit.ob;
-  BMEditMesh *em = BKE_editmesh_from_object(obedit);
-  const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
+  if (found) {
+    Object *obedit = hit.ob;
+    BMEditMesh *em = BKE_editmesh_from_object(obedit);
+    const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
 
-  /* do selection */
-  if (selectmode == UV_SELECT_ISLAND) {
-    if (!extend) {
-      uv_select_all_perform_multi_ex(scene, objects, objects_len, SEL_DESELECT, obedit);
-    }
-    /* Current behavior of 'extend'
-     * is actually toggling, so pass extend flag as 'toggle' here */
-    uv_select_linked_multi(scene, objects, objects_len, &hit, false, false, extend, false);
-  }
-  else if (extend) {
-    bool select = true;
-    if (selectmode == UV_SELECT_VERTEX) {
-      /* (de)select uv vertex */
-      select = !uvedit_uv_select_test(scene, hit.l, cd_loop_uv_offset);
-      uvedit_uv_select_set_with_sticky(scene, em, hit.l, select, true, cd_loop_uv_offset);
-      flush = 1;
-    }
-    else if (selectmode == UV_SELECT_EDGE) {
-      /* (de)select edge */
-      select = !(uvedit_edge_select_test(scene, hit.l, cd_loop_uv_offset));
-      uvedit_edge_select_set_with_sticky(scene, em, hit.l, select, true, cd_loop_uv_offset);
-      flush = 1;
-    }
-    else if (selectmode == UV_SELECT_FACE) {
-      /* (de)select face */
-      select = !(uvedit_face_select_test(scene, hit.efa, cd_loop_uv_offset));
-      uvedit_face_select_set_with_sticky(scene, em, hit.efa, select, true, cd_loop_uv_offset);
-      flush = -1;
+    if (selectmode == UV_SELECT_ISLAND) {
+      const bool extend = params->sel_op == SEL_OP_ADD;
+      const bool deselect = params->sel_op == SEL_OP_SUB;
+      const bool toggle = params->sel_op == SEL_OP_XOR;
+      /* Current behavior of 'extend'
+       * is actually toggling, so pass extend flag as 'toggle' here */
+      uv_select_linked_multi(scene, objects, objects_len, &hit, extend, deselect, toggle, false);
+      /* TODO: check if this actually changed. */
+      changed = true;
     }
+    else {
+      BLI_assert(ELEM(selectmode, UV_SELECT_VERTEX, UV_SELECT_EDGE, UV_SELECT_FACE));
+      bool select_value = false;
+      switch (params->sel_op) {
+        case SEL_OP_ADD: {
+          select_value = true;
+          break;
+        }
+        case SEL_OP_SUB: {
+          select_value = false;
+          break;
+        }
+        case SEL_OP_XOR: {
+          select_value = !is_selected;
+          break;
+        }
+        case SEL_OP_SET: {
+          /* Deselect has already been performed. */
+          select_value = true;
+          break;
+        }
+        case SEL_OP_AND: {
+          BLI_assert_unreachable(); /* Doesn't make sense for picking. */
+          break;
+        }
+      }
 
-    /* de-selecting an edge may deselect a face too - validate */
-    if (ts->uv_flag & UV_SYNC_SELECTION) {
-      if (select == false) {
-        BM_select_history_validate(em->bm);
+      if (selectmode == UV_SELECT_FACE) {
+        uvedit_face_select_set_with_sticky(
+            scene, em, hit.efa, select_value, true, cd_loop_uv_offset);
+        flush = 1;
+      }
+      else if (selectmode == UV_SELECT_EDGE) {
+        uvedit_edge_select_set_with_sticky(
+            scene, em, hit.l, select_value, true, cd_loop_uv_offset);
+        flush = 1;
+      }
+      else if (selectmode == UV_SELECT_VERTEX) {
+        uvedit_uv_select_set_with_sticky(scene, em, hit.l, select_value, true, cd_loop_uv_offset);
+        flush = 1;
+      }
+      else {
+        BLI_assert_unreachable();
       }
-    }
 
-    /* (de)select sticky uv nodes */
-    if (sticky != SI_STICKY_DISABLE) {
-      flush = select ? 1 : -1;
-    }
-  }
-  else {
-    const bool select = true;
-    /* deselect all */
-    uv_select_all_perform_multi(scene, objects, objects_len, SEL_DESELECT);
+      /* De-selecting an edge may deselect a face too - validate. */
+      if (ts->uv_flag & UV_SYNC_SELECTION) {
+        if (select_value == false) {
+          BM_select_history_validate(em->bm);
+        }
+      }
 
-    if (selectmode == UV_SELECT_VERTEX) {
-      /* select vertex */
-      uvedit_uv_select_set_with_sticky(scene, em, hit.l, select, true, cd_loop_uv_offset);
-      flush = 1;
-    }
-    else if (selectmode == UV_SELECT_EDGE) {
-      /* select edge */
-      uvedit_edge_select_set_with_sticky(scene, em, hit.l, select, true, cd_loop_uv_offset);
-      flush = 1;
-    }
-    else if (selectmode == UV_SELECT_FACE) {
-      /* select face */
-      uvedit_face_select_set_with_sticky(scene, em, hit.efa, select, true, cd_loop_uv_offset);
-      flush = 1;
+      /* (de)select sticky UV nodes. */
+      if (sticky != SI_STICKY_DISABLE) {
+        flush = select_value ? 1 : -1;
+      }
+
+      changed = true;
     }
-  }
 
-  if (ts->uv_flag & UV_SYNC_SELECTION) {
-    if (flush != 0) {
-      EDBM_selectmode_flush(em);
+    if (ts->uv_flag & UV_SYNC_SELECTION) {
+      if (flush != 0) {
+        EDBM_selectmode_flush(em);
+      }
+    }
+    else {
+      /* Setting the selection implies a single element, which doesn't need to be flushed. */
+      if (params->sel_op != SEL_OP_SET) {
+        ED_uvedit_selectmode_flush(scene, em);
+      }
     }
-  }
-  /* #exte

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list