diff options
author | Campbell Barton <campbell@blender.org> | 2022-03-17 06:37:22 +0300 |
---|---|---|
committer | Campbell Barton <campbell@blender.org> | 2022-03-17 06:37:22 +0300 |
commit | 83fd242546c0eb058a7599585514bf17abac850c (patch) | |
tree | 57276532af259700c44a949326707b9e044daa75 /source/blender/editors | |
parent | 7bc6a04767e75dd89398913662df4727b32afdca (diff) |
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.
Diffstat (limited to 'source/blender/editors')
-rw-r--r-- | source/blender/editors/space_view3d/view3d_select.c | 54 |
1 files changed, 39 insertions, 15 deletions
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; |