Animation play: Follow feature. Enabled from playback menu in the
authorAntony Riakiotakis <kalast@gmail.com>
Thu, 5 Feb 2015 21:14:38 +0000 (22:14 +0100)
committerAntony Riakiotakis <kalast@gmail.com>
Thu, 5 Feb 2015 21:14:38 +0000 (22:14 +0100)
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
source/blender/editors/screen/screen_ops.c
source/blender/makesdna/DNA_space_types.h
source/blender/makesrna/intern/rna_screen.c

index d23ee84d9d2dff0a80b2f435b30007c8dcf419a9..27fcf94666ad6e1ef2e95c6305b541e87d007086 100644 (file)
@@ -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")
index 6b75d21163a98ae08390181bc16eeb4acdb44519..ad3d2d1a21abeea372340142f9d9738853cb20b4 100644 (file)
@@ -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;
+                                                               }
+                                                       }
+                                               }
                                        }
                                }
                                
index d32fb58f6db22164545877674be7a81b34f9e4cc..577e7025a4444ab04a760808718c4c05e5e28342 100644 (file)
@@ -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 */
index 7b01acff6a5c03216bd70889d80854548e852fa7..86d20e6e23956b777b11319594b27d0a01149489 100644 (file)
@@ -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", "");