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.
This commit is contained in:
Campbell Barton 2022-03-17 14:37:22 +11:00
parent 7bc6a04767
commit 83fd242546
1 changed files with 39 additions and 15 deletions

View File

@ -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);
else if (found /* `|| params->deselect_all` */) {
/* Deselect everything. */
deselect_all_tracks(tracking);
changed = true;
}
}
if (found) {
switch (params->sel_op) {
case SEL_OP_ADD: {
BKE_tracking_track_select(tracksbase, track, TRACK_AREA_ALL, true);
break;
}
BKE_tracking_track_select(tracksbase, track, TRACK_AREA_ALL, extend);
if (oldsel != (TRACK_SELECTED(track) ? 1 : 0)) {
changed = true;
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;