1
0
Fork 0
mirror of https://github.com/Orama-Interactive/Pixelorama.git synced 2025-01-18 17:19:50 +00:00

Move some code away from Global and Project to AnimationTimeline

This commit is contained in:
Emmanouil Papadeas 2023-12-05 01:46:42 +02:00
parent d60c686368
commit 80e351a2a1
5 changed files with 61 additions and 65 deletions

View file

@ -489,16 +489,6 @@ var cel_button_scene: PackedScene = load("res://src/UI/Timeline/CelButton.tscn")
@onready var cel_vbox: VBoxContainer = animation_timeline.find_child("CelVBox") @onready var cel_vbox: VBoxContainer = animation_timeline.find_child("CelVBox")
## The container of animation tags. ## The container of animation tags.
@onready var tag_container: Control = animation_timeline.find_child("TagContainer") @onready var tag_container: Control = animation_timeline.find_child("TagContainer")
## Play forward button.
@onready var play_forward: BaseButton = animation_timeline.find_child("PlayForward")
## Play backward button.
@onready var play_backwards: BaseButton = animation_timeline.find_child("PlayBackwards")
## Remove frame button.
@onready var remove_frame_button: BaseButton = animation_timeline.find_child("DeleteFrame")
## Move frame left button.
@onready var move_left_frame_button: BaseButton = animation_timeline.find_child("MoveLeft")
## Move frame right button.
@onready var move_right_frame_button: BaseButton = animation_timeline.find_child("MoveRight")
## Remove layer button. ## Remove layer button.
@onready var remove_layer_button: BaseButton = animation_timeline.find_child("RemoveLayer") @onready var remove_layer_button: BaseButton = animation_timeline.find_child("RemoveLayer")
## Move layer up button. ## Move layer up button.
@ -507,8 +497,6 @@ var cel_button_scene: PackedScene = load("res://src/UI/Timeline/CelButton.tscn")
@onready var move_down_layer_button: BaseButton = animation_timeline.find_child("MoveDownLayer") @onready var move_down_layer_button: BaseButton = animation_timeline.find_child("MoveDownLayer")
## Merge with layer below button. ## Merge with layer below button.
@onready var merge_down_layer_button: BaseButton = animation_timeline.find_child("MergeDownLayer") @onready var merge_down_layer_button: BaseButton = animation_timeline.find_child("MergeDownLayer")
## Layer opacity slider.
@onready var layer_opacity_slider: ValueSlider = animation_timeline.find_child("OpacitySlider")
## The brushes popup dialog used to display brushes. ## The brushes popup dialog used to display brushes.
## It has the [param BrushesPopup.gd] script attached. ## It has the [param BrushesPopup.gd] script attached.

View file

@ -178,12 +178,6 @@ func change_project() -> void:
Global.animation_timeline.project_changed() Global.animation_timeline.project_changed()
Global.current_frame_mark_label.text = "%s/%s" % [str(current_frame + 1), frames.size()] Global.current_frame_mark_label.text = "%s/%s" % [str(current_frame + 1), frames.size()]
Global.disable_button(Global.remove_frame_button, frames.size() == 1)
Global.disable_button(Global.move_left_frame_button, frames.size() == 1 or current_frame == 0)
Global.disable_button(
Global.move_right_frame_button, frames.size() == 1 or current_frame == frames.size() - 1
)
toggle_layer_buttons() toggle_layer_buttons()
animation_tags = animation_tags animation_tags = animation_tags
@ -519,20 +513,11 @@ func change_cel(new_frame: int, new_layer := -1) -> void:
if new_frame != current_frame: # If the frame has changed if new_frame != current_frame: # If the frame has changed
current_frame = new_frame current_frame = new_frame
Global.current_frame_mark_label.text = "%s/%s" % [str(current_frame + 1), frames.size()] Global.current_frame_mark_label.text = "%s/%s" % [str(current_frame + 1), frames.size()]
toggle_frame_buttons()
if new_layer != current_layer: # If the layer has changed if new_layer != current_layer: # If the layer has changed
current_layer = new_layer current_layer = new_layer
toggle_layer_buttons() toggle_layer_buttons()
if current_frame < frames.size(): # Set opacity slider
var cel_opacity := frames[current_frame].cels[current_layer].opacity
Global.layer_opacity_slider.value = cel_opacity * 100
var blend_mode_index: int = Global.animation_timeline.blend_modes_button.get_item_index(
layers[current_layer].blend_mode
)
Global.animation_timeline.blend_modes_button.selected = blend_mode_index
Global.transparent_checker.update_rect() Global.transparent_checker.update_rect()
Global.cel_changed.emit() Global.cel_changed.emit()
if get_current_cel() is Cel3D: if get_current_cel() is Cel3D:
@ -542,14 +527,6 @@ func change_cel(new_frame: int, new_layer := -1) -> void:
Global.canvas.queue_redraw() Global.canvas.queue_redraw()
func toggle_frame_buttons() -> void:
Global.disable_button(Global.remove_frame_button, frames.size() == 1)
Global.disable_button(Global.move_left_frame_button, frames.size() == 1 or current_frame == 0)
Global.disable_button(
Global.move_right_frame_button, frames.size() == 1 or current_frame == frames.size() - 1
)
func toggle_layer_buttons() -> void: func toggle_layer_buttons() -> void:
if layers.is_empty() or current_layer >= layers.size(): if layers.is_empty() or current_layer >= layers.size():
return return

View file

@ -26,7 +26,6 @@ func _ready() -> void:
Global.current_project.layers.append(PixelLayer.new(Global.current_project)) Global.current_project.layers.append(PixelLayer.new(Global.current_project))
Global.current_project.frames.append(Global.current_project.new_empty_frame()) Global.current_project.frames.append(Global.current_project.new_empty_frame())
Global.animation_timeline.project_changed() Global.animation_timeline.project_changed()
Global.current_project.toggle_frame_buttons()
Import.import_brushes(Global.path_join_array(Global.data_directories, "Brushes")) Import.import_brushes(Global.path_join_array(Global.data_directories, "Brushes"))
Import.import_patterns(Global.path_join_array(Global.data_directories, "Patterns")) Import.import_patterns(Global.path_join_array(Global.data_directories, "Patterns"))

View file

@ -19,12 +19,18 @@ var future_above_canvas := true
@onready var tag_spacer := %TagSpacer as Control @onready var tag_spacer := %TagSpacer as Control
@onready var layer_settings_container := %LayerSettingsContainer as VBoxContainer @onready var layer_settings_container := %LayerSettingsContainer as VBoxContainer
@onready var layer_container := %LayerContainer as VBoxContainer @onready var layer_container := %LayerContainer as VBoxContainer
@onready var add_layer_list := $"%AddLayerList" as MenuButton @onready var add_layer_list := %AddLayerList as MenuButton
@onready var blend_modes_button := %BlendModes as OptionButton @onready var blend_modes_button := %BlendModes as OptionButton
@onready var opacity_slider: ValueSlider = %OpacitySlider
@onready var frame_scroll_container := %FrameScrollContainer as Control @onready var frame_scroll_container := %FrameScrollContainer as Control
@onready var frame_scroll_bar := %FrameScrollBar as HScrollBar @onready var frame_scroll_bar := %FrameScrollBar as HScrollBar
@onready var tag_scroll_container := %TagScroll as ScrollContainer @onready var tag_scroll_container := %TagScroll as ScrollContainer
@onready var layer_frame_h_split := %LayerFrameHSplit as HSplitContainer @onready var layer_frame_h_split := %LayerFrameHSplit as HSplitContainer
@onready var delete_frame: Button = %DeleteFrame
@onready var move_frame_left: Button = %MoveFrameLeft
@onready var move_frame_right: Button = %MoveFrameRight
@onready var play_backwards := %PlayBackwards as Button
@onready var play_forward := %PlayForward as Button
@onready var fps_spinbox := %FPSValue as ValueSlider @onready var fps_spinbox := %FPSValue as ValueSlider
@onready var onion_skinning_button := %OnionSkinning as BaseButton @onready var onion_skinning_button := %OnionSkinning as BaseButton
@onready var onion_skinning_settings := $OnionSkinningSettings as Popup @onready var onion_skinning_settings := $OnionSkinningSettings as Popup
@ -93,6 +99,7 @@ func _ready() -> void:
# emit signals that were supposed to be emitted (Check if it's still required in godot 4) # emit signals that were supposed to be emitted (Check if it's still required in godot 4)
%PastPlacement.item_selected.emit(0 if past_above else 1) %PastPlacement.item_selected.emit(0 if past_above else 1)
%FuturePlacement.item_selected.emit(0 if future_above else 1) %FuturePlacement.item_selected.emit(0 if future_above else 1)
Global.cel_changed.connect(_cel_changed)
# Makes sure that the frame and tag scroll bars are in the right place: # Makes sure that the frame and tag scroll bars are in the right place:
Global.layer_vbox.emit_signal.call_deferred("resized") Global.layer_vbox.emit_signal.call_deferred("resized")
@ -510,25 +517,25 @@ func _on_LoopAnim_pressed() -> void:
func _on_PlayForward_toggled(button_pressed: bool) -> void: func _on_PlayForward_toggled(button_pressed: bool) -> void:
if button_pressed: if button_pressed:
Global.change_button_texturerect(Global.play_forward.get_child(0), "pause.png") Global.change_button_texturerect(play_forward.get_child(0), "pause.png")
else: else:
Global.change_button_texturerect(Global.play_forward.get_child(0), "play.png") Global.change_button_texturerect(play_forward.get_child(0), "play.png")
play_animation(button_pressed, true) play_animation(button_pressed, true)
func _on_PlayBackwards_toggled(button_pressed: bool) -> void: func _on_PlayBackwards_toggled(button_pressed: bool) -> void:
if button_pressed: if button_pressed:
Global.change_button_texturerect(Global.play_backwards.get_child(0), "pause.png") Global.change_button_texturerect(play_backwards.get_child(0), "pause.png")
else: else:
Global.change_button_texturerect(Global.play_backwards.get_child(0), "play_backwards.png") Global.change_button_texturerect(play_backwards.get_child(0), "play_backwards.png")
play_animation(button_pressed, false) play_animation(button_pressed, false)
# Called on each frame of the animation ## Called on each frame of the animation
func _on_AnimationTimer_timeout() -> void: func _on_AnimationTimer_timeout() -> void:
if first_frame == last_frame: if first_frame == last_frame:
Global.play_forward.button_pressed = false play_forward.button_pressed = false
Global.play_backwards.button_pressed = false play_backwards.button_pressed = false
Global.animation_timer.stop() Global.animation_timer.stop()
return return
@ -546,8 +553,8 @@ func _on_AnimationTimer_timeout() -> void:
else: else:
match animation_loop: match animation_loop:
0: # No loop 0: # No loop
Global.play_forward.button_pressed = false play_forward.button_pressed = false
Global.play_backwards.button_pressed = false play_backwards.button_pressed = false
Global.animation_timer.stop() Global.animation_timer.stop()
is_animation_running = false is_animation_running = false
1: # Cycle loop 1: # Cycle loop
@ -572,8 +579,8 @@ func _on_AnimationTimer_timeout() -> void:
else: else:
match animation_loop: match animation_loop:
0: # No loop 0: # No loop
Global.play_backwards.button_pressed = false play_backwards.button_pressed = false
Global.play_forward.button_pressed = false play_forward.button_pressed = false
Global.animation_timer.stop() Global.animation_timer.stop()
is_animation_running = false is_animation_running = false
1: # Cycle loop 1: # Cycle loop
@ -605,21 +612,21 @@ func play_animation(play: bool, forward_dir: bool) -> void:
if first_frame == last_frame: if first_frame == last_frame:
if forward_dir: if forward_dir:
Global.play_forward.button_pressed = false play_forward.button_pressed = false
else: else:
Global.play_backwards.button_pressed = false play_backwards.button_pressed = false
return return
if forward_dir: if forward_dir:
Global.play_backwards.toggled.disconnect(_on_PlayBackwards_toggled) play_backwards.toggled.disconnect(_on_PlayBackwards_toggled)
Global.play_backwards.button_pressed = false play_backwards.button_pressed = false
Global.change_button_texturerect(Global.play_backwards.get_child(0), "play_backwards.png") Global.change_button_texturerect(play_backwards.get_child(0), "play_backwards.png")
Global.play_backwards.toggled.connect(_on_PlayBackwards_toggled) play_backwards.toggled.connect(_on_PlayBackwards_toggled)
else: else:
Global.play_forward.toggled.disconnect(_on_PlayForward_toggled) play_forward.toggled.disconnect(_on_PlayForward_toggled)
Global.play_forward.button_pressed = false play_forward.button_pressed = false
Global.change_button_texturerect(Global.play_forward.get_child(0), "play.png") Global.change_button_texturerect(play_forward.get_child(0), "play.png")
Global.play_forward.toggled.connect(_on_PlayForward_toggled) play_forward.toggled.connect(_on_PlayForward_toggled)
if play: if play:
Global.animation_timer.set_one_shot(true) # wait_time can't change correctly if it's playing Global.animation_timer.set_one_shot(true) # wait_time can't change correctly if it's playing
@ -984,8 +991,27 @@ func _on_onion_skinning_settings_visibility_changed() -> void:
# Methods to update the UI in response to changes in the current project # Methods to update the UI in response to changes in the current project
func _cel_changed() -> void:
_toggle_frame_buttons()
var project := Global.current_project
var cel_opacity := project.get_current_cel().opacity
opacity_slider.value = cel_opacity * 100
var blend_mode_index := blend_modes_button.get_item_index(
project.layers[project.current_layer].blend_mode
)
blend_modes_button.selected = blend_mode_index
func _toggle_frame_buttons() -> void:
var project := Global.current_project
Global.disable_button(delete_frame, project.frames.size() == 1)
Global.disable_button(move_frame_left, project.current_frame == 0)
Global.disable_button(move_frame_right, project.current_frame == project.frames.size() - 1)
func project_changed() -> void: func project_changed() -> void:
var project := Global.current_project var project := Global.current_project
_toggle_frame_buttons()
# These must be removed from tree immediately to not mess up the indices of # These must be removed from tree immediately to not mess up the indices of
# the new buttons, so use either free or queue_free + parent.remove_child # the new buttons, so use either free or queue_free + parent.remove_child
for layer_button in Global.layer_vbox.get_children(): for layer_button in Global.layer_vbox.get_children():
@ -1029,7 +1055,7 @@ func project_frame_added(frame: int) -> void:
Global.frame_hbox.move_child(button, frame) Global.frame_hbox.move_child(button, frame)
# Make it visible, yes 3 call_deferreds are required # Make it visible, yes 3 call_deferreds are required
frame_scroll_container.call_deferred( frame_scroll_container.call_deferred(
"call_deferred", "call_deferred", "ensure_control_visible", button &"call_deferred", &"call_deferred", &"ensure_control_visible", button
) )
var layer := Global.cel_vbox.get_child_count() - 1 var layer := Global.cel_vbox.get_child_count() - 1
for cel_hbox in Global.cel_vbox.get_children(): for cel_hbox in Global.cel_vbox.get_children():

View file

@ -442,6 +442,7 @@ offset_bottom = 6.0
texture = ExtResource("19") texture = ExtResource("19")
[node name="DeleteFrame" type="Button" parent="TimelineContainer/TimelineButtons/VBoxContainer/AnimationToolsScrollContainer/AnimationTools/AnimationButtons/FrameButtons" groups=["UIButtons"]] [node name="DeleteFrame" type="Button" parent="TimelineContainer/TimelineButtons/VBoxContainer/AnimationToolsScrollContainer/AnimationTools/AnimationButtons/FrameButtons" groups=["UIButtons"]]
unique_name_in_owner = true
custom_minimum_size = Vector2(24, 24) custom_minimum_size = Vector2(24, 24)
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 0 size_flags_horizontal = 0
@ -506,7 +507,8 @@ offset_right = 7.0
offset_bottom = 7.0 offset_bottom = 7.0
texture = ExtResource("28") texture = ExtResource("28")
[node name="MoveLeft" type="Button" parent="TimelineContainer/TimelineButtons/VBoxContainer/AnimationToolsScrollContainer/AnimationTools/AnimationButtons/FrameButtons" groups=["UIButtons"]] [node name="MoveFrameLeft" type="Button" parent="TimelineContainer/TimelineButtons/VBoxContainer/AnimationToolsScrollContainer/AnimationTools/AnimationButtons/FrameButtons" groups=["UIButtons"]]
unique_name_in_owner = true
custom_minimum_size = Vector2(24, 24) custom_minimum_size = Vector2(24, 24)
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 0 size_flags_horizontal = 0
@ -515,7 +517,7 @@ focus_mode = 0
mouse_default_cursor_shape = 2 mouse_default_cursor_shape = 2
shortcut = SubResource("Shortcut_kwn1u") shortcut = SubResource("Shortcut_kwn1u")
[node name="TextureRect" type="TextureRect" parent="TimelineContainer/TimelineButtons/VBoxContainer/AnimationToolsScrollContainer/AnimationTools/AnimationButtons/FrameButtons/MoveLeft"] [node name="TextureRect" type="TextureRect" parent="TimelineContainer/TimelineButtons/VBoxContainer/AnimationToolsScrollContainer/AnimationTools/AnimationButtons/FrameButtons/MoveFrameLeft"]
layout_mode = 0 layout_mode = 0
anchor_left = 0.5 anchor_left = 0.5
anchor_top = 0.5 anchor_top = 0.5
@ -528,7 +530,8 @@ offset_bottom = 5.5
texture = ExtResource("8") texture = ExtResource("8")
flip_h = true flip_h = true
[node name="MoveRight" type="Button" parent="TimelineContainer/TimelineButtons/VBoxContainer/AnimationToolsScrollContainer/AnimationTools/AnimationButtons/FrameButtons" groups=["UIButtons"]] [node name="MoveFrameRight" type="Button" parent="TimelineContainer/TimelineButtons/VBoxContainer/AnimationToolsScrollContainer/AnimationTools/AnimationButtons/FrameButtons" groups=["UIButtons"]]
unique_name_in_owner = true
custom_minimum_size = Vector2(24, 24) custom_minimum_size = Vector2(24, 24)
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 0 size_flags_horizontal = 0
@ -537,7 +540,7 @@ focus_mode = 0
mouse_default_cursor_shape = 2 mouse_default_cursor_shape = 2
shortcut = SubResource("Shortcut_m2mvi") shortcut = SubResource("Shortcut_m2mvi")
[node name="TextureRect" type="TextureRect" parent="TimelineContainer/TimelineButtons/VBoxContainer/AnimationToolsScrollContainer/AnimationTools/AnimationButtons/FrameButtons/MoveRight"] [node name="TextureRect" type="TextureRect" parent="TimelineContainer/TimelineButtons/VBoxContainer/AnimationToolsScrollContainer/AnimationTools/AnimationButtons/FrameButtons/MoveFrameRight"]
layout_mode = 0 layout_mode = 0
anchor_left = 0.5 anchor_left = 0.5
anchor_top = 0.5 anchor_top = 0.5
@ -593,6 +596,7 @@ offset_bottom = 6.0
texture = ExtResource("23") texture = ExtResource("23")
[node name="PlayBackwards" type="Button" parent="TimelineContainer/TimelineButtons/VBoxContainer/AnimationToolsScrollContainer/AnimationTools/AnimationButtons/PlaybackButtons" groups=["UIButtons"]] [node name="PlayBackwards" type="Button" parent="TimelineContainer/TimelineButtons/VBoxContainer/AnimationToolsScrollContainer/AnimationTools/AnimationButtons/PlaybackButtons" groups=["UIButtons"]]
unique_name_in_owner = true
custom_minimum_size = Vector2(24, 24) custom_minimum_size = Vector2(24, 24)
layout_mode = 2 layout_mode = 2
tooltip_text = "Play the animation backwards (from end to beginning)" tooltip_text = "Play the animation backwards (from end to beginning)"
@ -614,6 +618,7 @@ offset_bottom = 6.0
texture = ExtResource("24") texture = ExtResource("24")
[node name="PlayForward" type="Button" parent="TimelineContainer/TimelineButtons/VBoxContainer/AnimationToolsScrollContainer/AnimationTools/AnimationButtons/PlaybackButtons" groups=["UIButtons"]] [node name="PlayForward" type="Button" parent="TimelineContainer/TimelineButtons/VBoxContainer/AnimationToolsScrollContainer/AnimationTools/AnimationButtons/PlaybackButtons" groups=["UIButtons"]]
unique_name_in_owner = true
custom_minimum_size = Vector2(24, 24) custom_minimum_size = Vector2(24, 24)
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 0 size_flags_horizontal = 0
@ -806,6 +811,7 @@ unique_name_in_owner = true
layout_mode = 2 layout_mode = 2
[node name="OpacitySlider" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/LayerFrameHSplit/LayerContainer" instance=ExtResource("9")] [node name="OpacitySlider" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/LayerFrameHSplit/LayerContainer" instance=ExtResource("9")]
unique_name_in_owner = true
custom_minimum_size = Vector2(207, 30) custom_minimum_size = Vector2(207, 30)
layout_mode = 2 layout_mode = 2
size_flags_vertical = 0 size_flags_vertical = 0
@ -952,8 +958,8 @@ script = ExtResource("12")
[connection signal="pressed" from="TimelineContainer/TimelineButtons/VBoxContainer/AnimationToolsScrollContainer/AnimationTools/AnimationButtons/FrameButtons/DeleteFrame" to="." method="_on_DeleteFrame_pressed"] [connection signal="pressed" from="TimelineContainer/TimelineButtons/VBoxContainer/AnimationToolsScrollContainer/AnimationTools/AnimationButtons/FrameButtons/DeleteFrame" to="." method="_on_DeleteFrame_pressed"]
[connection signal="pressed" from="TimelineContainer/TimelineButtons/VBoxContainer/AnimationToolsScrollContainer/AnimationTools/AnimationButtons/FrameButtons/CopyFrame" to="." method="_on_CopyFrame_pressed"] [connection signal="pressed" from="TimelineContainer/TimelineButtons/VBoxContainer/AnimationToolsScrollContainer/AnimationTools/AnimationButtons/FrameButtons/CopyFrame" to="." method="_on_CopyFrame_pressed"]
[connection signal="pressed" from="TimelineContainer/TimelineButtons/VBoxContainer/AnimationToolsScrollContainer/AnimationTools/AnimationButtons/FrameButtons/FrameTagButton" to="." method="_on_FrameTagButton_pressed"] [connection signal="pressed" from="TimelineContainer/TimelineButtons/VBoxContainer/AnimationToolsScrollContainer/AnimationTools/AnimationButtons/FrameButtons/FrameTagButton" to="." method="_on_FrameTagButton_pressed"]
[connection signal="pressed" from="TimelineContainer/TimelineButtons/VBoxContainer/AnimationToolsScrollContainer/AnimationTools/AnimationButtons/FrameButtons/MoveLeft" to="." method="_on_MoveLeft_pressed"] [connection signal="pressed" from="TimelineContainer/TimelineButtons/VBoxContainer/AnimationToolsScrollContainer/AnimationTools/AnimationButtons/FrameButtons/MoveFrameLeft" to="." method="_on_MoveLeft_pressed"]
[connection signal="pressed" from="TimelineContainer/TimelineButtons/VBoxContainer/AnimationToolsScrollContainer/AnimationTools/AnimationButtons/FrameButtons/MoveRight" to="." method="_on_MoveRight_pressed"] [connection signal="pressed" from="TimelineContainer/TimelineButtons/VBoxContainer/AnimationToolsScrollContainer/AnimationTools/AnimationButtons/FrameButtons/MoveFrameRight" to="." method="_on_MoveRight_pressed"]
[connection signal="pressed" from="TimelineContainer/TimelineButtons/VBoxContainer/AnimationToolsScrollContainer/AnimationTools/AnimationButtons/PlaybackButtons/FirstFrame" to="." method="_on_FirstFrame_pressed"] [connection signal="pressed" from="TimelineContainer/TimelineButtons/VBoxContainer/AnimationToolsScrollContainer/AnimationTools/AnimationButtons/PlaybackButtons/FirstFrame" to="." method="_on_FirstFrame_pressed"]
[connection signal="pressed" from="TimelineContainer/TimelineButtons/VBoxContainer/AnimationToolsScrollContainer/AnimationTools/AnimationButtons/PlaybackButtons/PreviousFrame" to="." method="_on_PreviousFrame_pressed"] [connection signal="pressed" from="TimelineContainer/TimelineButtons/VBoxContainer/AnimationToolsScrollContainer/AnimationTools/AnimationButtons/PlaybackButtons/PreviousFrame" to="." method="_on_PreviousFrame_pressed"]
[connection signal="toggled" from="TimelineContainer/TimelineButtons/VBoxContainer/AnimationToolsScrollContainer/AnimationTools/AnimationButtons/PlaybackButtons/PlayBackwards" to="." method="_on_PlayBackwards_toggled"] [connection signal="toggled" from="TimelineContainer/TimelineButtons/VBoxContainer/AnimationToolsScrollContainer/AnimationTools/AnimationButtons/PlaybackButtons/PlayBackwards" to="." method="_on_PlayBackwards_toggled"]