Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <campbell@blender.org>2022-03-17 06:37:22 +0300
committerCampbell Barton <campbell@blender.org>2022-03-17 06:37:22 +0300
commit83fd242546c0eb058a7599585514bf17abac850c (patch)
tree57276532af259700c44a949326707b9e044daa75 /source/blender/editors
parent7bc6a04767e75dd89398913662df4727b32afdca (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.c54
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;