diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2013-03-05 16:41:17 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2013-03-05 16:41:17 +0400 |
commit | a31c0bcc648820d78f1265c116bece378c841561 (patch) | |
tree | df31afc8ec4ff796b1a346c659d7b2a58670ac07 /source/blender/editors/space_clip/clip_dopesheet_ops.c | |
parent | dab6f8f5593876ac1c1f9d445c35401ed840b574 (diff) |
View All operator for motion tracking dopesheet.
Diffstat (limited to 'source/blender/editors/space_clip/clip_dopesheet_ops.c')
-rw-r--r-- | source/blender/editors/space_clip/clip_dopesheet_ops.c | 59 |
1 files changed, 54 insertions, 5 deletions
diff --git a/source/blender/editors/space_clip/clip_dopesheet_ops.c b/source/blender/editors/space_clip/clip_dopesheet_ops.c index 09f6271b6ef..d914cd2e04f 100644 --- a/source/blender/editors/space_clip/clip_dopesheet_ops.c +++ b/source/blender/editors/space_clip/clip_dopesheet_ops.c @@ -59,12 +59,11 @@ #include "clip_intern.h" // own include -#if 0 -static int ED_space_clip_dopesheet_poll(bContext *C) +static int space_clip_dopesheet_poll(bContext *C) { - SpaceClip *sc = CTX_wm_space_clip(C); + if (ED_space_clip_tracking_poll(C)) { + SpaceClip *sc = CTX_wm_space_clip(C); - if (sc && sc->clip) { if (sc->view == SC_VIEW_DOPESHEET) { ARegion *ar = CTX_wm_region(C); @@ -74,7 +73,6 @@ static int ED_space_clip_dopesheet_poll(bContext *C) return FALSE; } -#endif /********************** select channel operator *********************/ @@ -161,3 +159,54 @@ void CLIP_OT_dopesheet_select_channel(wmOperatorType *ot) 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; +} + +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"; + + /* api callbacks */ + ot->exec = dopesheet_view_all_exec; + ot->poll = space_clip_dopesheet_poll; + + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; +} |