diff options
Diffstat (limited to 'source/blender/editors/space_clip/clip_dopesheet_ops.c')
-rw-r--r-- | source/blender/editors/space_clip/clip_dopesheet_ops.c | 242 |
1 files changed, 126 insertions, 116 deletions
diff --git a/source/blender/editors/space_clip/clip_dopesheet_ops.c b/source/blender/editors/space_clip/clip_dopesheet_ops.c index e2689706452..e7f0f8c3fcc 100644 --- a/source/blender/editors/space_clip/clip_dopesheet_ops.c +++ b/source/blender/editors/space_clip/clip_dopesheet_ops.c @@ -43,160 +43,170 @@ #include "UI_view2d.h" -#include "clip_intern.h" // own include +#include "clip_intern.h" // own include static bool space_clip_dopesheet_poll(bContext *C) { - if (ED_space_clip_tracking_poll(C)) { - SpaceClip *sc = CTX_wm_space_clip(C); + if (ED_space_clip_tracking_poll(C)) { + SpaceClip *sc = CTX_wm_space_clip(C); - if (sc->view == SC_VIEW_DOPESHEET) { - ARegion *ar = CTX_wm_region(C); + if (sc->view == SC_VIEW_DOPESHEET) { + ARegion *ar = CTX_wm_region(C); - return ar->regiontype == RGN_TYPE_PREVIEW; - } - } + return ar->regiontype == RGN_TYPE_PREVIEW; + } + } - return false; + return false; } /********************** select channel operator *********************/ static bool dopesheet_select_channel_poll(bContext *C) { - SpaceClip *sc = CTX_wm_space_clip(C); + SpaceClip *sc = CTX_wm_space_clip(C); - if (sc && sc->clip) - return sc->view == SC_VIEW_DOPESHEET; + if (sc && sc->clip) + return sc->view == SC_VIEW_DOPESHEET; - return false; + return false; } static int dopesheet_select_channel_exec(bContext *C, wmOperator *op) { - SpaceClip *sc = CTX_wm_space_clip(C); - MovieClip *clip = ED_space_clip_get_clip(sc); - MovieTracking *tracking = &clip->tracking; - MovieTrackingObject *object = BKE_tracking_object_get_active(tracking); - MovieTrackingDopesheet *dopesheet = &tracking->dopesheet; - MovieTrackingDopesheetChannel *channel; - ListBase *tracksbase = BKE_tracking_object_get_tracks(tracking, object); - float location[2]; - const bool extend = RNA_boolean_get(op->ptr, "extend"); - int current_channel_index = 0, channel_index; - const bool show_selected_only = (dopesheet->flag & TRACKING_DOPE_SELECTED_ONLY) != 0; - - RNA_float_get_array(op->ptr, "location", location); - channel_index = -(location[1] - (CHANNEL_FIRST + CHANNEL_HEIGHT_HALF)) / CHANNEL_STEP; - - for (channel = dopesheet->channels.first; channel; channel = channel->next) { - MovieTrackingTrack *track = channel->track; - - if (current_channel_index == channel_index) { - if (extend) - track->flag ^= TRACK_DOPE_SEL; - else - track->flag |= TRACK_DOPE_SEL; - - if (track->flag & TRACK_DOPE_SEL) { - tracking->act_track = track; - BKE_tracking_track_select(tracksbase, track, TRACK_AREA_ALL, true); - } - else if (show_selected_only == false) { - BKE_tracking_track_deselect(track, TRACK_AREA_ALL); - } - } - else if (!extend) - track->flag &= ~TRACK_DOPE_SEL; - - current_channel_index++; - } - - WM_event_add_notifier(C, NC_GEOM | ND_SELECT, NULL); - - return OPERATOR_FINISHED; + SpaceClip *sc = CTX_wm_space_clip(C); + MovieClip *clip = ED_space_clip_get_clip(sc); + MovieTracking *tracking = &clip->tracking; + MovieTrackingObject *object = BKE_tracking_object_get_active(tracking); + MovieTrackingDopesheet *dopesheet = &tracking->dopesheet; + MovieTrackingDopesheetChannel *channel; + ListBase *tracksbase = BKE_tracking_object_get_tracks(tracking, object); + float location[2]; + const bool extend = RNA_boolean_get(op->ptr, "extend"); + int current_channel_index = 0, channel_index; + const bool show_selected_only = (dopesheet->flag & TRACKING_DOPE_SELECTED_ONLY) != 0; + + RNA_float_get_array(op->ptr, "location", location); + channel_index = -(location[1] - (CHANNEL_FIRST + CHANNEL_HEIGHT_HALF)) / CHANNEL_STEP; + + for (channel = dopesheet->channels.first; channel; channel = channel->next) { + MovieTrackingTrack *track = channel->track; + + if (current_channel_index == channel_index) { + if (extend) + track->flag ^= TRACK_DOPE_SEL; + else + track->flag |= TRACK_DOPE_SEL; + + if (track->flag & TRACK_DOPE_SEL) { + tracking->act_track = track; + BKE_tracking_track_select(tracksbase, track, TRACK_AREA_ALL, true); + } + else if (show_selected_only == false) { + BKE_tracking_track_deselect(track, TRACK_AREA_ALL); + } + } + else if (!extend) + track->flag &= ~TRACK_DOPE_SEL; + + current_channel_index++; + } + + WM_event_add_notifier(C, NC_GEOM | ND_SELECT, NULL); + + return OPERATOR_FINISHED; } static int dopesheet_select_channel_invoke(bContext *C, wmOperator *op, const wmEvent *event) { - ARegion *ar = CTX_wm_region(C); - float location[2]; + ARegion *ar = CTX_wm_region(C); + float location[2]; - UI_view2d_region_to_view(&ar->v2d, event->mval[0], event->mval[1], &location[0], &location[1]); - RNA_float_set_array(op->ptr, "location", location); + UI_view2d_region_to_view(&ar->v2d, event->mval[0], event->mval[1], &location[0], &location[1]); + RNA_float_set_array(op->ptr, "location", location); - return dopesheet_select_channel_exec(C, op); + return dopesheet_select_channel_exec(C, op); } void CLIP_OT_dopesheet_select_channel(wmOperatorType *ot) { - /* identifiers */ - ot->name = "Select Channel"; - ot->description = "Select movie tracking channel"; - ot->idname = "CLIP_OT_dopesheet_select_channel"; - - /* api callbacks */ - ot->invoke = dopesheet_select_channel_invoke; - ot->exec = dopesheet_select_channel_exec; - ot->poll = dopesheet_select_channel_poll; - - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - - /* properties */ - RNA_def_float_vector(ot->srna, "location", 2, NULL, -FLT_MAX, FLT_MAX, - "Location", "Mouse location to select channel", -100.0f, 100.0f); - RNA_def_boolean(ot->srna, "extend", 0, - "Extend", "Extend selection rather than clearing the existing selection"); + /* identifiers */ + ot->name = "Select Channel"; + ot->description = "Select movie tracking channel"; + ot->idname = "CLIP_OT_dopesheet_select_channel"; + + /* api callbacks */ + ot->invoke = dopesheet_select_channel_invoke; + ot->exec = dopesheet_select_channel_exec; + ot->poll = dopesheet_select_channel_poll; + + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + + /* properties */ + RNA_def_float_vector(ot->srna, + "location", + 2, + NULL, + -FLT_MAX, + FLT_MAX, + "Location", + "Mouse location to select channel", + -100.0f, + 100.0f); + RNA_def_boolean(ot->srna, + "extend", + 0, + "Extend", + "Extend selection rather than clearing the existing selection"); } /********************** View All operator *********************/ static int dopesheet_view_all_exec(bContext *C, wmOperator *UNUSED(op)) { - SpaceClip *sc = CTX_wm_space_clip(C); - ARegion *ar = CTX_wm_region(C); - View2D *v2d = &ar->v2d; - MovieClip *clip = ED_space_clip_get_clip(sc); - MovieTracking *tracking = &clip->tracking; - MovieTrackingDopesheet *dopesheet = &tracking->dopesheet; - MovieTrackingDopesheetChannel *channel; - int frame_min = INT_MAX, frame_max = INT_MIN; - - for (channel = dopesheet->channels.first; channel; channel = channel->next) { - frame_min = min_ii(frame_min, channel->segments[0]); - frame_max = max_ii(frame_max, channel->segments[channel->tot_segment]); - } - - if (frame_min < frame_max) { - float extra; - - v2d->cur.xmin = frame_min; - v2d->cur.xmax = frame_max; - - /* we need an extra "buffer" factor on either side so that the endpoints are visible */ - extra = 0.01f * BLI_rctf_size_x(&v2d->cur); - v2d->cur.xmin -= extra; - v2d->cur.xmax += extra; - - ED_region_tag_redraw(ar); - } - - - return OPERATOR_FINISHED; + SpaceClip *sc = CTX_wm_space_clip(C); + ARegion *ar = CTX_wm_region(C); + View2D *v2d = &ar->v2d; + MovieClip *clip = ED_space_clip_get_clip(sc); + MovieTracking *tracking = &clip->tracking; + MovieTrackingDopesheet *dopesheet = &tracking->dopesheet; + MovieTrackingDopesheetChannel *channel; + int frame_min = INT_MAX, frame_max = INT_MIN; + + for (channel = dopesheet->channels.first; channel; channel = channel->next) { + frame_min = min_ii(frame_min, channel->segments[0]); + frame_max = max_ii(frame_max, channel->segments[channel->tot_segment]); + } + + if (frame_min < frame_max) { + float extra; + + v2d->cur.xmin = frame_min; + v2d->cur.xmax = frame_max; + + /* we need an extra "buffer" factor on either side so that the endpoints are visible */ + extra = 0.01f * BLI_rctf_size_x(&v2d->cur); + v2d->cur.xmin -= extra; + v2d->cur.xmax += extra; + + ED_region_tag_redraw(ar); + } + + return OPERATOR_FINISHED; } void CLIP_OT_dopesheet_view_all(wmOperatorType *ot) { - /* identifiers */ - ot->name = "View All"; - ot->description = "Reset viewable area to show full keyframe range"; - ot->idname = "CLIP_OT_dopesheet_view_all"; + /* identifiers */ + ot->name = "View All"; + ot->description = "Reset viewable area to show full keyframe range"; + ot->idname = "CLIP_OT_dopesheet_view_all"; - /* api callbacks */ - ot->exec = dopesheet_view_all_exec; - ot->poll = space_clip_dopesheet_poll; + /* api callbacks */ + ot->exec = dopesheet_view_all_exec; + ot->poll = space_clip_dopesheet_poll; - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } |