From ced4c5fe2260489f44a38498c3adfd3333215a26 Mon Sep 17 00:00:00 2001 From: Antony Riakiotakis Date: Thu, 5 Feb 2015 22:14:38 +0100 Subject: [PATCH] Animation play: Follow feature. Enabled from playback menu in the timeline. When enabled, ipo, dopesheet, NLA, timeline, clip and sequence editors will follow the current frame during animation. When the cursor reaches the end of the screen, then the next range of frames of the same width is displayed. --- release/scripts/startup/bl_ui/space_time.py | 2 ++ source/blender/editors/screen/screen_ops.c | 20 +++++++++++++++++++- source/blender/makesdna/DNA_space_types.h | 2 ++ source/blender/makesrna/intern/rna_screen.c | 5 +++++ 4 files changed, 28 insertions(+), 1 deletion(-) diff --git a/release/scripts/startup/bl_ui/space_time.py b/release/scripts/startup/bl_ui/space_time.py index d23ee84d9d2..27fcf94666a 100644 --- a/release/scripts/startup/bl_ui/space_time.py +++ b/release/scripts/startup/bl_ui/space_time.py @@ -206,6 +206,8 @@ class TIME_MT_playback(Menu): layout.prop(screen, "use_play_node_editors") layout.prop(screen, "use_play_clip_editors") + layout.separator() + layout.prop(screen, "use_follow") layout.separator() layout.prop(scene, "use_frame_drop", text="Frame Dropping") diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index 6b75d21163a..ad3d2d1a21a 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -3469,11 +3469,29 @@ static int screen_animation_step(bContext *C, wmOperator *UNUSED(op), const wmEv for (sa = window->screen->areabase.first; sa; sa = sa->next) { ARegion *ar; for (ar = sa->regionbase.first; ar; ar = ar->next) { + bool redraw = false; if (ar == sad->ar) { - ED_region_tag_redraw(ar); + redraw = true; } else if (match_region_with_redraws(sa->spacetype, ar->regiontype, sad->redraws)) { + redraw = true; + } + + if (redraw) { ED_region_tag_redraw(ar); + /* do follow here if editor type supports it */ + if ((sad->redraws & TIME_FOLLOW)) { + if ((ar->regiontype == RGN_TYPE_WINDOW && + ELEM (sa->spacetype, SPACE_SEQ, SPACE_TIME, SPACE_IPO, SPACE_ACTION, SPACE_NLA)) || + (sa->spacetype == SPACE_CLIP && ar->regiontype == RGN_TYPE_PREVIEW)) + { + float w = BLI_rctf_size_x(&ar->v2d.cur); + if (scene->r.cfra < ar->v2d.cur.xmin || scene->r.cfra > (ar->v2d.cur.xmax)) { + ar->v2d.cur.xmin = scene->r.cfra; + ar->v2d.cur.xmax = ar->v2d.cur.xmin + w; + } + } + } } } diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h index d32fb58f6db..577e7025a44 100644 --- a/source/blender/makesdna/DNA_space_types.h +++ b/source/blender/makesdna/DNA_space_types.h @@ -462,6 +462,8 @@ typedef enum eScreen_Redraws_Flag { // TIME_CONTINUE_PHYSICS = (1 << 7), /* UNUSED */ TIME_NODES = (1 << 8), TIME_CLIPS = (1 << 9), + + TIME_FOLLOW = (1 << 15), } eScreen_Redraws_Flag; /* time->cache */ diff --git a/source/blender/makesrna/intern/rna_screen.c b/source/blender/makesrna/intern/rna_screen.c index 7b01acff6a5..86d20e6e239 100644 --- a/source/blender/makesrna/intern/rna_screen.c +++ b/source/blender/makesrna/intern/rna_screen.c @@ -413,6 +413,11 @@ static void rna_def_screen(BlenderRNA *brna) RNA_def_property_ui_text(prop, "All 3D View Editors", ""); RNA_def_property_update(prop, NC_SPACE | ND_SPACE_TIME, "rna_Screen_redraw_update"); + prop = RNA_def_property(srna, "use_follow", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "redraws_flag", TIME_FOLLOW); + RNA_def_property_ui_text(prop, "Follow", "Follow current frame in editors that update"); + RNA_def_property_update(prop, NC_SPACE | ND_SPACE_TIME, "rna_Screen_redraw_update"); + prop = RNA_def_property(srna, "use_play_animation_editors", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "redraws_flag", TIME_ALL_ANIM_WIN); RNA_def_property_ui_text(prop, "Animation Editors", ""); -- 2.28.0