Project Pampa request: option to lock frame selection to the range
authorSergey Sharybin <sergey.vfx@gmail.com>
Sun, 13 Oct 2013 20:46:02 +0000 (20:46 +0000)
committerSergey Sharybin <sergey.vfx@gmail.com>
Sun, 13 Oct 2013 20:46:02 +0000 (20:46 +0000)
This means when you've got "Lock Frame Selection" option (which is
in the timeline next to the preview range button) you're not able
to go to the frames which are out of current frame range with your
mouse.

TODO: Make it so current frame slider also respects this setting?
      Not so much important for tonight.

release/scripts/startup/bl_ui/space_time.py
source/blender/editors/animation/anim_ops.c
source/blender/makesdna/DNA_scene_types.h
source/blender/makesrna/intern/rna_scene.c

index de8be9dff9984709d3db7f064a37b716c853d76d..fb78194d1a49ad96d452b287e09339883254c689 100644 (file)
@@ -40,7 +40,9 @@ class TIME_HT_header(Header):
             row.menu("TIME_MT_frame")
             row.menu("TIME_MT_playback")
 
-        layout.prop(scene, "use_preview_range", text="", toggle=True)
+        row = layout.row(align=True)
+        row.prop(scene, "use_preview_range", text="", toggle=True)
+        row.prop(scene, "lock_frame_selection_to_range", text="", toggle=True)
 
         row = layout.row(align=True)
         if not scene.use_preview_range:
index 15a75c5775853e512f3dc755d757cda9efd7cb34..af9b58736ef82f2dba4e52da58f0db08c6b3cd81 100644 (file)
@@ -118,13 +118,21 @@ static int change_frame_exec(bContext *C, wmOperator *op)
 static int frame_from_event(bContext *C, const wmEvent *event)
 {
        ARegion *region = CTX_wm_region(C);
+       Scene *scene = CTX_data_scene(C);
        float viewx;
+       int frame;
 
        /* convert from region coordinates to View2D 'tot' space */
        UI_view2d_region_to_view(&region->v2d, event->mval[0], event->mval[1], &viewx, NULL);
        
        /* round result to nearest int (frames are ints!) */
-       return (int)floor(viewx + 0.5f);
+       frame = (int)floor(viewx + 0.5f);
+
+       if (scene->r.flag & SCER_LOCK_FRAME_SELECTION) {
+               CLAMP(frame, PSFRA, PEFRA);
+       }
+
+       return frame;
 }
 
 /* Modal Operator init */
index 232fe62df31c86e3bd77895300576504bca9c3a8..6ebc604bc7e1525c3f7acb7e49856978bed3b1aa 100644 (file)
@@ -1212,6 +1212,7 @@ typedef struct Scene {
 /* flag */
        /* use preview range */
 #define SCER_PRV_RANGE (1<<0)
+#define SCER_LOCK_FRAME_SELECTION      (1<<1)
 
 /* mode (int now) */
 #define R_OSA                  0x0001
index 4d35acc84a062adad58d3705ffb751eb02d50dff..b37c13262053358ab8c2b004e6aeb0443a80f15c 100644 (file)
@@ -5220,6 +5220,14 @@ void RNA_def_scene(BlenderRNA *brna)
        RNA_def_property_ui_text(prop, "Current Frame Final",
                                 "Current frame with subframe and time remapping applied");
 
+       prop = RNA_def_property(srna, "lock_frame_selection_to_range", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+       RNA_def_property_boolean_sdna(prop, NULL, "r.flag", SCER_LOCK_FRAME_SELECTION);
+       RNA_def_property_ui_text(prop, "Lock Frame Selection",
+                                "Don't allow frame to be selected with mouse outside of frame range");
+       RNA_def_property_update(prop, NC_SCENE | ND_FRAME, NULL);
+       RNA_def_property_ui_icon(prop, ICON_LOCKED, 0);
+
        /* Preview Range (frame-range for UI playback) */
        prop = RNA_def_property(srna, "use_preview_range", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);