1 # SPDX-License-Identifier: GPL-3.0-or-later
2 # Copyright (C) 2016-2020 by Nathan Lovato, Daniel Oakey, Razvan Radulescu, and contributors
4 from bpy
.app
.handlers
import persistent
8 def power_sequencer_playback_speed_post(scene
):
10 Handler function for faster playback
11 Skips keyframes after a frame change based on the playback_speed value
12 It steps over frame rather than increase the playback speed smoothly,
13 but it's still useful for faster editing
16 # Calling this function triggers a callback to this function via the frame
17 # changed handler, causing a stack overflow. We use a property to prevent
19 if bpy
.context
.screen
and not bpy
.context
.screen
.is_animation_playing
:
22 playback_speed
= scene
.power_sequencer
.playback_speed
24 target_frame
= scene
.frame_current
25 if playback_speed
== "DOUBLE":
27 elif playback_speed
== "TRIPLE":
30 if target_frame
!= scene
.frame_current
:
31 bpy
.ops
.screen
.frame_offset(delta
=target_frame
- scene
.frame_current
)
34 def draw_playback_speed(self
, context
):
37 layout
.prop(scene
.power_sequencer
, "playback_speed")
40 def draw_ui_menu(self
, context
):
42 layout
.menu("POWER_SEQUENCER_MT_main")
45 def register_handlers():
47 bpy
.types
.SEQUENCER_HT_header
.append(draw_ui_menu
)
48 bpy
.types
.SEQUENCER_HT_header
.append(draw_playback_speed
)
51 bpy
.app
.handlers
.frame_change_post
.append(power_sequencer_playback_speed_post
)
54 def unregister_handlers():
56 bpy
.types
.SEQUENCER_HT_header
.remove(draw_ui_menu
)
57 bpy
.types
.SEQUENCER_HT_header
.remove(draw_playback_speed
)
60 bpy
.app
.handlers
.frame_change_post
.remove(power_sequencer_playback_speed_post
)