diff options
author | Campbell Barton <ideasman42@gmail.com> | 2019-03-05 10:33:09 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2019-03-05 10:39:02 +0300 |
commit | b8ef725497e45648ac7214927294e3ab60b71bc2 (patch) | |
tree | 27ec6c9d7739ad55ff607dc53a82a8d6d33dc82a /source/blender/editors/space_clip/clip_editor.c | |
parent | e83854e759f61ed82c9c0ceedadf55c9a670245a (diff) |
Cemara tracking: move select all into a utility function
Diffstat (limited to 'source/blender/editors/space_clip/clip_editor.c')
-rw-r--r-- | source/blender/editors/space_clip/clip_editor.c | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/source/blender/editors/space_clip/clip_editor.c b/source/blender/editors/space_clip/clip_editor.c index 6d4fd927d76..79a159bac2e 100644 --- a/source/blender/editors/space_clip/clip_editor.c +++ b/source/blender/editors/space_clip/clip_editor.c @@ -58,6 +58,7 @@ #include "ED_screen.h" #include "ED_clip.h" #include "ED_mask.h" +#include "ED_select_utils.h" #include "WM_api.h" #include "WM_types.h" @@ -429,6 +430,99 @@ bool ED_clip_view_selection(const bContext *C, ARegion *ar, bool fit) return true; } +void ED_clip_select_all(SpaceClip *sc, int action, bool *r_has_selection) +{ + MovieClip *clip = ED_space_clip_get_clip(sc); + const int framenr = ED_space_clip_get_clip_frame_number(sc); + MovieTracking *tracking = &clip->tracking; + MovieTrackingTrack *track = NULL; /* selected track */ + MovieTrackingPlaneTrack *plane_track = NULL; /* selected plane track */ + MovieTrackingMarker *marker; + ListBase *tracksbase = BKE_tracking_get_active_tracks(tracking); + ListBase *plane_tracks_base = BKE_tracking_get_active_plane_tracks(tracking); + bool has_selection = false; + + if (action == SEL_TOGGLE) { + action = SEL_SELECT; + + for (track = tracksbase->first; track; track = track->next) { + if (TRACK_VIEW_SELECTED(sc, track)) { + marker = BKE_tracking_marker_get(track, framenr); + + if (MARKER_VISIBLE(sc, track, marker)) { + action = SEL_DESELECT; + break; + } + } + } + + for (plane_track = plane_tracks_base->first; + plane_track; + plane_track = plane_track->next) + { + if (PLANE_TRACK_VIEW_SELECTED(plane_track)) { + action = SEL_DESELECT; + break; + } + } + } + + for (track = tracksbase->first; track; track = track->next) { + if ((track->flag & TRACK_HIDDEN) == 0) { + marker = BKE_tracking_marker_get(track, framenr); + + if (MARKER_VISIBLE(sc, track, marker)) { + switch (action) { + case SEL_SELECT: + track->flag |= SELECT; + track->pat_flag |= SELECT; + track->search_flag |= SELECT; + break; + case SEL_DESELECT: + track->flag &= ~SELECT; + track->pat_flag &= ~SELECT; + track->search_flag &= ~SELECT; + break; + case SEL_INVERT: + track->flag ^= SELECT; + track->pat_flag ^= SELECT; + track->search_flag ^= SELECT; + break; + } + } + } + + if (TRACK_VIEW_SELECTED(sc, track)) + has_selection = true; + } + + for (plane_track = plane_tracks_base->first; + plane_track; + plane_track = plane_track->next) + { + if ((plane_track->flag & PLANE_TRACK_HIDDEN) == 0) { + switch (action) { + case SEL_SELECT: + plane_track->flag |= SELECT; + break; + case SEL_DESELECT: + plane_track->flag &= ~SELECT; + break; + case SEL_INVERT: + plane_track->flag ^= SELECT; + break; + } + if (plane_track->flag & SELECT) { + has_selection = true; + } + } + } + + if (r_has_selection) { + *r_has_selection = has_selection; + } +} + void ED_clip_point_undistorted_pos(SpaceClip *sc, const float co[2], float r_co[2]) { copy_v2_v2(r_co, co); |