[Bf-blender-cvs] [83fd242546c] master: Fix 3D view movie-clip track selection

Campbell Barton noreply at git.blender.org
Thu Mar 17 04:44:20 CET 2022


Commit: 83fd242546c0eb058a7599585514bf17abac850c
Author: Campbell Barton
Date:   Thu Mar 17 14:37:22 2022 +1100
Branches: master
https://developer.blender.org/rB83fd242546c0eb058a7599585514bf17abac850c

Fix 3D view movie-clip track selection

While basic single track selection worked,
toggling and de-selection has been broken since at least 2.83.

Support SelectPick_Params with the exception of deselect_all
which doesn't make sense for tracks as de-selecting all objects
is expected in that case.

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

M	source/blender/editors/space_view3d/view3d_select.c

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

diff --git a/source/blender/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c
index 728413316a1..b04abac1e33 100644
--- a/source/blender/editors/space_view3d/view3d_select.c
+++ b/source/blender/editors/space_view3d/view3d_select.c
@@ -2245,9 +2245,7 @@ static bool ed_object_select_pick_camera_track(bContext *C,
                                                const short hits,
                                                const struct SelectPick_Params *params)
 {
-  const bool extend = params->sel_op == SEL_OP_ADD;
   bool changed = false;
-
   bool found = false;
 
   MovieTracking *tracking = &clip->tracking;
@@ -2273,21 +2271,45 @@ static bool ed_object_select_pick_camera_track(bContext *C,
     break;
   }
 
-  if (found) {
-    if (TRACK_SELECTED(track) && extend) {
-      changed = false;
-      BKE_tracking_track_deselect(track, TRACK_AREA_ALL);
+  /* Note `params->deselect_all` is ignored for tracks as in this case
+   * all objects will be de-selected (not tracks). */
+  if (params->sel_op == SEL_OP_SET) {
+    if ((found && params->select_passthrough) && TRACK_SELECTED(track)) {
+      found = false;
     }
-    else {
-      int oldsel = TRACK_SELECTED(track) ? 1 : 0;
-      if (!extend) {
-        deselect_all_tracks(tracking);
-      }
-
-      BKE_tracking_track_select(tracksbase, track, TRACK_AREA_ALL, extend);
+    else if (found /* `|| params->deselect_all` */) {
+      /* Deselect everything. */
+      deselect_all_tracks(tracking);
+      changed = true;
+    }
+  }
 
-      if (oldsel != (TRACK_SELECTED(track) ? 1 : 0)) {
-        changed = true;
+  if (found) {
+    switch (params->sel_op) {
+      case SEL_OP_ADD: {
+        BKE_tracking_track_select(tracksbase, track, TRACK_AREA_ALL, true);
+        break;
+      }
+      case SEL_OP_SUB: {
+        BKE_tracking_track_deselect(track, TRACK_AREA_ALL);
+        break;
+      }
+      case SEL_OP_XOR: {
+        if (TRACK_SELECTED(track)) {
+          BKE_tracking_track_deselect(track, TRACK_AREA_ALL);
+        }
+        else {
+          BKE_tracking_track_select(tracksbase, track, TRACK_AREA_ALL, true);
+        }
+        break;
+      }
+      case SEL_OP_SET: {
+        BKE_tracking_track_select(tracksbase, track, TRACK_AREA_ALL, false);
+        break;
+      }
+      case SEL_OP_AND: {
+        BLI_assert_unreachable(); /* Doesn't make sense for picking. */
+        break;
       }
     }
 
@@ -2295,6 +2317,8 @@ static bool ed_object_select_pick_camera_track(bContext *C,
     DEG_id_tag_update(&clip->id, ID_RECALC_SELECT);
     WM_event_add_notifier(C, NC_MOVIECLIP | ND_SELECT, track);
     WM_event_add_notifier(C, NC_SCENE | ND_OB_SELECT, scene);
+
+    changed = true;
   }
 
   return changed || found;



More information about the Bf-blender-cvs mailing list