Started removing animation related things, I don't think it's needed for an in-engine editor, as you can trivially create animated sprites to test.

This commit is contained in:
Relintai 2020-11-29 21:38:42 +01:00
parent 7cb04b92ac
commit 798af880d8
7 changed files with 20 additions and 1003 deletions

View File

@ -75,13 +75,6 @@ var tile_mode := false
var draw_grid := false
var show_rulers := true
var show_guides := true
var show_animation_timeline := true
# Onion skinning options
var onion_skinning := false
var onion_skinning_past_rate := 1.0
var onion_skinning_future_rate := 1.0
var onion_skinning_blue_red := false
# Palettes
var palettes := {}
@ -127,13 +120,8 @@ var patterns_popup : Popup
var animation_timeline : Panel
var animation_timer : Timer
var frame_ids : HBoxContainer
var current_frame_mark_label : Label
var onion_skinning_button : BaseButton
var loop_animation_button : BaseButton
var play_forward : BaseButton
var play_backwards : BaseButton
var layers_container : VBoxContainer
var frames_container : VBoxContainer
var tag_container : Control
@ -243,13 +231,8 @@ func refresh_nodes():
layers_container = find_node_by_name(animation_timeline, "LayersContainer")
frames_container = find_node_by_name(animation_timeline, "FramesContainer")
animation_timer = find_node_by_name(animation_timeline, "AnimationTimer")
frame_ids = find_node_by_name(animation_timeline, "FrameIDs")
current_frame_mark_label = find_node_by_name(control, "CurrentFrameMark")
onion_skinning_button = find_node_by_name(animation_timeline, "OnionSkinning")
loop_animation_button = find_node_by_name(animation_timeline, "LoopAnim")
play_forward = find_node_by_name(animation_timeline, "PlayForward")
play_backwards = find_node_by_name(animation_timeline, "PlayBackwards")
tag_container = find_node_by_name(animation_timeline, "TagContainer")
tag_dialog = find_node_by_name(animation_timeline, "FrameTagDialog")
@ -338,13 +321,6 @@ func undo(_frame_index := -1, _layer_index := -1, project : Project = current_pr
canvas.grid.update()
cursor_position_label.text = "[%s×%s]" % [project.size.x, project.size.y]
elif "Frame" in action_name:
# This actually means that frames.size is one, but it hasn't been updated yet
if project.frames.size() == 2: # Stop animating
play_forward.pressed = false
play_backwards.pressed = false
animation_timer.stop()
canvas.update()
if !project.has_changed:
project.has_changed = true
@ -369,11 +345,6 @@ func redo(_frame_index := -1, _layer_index := -1, project : Project = current_pr
canvas.grid.update()
cursor_position_label.text = "[%s×%s]" % [project.size.x, project.size.y]
elif "Frame" in action_name:
if project.frames.size() == 1: # Stop animating
play_forward.pressed = false
play_backwards.pressed = false
animation_timer.stop()
canvas.update()
if !project.has_changed:
@ -494,34 +465,6 @@ Hold %s to make a line""") % ["", "", "Shift"]
(%s)""") % ""
#InputMap.get_action_list("switch_colors")[0].as_text()
var first_frame : BaseButton = find_node_by_name(self, "FirstFrame")
first_frame.hint_tooltip = tr("""Jump to the first frame
(%s)""") % ""
#InputMap.get_action_list("go_to_first_frame")[0].as_text()
var previous_frame : BaseButton = find_node_by_name(self, "PreviousFrame")
previous_frame.hint_tooltip = tr("""Go to the previous frame
(%s)""") % ""
#InputMap.get_action_list("go_to_previous_frame")[0].as_text()
play_backwards.hint_tooltip = tr("""Play the animation backwards (from end to beginning)
(%s)""") % ""
#InputMap.get_action_list("play_backwards")[0].as_text()
play_forward.hint_tooltip = tr("""Play the animation forward (from beginning to end)
(%s)""") % ""
#InputMap.get_action_list("play_forward")[0].as_text()
var next_frame : BaseButton = find_node_by_name(self, "NextFrame")
next_frame.hint_tooltip = tr("""Go to the next frame
(%s)""") % ""
#InputMap.get_action_list("go_to_next_frame")[0].as_text()
var last_frame : BaseButton = find_node_by_name(self, "LastFrame")
last_frame.hint_tooltip = tr("""Jump to the last frame
(%s)""") % ""
#InputMap.get_action_list("go_to_last_frame")[0].as_text()
func _exit_tree() -> void:
config_cache.set_value("window", "screen", OS.current_screen)

View File

@ -443,10 +443,6 @@ func frame_changed(value : int) -> void:
if layers and current_frame < layers[current_layer].frame_container.get_child_count():
layers[current_layer].frame_container.get_child(current_frame).pressed = true
DrawGD.disable_button(DrawGD.remove_frame_button, frames.size() == 1)
DrawGD.disable_button(DrawGD.move_left_frame_button, frames.size() == 1 or current_frame == 0)
DrawGD.disable_button(DrawGD.move_right_frame_button, frames.size() == 1 or current_frame == frames.size() - 1)
DrawGD.canvas.update()
DrawGD.transparent_checker._ready() # To update the rect size

View File

@ -160,9 +160,9 @@ func commit_undo(action : String) -> void:
var project : Project = DrawGD.current_project
var frame := -1
var layer := -1
if DrawGD.animation_timer.is_stopped():
frame = project.current_frame
layer = project.current_layer
frame = project.current_frame
layer = project.current_layer
project.undos += 1
project.undo_redo.create_action(action)
@ -511,8 +511,9 @@ func _get_undo_data() -> Dictionary:
var data = {}
var project : Project = DrawGD.current_project
var frames := project.frames
if DrawGD.animation_timer.is_stopped():
frames = [project.frames[project.current_frame]]
frames = [project.frames[project.current_frame]]
for frame in frames:
var image : Image = frame.cels[project.current_layer].image
image.unlock()

View File

@ -37,8 +37,6 @@ func _draw() -> void:
DrawGD.small_preview_viewport.get_child(0).get_node("CanvasPreview").update()
var current_cels : Array = DrawGD.current_project.frames[DrawGD.current_project.current_frame].cels
if DrawGD.onion_skinning:
onion_skinning()
# Draw current frame layers
for i in range(DrawGD.current_project.layers.size()):

View File

@ -20,10 +20,7 @@ func _draw() -> void:
if frame >= current_project.frames.size():
frame = current_project.current_frame
$AnimationTimer.wait_time = DrawGD.animation_timer.wait_time
if animation_timer.is_stopped():
frame = current_project.current_frame
var current_cels : Array = current_project.frames[frame].cels
# Draw current frame layers

View File

@ -23,7 +23,6 @@ func _ready() -> void:
timeline_scroll = DrawGD.find_node_by_name(self, "TimelineScroll")
tag_scroll_container = DrawGD.find_node_by_name(self, "TagScroll")
timeline_scroll.get_h_scrollbar().connect("value_changed", self, "_h_scroll_changed")
DrawGD.animation_timer.wait_time = 1 / fps
func _h_scroll_changed(value : float) -> void:
@ -32,321 +31,9 @@ func _h_scroll_changed(value : float) -> void:
tag_scroll_container.scroll_horizontal = value
func add_frame() -> void:
var frame : Frame = DrawGD.canvas.new_empty_frame()
var new_frames : Array = DrawGD.current_project.frames.duplicate()
new_frames.append(frame)
var new_layers : Array = DrawGD.current_project.layers.duplicate()
# Loop through the array to create new classes for each element, so that they
# won't be the same as the original array's classes. Needed for undo/redo to work properly.
for i in new_layers.size():
var new_linked_cels = new_layers[i].linked_cels.duplicate()
new_layers[i] = Layer.new(new_layers[i].name, new_layers[i].visible, new_layers[i].locked, new_layers[i].frame_container, new_layers[i].new_cels_linked, new_linked_cels)
for l_i in range(new_layers.size()):
if new_layers[l_i].new_cels_linked: # If the link button is pressed
new_layers[l_i].linked_cels.append(frame)
frame.cels[l_i].image = new_layers[l_i].linked_cels[0].cels[l_i].image
frame.cels[l_i].image_texture = new_layers[l_i].linked_cels[0].cels[l_i].image_texture
DrawGD.current_project.undos += 1
DrawGD.current_project.undo_redo.create_action("Add Frame")
DrawGD.current_project.undo_redo.add_do_method(DrawGD, "redo")
DrawGD.current_project.undo_redo.add_undo_method(DrawGD, "undo")
DrawGD.current_project.undo_redo.add_do_property(DrawGD.current_project, "frames", new_frames)
DrawGD.current_project.undo_redo.add_do_property(DrawGD.current_project, "current_frame", new_frames.size() - 1)
DrawGD.current_project.undo_redo.add_do_property(DrawGD.current_project, "layers", new_layers)
DrawGD.current_project.undo_redo.add_undo_property(DrawGD.current_project, "frames", DrawGD.current_project.frames)
DrawGD.current_project.undo_redo.add_undo_property(DrawGD.current_project, "current_frame", DrawGD.current_project.current_frame)
DrawGD.current_project.undo_redo.add_undo_property(DrawGD.current_project, "layers", DrawGD.current_project.layers)
DrawGD.current_project.undo_redo.commit_action()
func _on_DeleteFrame_pressed(frame := -1) -> void:
if DrawGD.current_project.frames.size() == 1:
return
if frame == -1:
frame = DrawGD.current_project.current_frame
var frame_to_delete : Frame = DrawGD.current_project.frames[frame]
var new_frames : Array = DrawGD.current_project.frames.duplicate()
new_frames.erase(frame_to_delete)
var DrawGD : Node = null
var current_frame = DrawGD.current_project.current_frame
if current_frame > 0 && current_frame == new_frames.size(): # If it's the last frame
current_frame -= 1
var new_animation_tags = DrawGD.current_project.animation_tags.duplicate()
# Loop through the tags to create new classes for them, so that they won't be the same
# as DrawGD.current_project.animation_tags's classes. Needed for undo/redo to work properly.
for i in new_animation_tags.size():
new_animation_tags[i] = AnimationTag.new(new_animation_tags[i].name, new_animation_tags[i].color, new_animation_tags[i].from, new_animation_tags[i].to)
# Loop through the tags to see if the frame is in one
for tag in new_animation_tags:
if frame + 1 >= tag.from && frame + 1 <= tag.to:
if tag.from == tag.to: # If we're deleting the only frame in the tag
new_animation_tags.erase(tag)
else:
tag.to -= 1
elif frame + 1 < tag.from:
tag.from -= 1
tag.to -= 1
# Check if one of the cels of the frame is linked
# if they are, unlink them too
# this prevents removed cels being kept in linked memory
var new_layers : Array = DrawGD.current_project.layers.duplicate()
# Loop through the array to create new classes for each element, so that they
# won't be the same as the original array's classes. Needed for undo/redo to work properly.
for i in new_layers.size():
var new_linked_cels = new_layers[i].linked_cels.duplicate()
new_layers[i] = Layer.new(new_layers[i].name, new_layers[i].visible, new_layers[i].locked, new_layers[i].frame_container, new_layers[i].new_cels_linked, new_linked_cels)
for layer in new_layers:
for linked in layer.linked_cels:
if linked == DrawGD.current_project.frames[frame]:
layer.linked_cels.erase(linked)
DrawGD.current_project.undos += 1
DrawGD.current_project.undo_redo.create_action("Remove Frame")
DrawGD.current_project.undo_redo.add_do_property(DrawGD.current_project, "frames", new_frames)
DrawGD.current_project.undo_redo.add_do_property(DrawGD.current_project, "current_frame", current_frame)
DrawGD.current_project.undo_redo.add_do_property(DrawGD.current_project, "animation_tags", new_animation_tags)
DrawGD.current_project.undo_redo.add_do_property(DrawGD.current_project, "layers", new_layers)
DrawGD.current_project.undo_redo.add_undo_property(DrawGD.current_project, "frames", DrawGD.current_project.frames)
DrawGD.current_project.undo_redo.add_undo_property(DrawGD.current_project, "current_frame", DrawGD.current_project.current_frame)
DrawGD.current_project.undo_redo.add_undo_property(DrawGD.current_project, "animation_tags", DrawGD.current_project.animation_tags)
DrawGD.current_project.undo_redo.add_undo_property(DrawGD.current_project, "layers", DrawGD.current_project.layers)
DrawGD.current_project.undo_redo.add_do_method(DrawGD, "redo")
DrawGD.current_project.undo_redo.add_undo_method(DrawGD, "undo")
DrawGD.current_project.undo_redo.commit_action()
func _on_CopyFrame_pressed(frame := -1) -> void:
if frame == -1:
frame = DrawGD.current_project.current_frame
var new_frame := Frame.new()
var new_frames = DrawGD.current_project.frames.duplicate()
new_frames.insert(frame + 1, new_frame)
for cel in DrawGD.current_project.frames[frame].cels: # Copy every cel
var sprite := Image.new()
sprite.copy_from(cel.image)
sprite.lock()
new_frame.cels.append(Cel.new(sprite, cel.opacity))
var new_animation_tags = DrawGD.current_project.animation_tags.duplicate()
# Loop through the tags to create new classes for them, so that they won't be the same
# as DrawGD.current_project.animation_tags's classes. Needed for undo/redo to work properly.
for i in new_animation_tags.size():
new_animation_tags[i] = AnimationTag.new(new_animation_tags[i].name, new_animation_tags[i].color, new_animation_tags[i].from, new_animation_tags[i].to)
# Loop through the tags to see if the frame is in one
for tag in new_animation_tags:
if frame + 1 >= tag.from && frame + 1 <= tag.to:
tag.to += 1
DrawGD.current_project.undos += 1
DrawGD.current_project.undo_redo.create_action("Add Frame")
DrawGD.current_project.undo_redo.add_do_method(DrawGD, "redo")
DrawGD.current_project.undo_redo.add_undo_method(DrawGD, "undo")
DrawGD.current_project.undo_redo.add_do_property(DrawGD.current_project, "frames", new_frames)
DrawGD.current_project.undo_redo.add_do_property(DrawGD.current_project, "current_frame", frame + 1)
DrawGD.current_project.undo_redo.add_do_property(DrawGD.current_project, "animation_tags", new_animation_tags)
for i in range(DrawGD.current_project.layers.size()):
for child in DrawGD.current_project.layers[i].frame_container.get_children():
DrawGD.current_project.undo_redo.add_do_property(child, "pressed", false)
DrawGD.current_project.undo_redo.add_undo_property(child, "pressed", child.pressed)
DrawGD.current_project.undo_redo.add_undo_property(DrawGD.current_project, "frames", DrawGD.current_project.frames)
DrawGD.current_project.undo_redo.add_undo_property(DrawGD.current_project, "current_frame", frame)
DrawGD.current_project.undo_redo.add_undo_property(DrawGD.current_project, "animation_tags", DrawGD.current_project.animation_tags)
DrawGD.current_project.undo_redo.commit_action()
func _on_FrameTagButton_pressed() -> void:
DrawGD.tag_dialog.popup_centered()
func _on_MoveLeft_pressed() -> void:
var frame : int = DrawGD.current_project.current_frame
if frame == 0:
return
DrawGD.current_project.layers[DrawGD.current_project.current_layer].frame_container.get_child(frame).change_frame_order(-1)
func _on_MoveRight_pressed() -> void:
var frame : int = DrawGD.current_project.current_frame
if frame == last_frame:
return
DrawGD.current_project.layers[DrawGD.current_project.current_layer].frame_container.get_child(frame).change_frame_order(1)
func _on_OnionSkinning_pressed() -> void:
DrawGD.onion_skinning = !DrawGD.onion_skinning
DrawGD.canvas.update()
var texture_button : TextureRect = DrawGD.onion_skinning_button.get_child(0)
if DrawGD.onion_skinning:
DrawGD.change_button_texturerect(texture_button, "onion_skinning.png")
else:
DrawGD.change_button_texturerect(texture_button, "onion_skinning_off.png")
func _on_OnionSkinningSettings_pressed() -> void:
$OnionSkinningSettings.popup(Rect2(DrawGD.onion_skinning_button.rect_global_position.x - $OnionSkinningSettings.rect_size.x - 16, DrawGD.onion_skinning_button.rect_global_position.y - 106, 136, 126))
func _on_LoopAnim_pressed() -> void:
var texture_button : TextureRect = DrawGD.loop_animation_button.get_child(0)
match animation_loop:
0: # Make it loop
animation_loop = 1
DrawGD.change_button_texturerect(texture_button, "loop.png")
DrawGD.loop_animation_button.hint_tooltip = "Cycle loop"
1: # Make it ping-pong
animation_loop = 2
DrawGD.change_button_texturerect(texture_button, "loop_pingpong.png")
DrawGD.loop_animation_button.hint_tooltip = "Ping-pong loop"
2: # Make it stop
animation_loop = 0
DrawGD.change_button_texturerect(texture_button, "loop_none.png")
DrawGD.loop_animation_button.hint_tooltip = "No loop"
func _on_PlayForward_toggled(button_pressed : bool) -> void:
if button_pressed:
DrawGD.change_button_texturerect(DrawGD.play_forward.get_child(0), "pause.png")
else:
DrawGD.change_button_texturerect(DrawGD.play_forward.get_child(0), "play.png")
play_animation(button_pressed, true)
func _on_PlayBackwards_toggled(button_pressed : bool) -> void:
if button_pressed:
DrawGD.change_button_texturerect(DrawGD.play_backwards.get_child(0), "pause.png")
else:
DrawGD.change_button_texturerect(DrawGD.play_backwards.get_child(0), "play_backwards.png")
play_animation(button_pressed, false)
func _on_AnimationTimer_timeout() -> void:
if first_frame == last_frame:
$AnimationTimer.stop()
return
if animation_forward:
if DrawGD.current_project.current_frame < last_frame:
DrawGD.current_project.current_frame += 1
else:
match animation_loop:
0: # No loop
DrawGD.play_forward.pressed = false
DrawGD.play_backwards.pressed = false
DrawGD.animation_timer.stop()
1: # Cycle loop
DrawGD.current_project.current_frame = first_frame
2: # Ping pong loop
animation_forward = false
_on_AnimationTimer_timeout()
else:
if DrawGD.current_project.current_frame > first_frame:
DrawGD.current_project.current_frame -= 1
else:
match animation_loop:
0: # No loop
DrawGD.play_backwards.pressed = false
DrawGD.play_forward.pressed = false
DrawGD.animation_timer.stop()
1: # Cycle loop
DrawGD.current_project.current_frame = last_frame
2: # Ping pong loop
animation_forward = true
_on_AnimationTimer_timeout()
func play_animation(play : bool, forward_dir : bool) -> void:
first_frame = 0
last_frame = DrawGD.current_project.frames.size() - 1
if DrawGD.play_only_tags:
for tag in DrawGD.current_project.animation_tags:
if DrawGD.current_project.current_frame + 1 >= tag.from && DrawGD.current_project.current_frame + 1 <= tag.to:
first_frame = tag.from - 1
last_frame = min(DrawGD.current_project.frames.size() - 1, tag.to - 1)
if first_frame == last_frame:
if forward_dir:
DrawGD.play_forward.pressed = false
else:
DrawGD.play_backwards.pressed = false
return
if forward_dir:
DrawGD.play_backwards.disconnect("toggled", self, "_on_PlayBackwards_toggled")
DrawGD.play_backwards.pressed = false
DrawGD.change_button_texturerect(DrawGD.play_backwards.get_child(0), "play_backwards.png")
DrawGD.play_backwards.connect("toggled", self, "_on_PlayBackwards_toggled")
else:
DrawGD.play_forward.disconnect("toggled", self, "_on_PlayForward_toggled")
DrawGD.play_forward.pressed = false
DrawGD.change_button_texturerect(DrawGD.play_forward.get_child(0), "play.png")
DrawGD.play_forward.connect("toggled", self, "_on_PlayForward_toggled")
if play:
DrawGD.animation_timer.wait_time = 1 / fps
DrawGD.animation_timer.start()
animation_forward = forward_dir
else:
DrawGD.animation_timer.stop()
func _on_NextFrame_pressed() -> void:
if DrawGD.current_project.current_frame < DrawGD.current_project.frames.size() - 1:
DrawGD.current_project.current_frame += 1
func _on_PreviousFrame_pressed() -> void:
if DrawGD.current_project.current_frame > 0:
DrawGD.current_project.current_frame -= 1
func _on_LastFrame_pressed() -> void:
DrawGD.current_project.current_frame = DrawGD.current_project.frames.size() - 1
func _on_FirstFrame_pressed() -> void:
DrawGD.current_project.current_frame = 0
func _on_FPSValue_value_changed(value : float) -> void:
fps = float(value)
DrawGD.animation_timer.wait_time = 1 / fps
func _on_PastOnionSkinning_value_changed(value : float) -> void:
DrawGD.onion_skinning_past_rate = int(value)
DrawGD.canvas.update()
func _on_FutureOnionSkinning_value_changed(value : float) -> void:
DrawGD.onion_skinning_future_rate = int(value)
DrawGD.canvas.update()
func _on_BlueRedMode_toggled(button_pressed : bool) -> void:
DrawGD.onion_skinning_blue_red = button_pressed
DrawGD.canvas.update()
# Layer buttons
func add_layer(is_new := true) -> void:

View File

@ -1,4 +1,4 @@
[gd_scene load_steps=44 format=2]
[gd_scene load_steps=18 format=2]
[ext_resource path="res://addons/draw_gd/src/UI/Timeline/AnimationTimeline.gd" type="Script" id=1]
[ext_resource path="res://addons/draw_gd/assets/graphics/dark_themes/layers/new_layer.png" type="Texture" id=2]
@ -7,21 +7,7 @@
[ext_resource path="res://addons/draw_gd/assets/graphics/dark_themes/layers/move_down_disabled.png" type="Texture" id=5]
[ext_resource path="res://addons/draw_gd/assets/graphics/dark_themes/layers/merge_down_disabled.png" type="Texture" id=6]
[ext_resource path="res://addons/draw_gd/assets/graphics/dark_themes/layers/clone_layer.png" type="Texture" id=7]
[ext_resource path="res://addons/draw_gd/assets/graphics/dark_themes/timeline/move_arrow.png" type="Texture" id=8]
[ext_resource path="res://addons/draw_gd/src/UI/Timeline/LayerButton.tscn" type="PackedScene" id=18]
[ext_resource path="res://addons/draw_gd/assets/graphics/dark_themes/timeline/new_frame.png" type="Texture" id=19]
[ext_resource path="res://addons/draw_gd/assets/graphics/dark_themes/timeline/remove_frame.png" type="Texture" id=20]
[ext_resource path="res://addons/draw_gd/assets/graphics/dark_themes/timeline/go_to_first_frame.png" type="Texture" id=21]
[ext_resource path="res://addons/draw_gd/assets/graphics/dark_themes/timeline/play.png" type="Texture" id=22]
[ext_resource path="res://addons/draw_gd/assets/graphics/dark_themes/timeline/previous_frame.png" type="Texture" id=23]
[ext_resource path="res://addons/draw_gd/assets/graphics/dark_themes/timeline/play_backwards.png" type="Texture" id=24]
[ext_resource path="res://addons/draw_gd/assets/graphics/dark_themes/timeline/go_to_last_frame.png" type="Texture" id=25]
[ext_resource path="res://addons/draw_gd/assets/graphics/dark_themes/timeline/next_frame.png" type="Texture" id=26]
[ext_resource path="res://addons/draw_gd/assets/graphics/dark_themes/timeline/copy_frame.png" type="Texture" id=27]
[ext_resource path="res://addons/draw_gd/assets/graphics/dark_themes/timeline/tag.png" type="Texture" id=28]
[ext_resource path="res://addons/draw_gd/assets/graphics/dark_themes/timeline/onion_skinning_off.png" type="Texture" id=29]
[ext_resource path="res://addons/draw_gd/assets/graphics/dark_themes/timeline/expandable.png" type="Texture" id=30]
[ext_resource path="res://addons/draw_gd/assets/graphics/dark_themes/timeline/loop.png" type="Texture" id=31]
[ext_resource path="res://addons/draw_gd/src/UI/Timeline/FrameTagDialog.tscn" type="PackedScene" id=42]
[sub_resource type="StyleBoxFlat" id=1]
@ -40,70 +26,26 @@ corner_radius_bottom_right = 5
corner_radius_bottom_left = 5
expand_margin_bottom = 32.0
[sub_resource type="InputEventKey" id=3]
control = true
command = true
scancode = 16777229
[sub_resource type="StyleBoxEmpty" id=3]
[sub_resource type="ShortCut" id=4]
shortcut = SubResource( 3 )
[sub_resource type="StyleBoxEmpty" id=4]
[sub_resource type="InputEventKey" id=5]
control = true
command = true
scancode = 16777231
[sub_resource type="StyleBoxEmpty" id=5]
[sub_resource type="ShortCut" id=6]
shortcut = SubResource( 5 )
[sub_resource type="StyleBoxEmpty" id=6]
[sub_resource type="InputEventKey" id=7]
scancode = 16777247
[sub_resource type="StyleBoxEmpty" id=7]
[sub_resource type="ShortCut" id=8]
shortcut = SubResource( 7 )
[sub_resource type="InputEventKey" id=9]
scancode = 16777248
[sub_resource type="ShortCut" id=10]
shortcut = SubResource( 9 )
[sub_resource type="InputEventKey" id=11]
control = true
command = true
scancode = 16777233
[sub_resource type="ShortCut" id=12]
shortcut = SubResource( 11 )
[sub_resource type="InputEventKey" id=13]
control = true
command = true
scancode = 16777230
[sub_resource type="ShortCut" id=14]
shortcut = SubResource( 13 )
[sub_resource type="StyleBoxEmpty" id=15]
[sub_resource type="StyleBoxEmpty" id=16]
[sub_resource type="StyleBoxEmpty" id=17]
[sub_resource type="StyleBoxEmpty" id=18]
[sub_resource type="StyleBoxEmpty" id=19]
[sub_resource type="Theme" id=20]
[sub_resource type="Theme" id=8]
HScrollBar/icons/decrement = null
HScrollBar/icons/decrement_highlight = null
HScrollBar/icons/increment = null
HScrollBar/icons/increment_highlight = null
HScrollBar/styles/grabber = SubResource( 15 )
HScrollBar/styles/grabber_highlight = SubResource( 16 )
HScrollBar/styles/grabber_pressed = SubResource( 17 )
HScrollBar/styles/scroll = SubResource( 18 )
HScrollBar/styles/scroll_focus = SubResource( 19 )
HScrollBar/styles/grabber = SubResource( 3 )
HScrollBar/styles/grabber_highlight = SubResource( 4 )
HScrollBar/styles/grabber_pressed = SubResource( 5 )
HScrollBar/styles/scroll = SubResource( 6 )
HScrollBar/styles/scroll_focus = SubResource( 7 )
[node name="AnimationTimeline" type="Panel"]
margin_top = 438.0
@ -320,482 +262,9 @@ __meta__ = {
[node name="Control" type="Control" parent="AnimationContainer/TimelineContainer/TimelineButtons"]
margin_left = 225.0
margin_right = 386.0
margin_bottom = 38.0
size_flags_horizontal = 3
[node name="PanelContainer" type="PanelContainer" parent="AnimationContainer/TimelineContainer/TimelineButtons"]
margin_left = 390.0
margin_right = 902.0
margin_bottom = 38.0
[node name="AnimationButtons" type="HBoxContainer" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer"]
margin_left = 7.0
margin_top = 7.0
margin_right = 505.0
margin_bottom = 31.0
rect_min_size = Vector2( 0, 24 )
size_flags_horizontal = 3
custom_constants/separation = 40
alignment = 2
[node name="FrameButtons" type="HBoxContainer" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons"]
margin_right = 140.0
margin_bottom = 24.0
[node name="AddFrame" type="Button" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/FrameButtons" groups=[
"UIButtons",
]]
margin_top = 2.0
margin_right = 20.0
margin_bottom = 22.0
rect_min_size = Vector2( 20, 0 )
hint_tooltip = "Add a new frame"
focus_mode = 0
mouse_default_cursor_shape = 2
size_flags_horizontal = 0
size_flags_vertical = 4
[node name="TextureRect" type="TextureRect" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/FrameButtons/AddFrame"]
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
margin_left = -6.0
margin_top = -6.0
margin_right = 6.0
margin_bottom = 6.0
texture = ExtResource( 19 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="DeleteFrame" type="Button" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/FrameButtons" groups=[
"UIButtons",
]]
margin_left = 24.0
margin_top = 2.0
margin_right = 44.0
margin_bottom = 22.0
rect_min_size = Vector2( 20, 0 )
hint_tooltip = "Remove Frame"
focus_mode = 0
mouse_default_cursor_shape = 2
size_flags_horizontal = 0
size_flags_vertical = 4
[node name="TextureRect" type="TextureRect" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/FrameButtons/DeleteFrame"]
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
margin_left = -6.0
margin_top = -1.0
margin_right = 6.0
margin_bottom = 1.0
size_flags_horizontal = 0
size_flags_vertical = 0
texture = ExtResource( 20 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="CopyFrame" type="Button" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/FrameButtons" groups=[
"UIButtons",
]]
margin_left = 48.0
margin_top = 2.0
margin_right = 68.0
margin_bottom = 22.0
rect_min_size = Vector2( 20, 0 )
hint_tooltip = "Clone Frame"
focus_mode = 0
mouse_default_cursor_shape = 2
size_flags_horizontal = 0
size_flags_vertical = 4
[node name="TextureRect" type="TextureRect" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/FrameButtons/CopyFrame"]
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
margin_left = -5.0
margin_top = -7.0
margin_right = 5.0
margin_bottom = 7.0
texture = ExtResource( 27 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="FrameTagButton" type="Button" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/FrameButtons" groups=[
"UIButtons",
]]
margin_left = 72.0
margin_top = 2.0
margin_right = 92.0
margin_bottom = 22.0
rect_min_size = Vector2( 20, 0 )
hint_tooltip = "Manage frame tags"
focus_mode = 0
mouse_default_cursor_shape = 2
size_flags_horizontal = 0
size_flags_vertical = 4
[node name="TextureRect" type="TextureRect" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/FrameButtons/FrameTagButton"]
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
margin_left = -7.0
margin_top = -7.0
margin_right = 7.0
margin_bottom = 7.0
texture = ExtResource( 28 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="MoveLeft" type="Button" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/FrameButtons" groups=[
"UIButtons",
]]
margin_left = 96.0
margin_top = 2.0
margin_right = 116.0
margin_bottom = 22.0
rect_min_size = Vector2( 20, 0 )
hint_tooltip = "Move the selected frame to the left."
focus_mode = 0
mouse_default_cursor_shape = 2
size_flags_horizontal = 0
size_flags_vertical = 4
[node name="TextureRect" type="TextureRect" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/FrameButtons/MoveLeft"]
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
margin_left = -7.5
margin_top = -5.5
margin_right = 7.5
margin_bottom = 5.5
texture = ExtResource( 8 )
flip_h = true
__meta__ = {
"_edit_use_anchors_": false
}
[node name="MoveRight" type="Button" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/FrameButtons" groups=[
"UIButtons",
]]
margin_left = 120.0
margin_top = 2.0
margin_right = 140.0
margin_bottom = 22.0
rect_min_size = Vector2( 20, 0 )
hint_tooltip = "Move the selected frame to the right."
focus_mode = 0
mouse_default_cursor_shape = 2
size_flags_horizontal = 0
size_flags_vertical = 4
[node name="TextureRect" type="TextureRect" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/FrameButtons/MoveRight"]
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
margin_left = -7.5
margin_top = -5.5
margin_right = 7.5
margin_bottom = 5.5
texture = ExtResource( 8 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="PlaybackButtons" type="HBoxContainer" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons"]
margin_left = 180.0
margin_right = 320.0
margin_bottom = 24.0
[node name="FirstFrame" type="Button" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/PlaybackButtons" groups=[
"UIButtons",
]]
margin_top = 2.0
margin_right = 20.0
margin_bottom = 22.0
rect_min_size = Vector2( 20, 0 )
hint_tooltip = "FIRSTFRAME_HT"
focus_mode = 0
mouse_default_cursor_shape = 2
size_flags_vertical = 4
shortcut_in_tooltip = false
shortcut = SubResource( 4 )
[node name="TextureRect" type="TextureRect" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/PlaybackButtons/FirstFrame"]
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
margin_left = -5.5
margin_top = -6.0
margin_right = 5.5
margin_bottom = 6.0
texture = ExtResource( 21 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="PreviousFrame" type="Button" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/PlaybackButtons" groups=[
"UIButtons",
]]
margin_left = 24.0
margin_top = 2.0
margin_right = 44.0
margin_bottom = 22.0
rect_min_size = Vector2( 20, 0 )
hint_tooltip = "PREVIOUSFRAME_HT"
focus_mode = 0
mouse_default_cursor_shape = 2
size_flags_vertical = 4
shortcut_in_tooltip = false
shortcut = SubResource( 6 )
[node name="TextureRect" type="TextureRect" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/PlaybackButtons/PreviousFrame"]
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
margin_left = -5.5
margin_top = -6.0
margin_right = 5.5
margin_bottom = 6.0
texture = ExtResource( 23 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="PlayBackwards" type="Button" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/PlaybackButtons" groups=[
"UIButtons",
]]
margin_left = 48.0
margin_top = 2.0
margin_right = 68.0
margin_bottom = 22.0
rect_min_size = Vector2( 20, 0 )
hint_tooltip = "PLAYBACKWARDS_HT"
focus_mode = 0
mouse_default_cursor_shape = 2
size_flags_vertical = 4
toggle_mode = true
shortcut_in_tooltip = false
shortcut = SubResource( 8 )
[node name="TextureRect" type="TextureRect" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/PlaybackButtons/PlayBackwards"]
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
margin_left = -4.0
margin_top = -6.0
margin_right = 3.0
margin_bottom = 6.0
texture = ExtResource( 24 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="PlayForward" type="Button" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/PlaybackButtons" groups=[
"UIButtons",
]]
margin_left = 72.0
margin_top = 2.0
margin_right = 92.0
margin_bottom = 22.0
rect_min_size = Vector2( 20, 0 )
hint_tooltip = "PLAYFORWARD_HT"
focus_mode = 0
mouse_default_cursor_shape = 2
size_flags_horizontal = 0
size_flags_vertical = 4
toggle_mode = true
shortcut_in_tooltip = false
shortcut = SubResource( 10 )
[node name="TextureRect" type="TextureRect" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/PlaybackButtons/PlayForward"]
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
margin_left = -3.5
margin_top = -6.0
margin_right = 3.5
margin_bottom = 6.0
texture = ExtResource( 22 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="NextFrame" type="Button" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/PlaybackButtons" groups=[
"UIButtons",
]]
margin_left = 96.0
margin_top = 2.0
margin_right = 116.0
margin_bottom = 22.0
rect_min_size = Vector2( 20, 0 )
hint_tooltip = "NEXTFRAME_HT"
focus_mode = 0
mouse_default_cursor_shape = 2
size_flags_vertical = 4
shortcut_in_tooltip = false
shortcut = SubResource( 12 )
[node name="TextureRect" type="TextureRect" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/PlaybackButtons/NextFrame"]
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
margin_left = -5.5
margin_top = -6.0
margin_right = 5.5
margin_bottom = 6.0
texture = ExtResource( 26 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="LastFrame" type="Button" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/PlaybackButtons" groups=[
"UIButtons",
]]
margin_left = 120.0
margin_top = 2.0
margin_right = 140.0
margin_bottom = 22.0
rect_min_size = Vector2( 20, 0 )
hint_tooltip = "LASTFRAME_HT"
focus_mode = 0
mouse_default_cursor_shape = 2
size_flags_vertical = 4
shortcut_in_tooltip = false
shortcut = SubResource( 14 )
[node name="TextureRect" type="TextureRect" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/PlaybackButtons/LastFrame"]
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
margin_left = -5.5
margin_top = -6.0
margin_right = 5.5
margin_bottom = 6.0
texture = ExtResource( 25 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="LoopButtons" type="HBoxContainer" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons"]
margin_left = 360.0
margin_right = 498.0
margin_bottom = 24.0
[node name="OnionSkinningSettings" type="Button" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/LoopButtons" groups=[
"UIButtons",
]]
margin_top = 2.0
margin_right = 12.0
margin_bottom = 22.0
hint_tooltip = "Onion Skinning settings"
focus_mode = 0
mouse_default_cursor_shape = 2
size_flags_horizontal = 0
size_flags_vertical = 4
[node name="TextureRect" type="TextureRect" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/LoopButtons/OnionSkinningSettings"]
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
margin_left = -3.0
margin_top = -6.0
margin_right = 3.0
margin_bottom = 6.0
size_flags_horizontal = 0
size_flags_vertical = 0
texture = ExtResource( 30 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="OnionSkinning" type="Button" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/LoopButtons" groups=[
"UIButtons",
]]
margin_left = 16.0
margin_top = 2.0
margin_right = 36.0
margin_bottom = 22.0
rect_min_size = Vector2( 20, 0 )
hint_tooltip = "Enable/disable Onion Skinning"
focus_mode = 0
mouse_default_cursor_shape = 2
size_flags_vertical = 4
[node name="TextureRect" type="TextureRect" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/LoopButtons/OnionSkinning"]
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
margin_left = -7.0
margin_top = -7.0
margin_right = 7.0
margin_bottom = 7.0
size_flags_horizontal = 0
size_flags_vertical = 0
texture = ExtResource( 29 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="LoopAnim" type="Button" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/LoopButtons" groups=[
"UIButtons",
]]
margin_left = 40.0
margin_top = 2.0
margin_right = 60.0
margin_bottom = 22.0
rect_min_size = Vector2( 20, 0 )
hint_tooltip = "Cycle loop"
focus_mode = 0
mouse_default_cursor_shape = 2
size_flags_vertical = 4
[node name="TextureRect" type="TextureRect" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/LoopButtons/LoopAnim"]
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
margin_left = -7.0
margin_top = -7.0
margin_right = 7.0
margin_bottom = 7.0
texture = ExtResource( 31 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="FPSValue" type="SpinBox" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/LoopButtons"]
margin_left = 64.0
margin_right = 138.0
margin_bottom = 24.0
hint_tooltip = "How many frames per second should the animation preview be?
The more FPS, the faster the animation plays."
mouse_default_cursor_shape = 2
size_flags_vertical = 4
min_value = 0.1
step = 0.1
value = 6.0
align = 1
suffix = "FPS"
[node name="OpacityAndTagContainer" type="HBoxContainer" parent="AnimationContainer/TimelineContainer"]
margin_top = 50.0
@ -849,7 +318,7 @@ margin_right = 902.0
margin_bottom = 32.0
rect_min_size = Vector2( 0, 32 )
size_flags_horizontal = 3
theme = SubResource( 20 )
theme = SubResource( 8 )
scroll_vertical_enabled = false
[node name="TagContainer" type="Control" parent="AnimationContainer/TimelineContainer/OpacityAndTagContainer/TagScroll"]
@ -923,60 +392,6 @@ margin_bottom = 20.0
[node name="AnimationTimer" type="Timer" parent="."]
[node name="OnionSkinningSettings" type="WindowDialog" parent="."]
rect_min_size = Vector2( 220, 126 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="OnionSkinningButtons" type="VBoxContainer" parent="OnionSkinningSettings"]
anchor_top = 0.5
anchor_right = 1.0
anchor_bottom = 0.5
margin_left = 4.0
margin_top = -58.0
margin_right = -4.0
margin_bottom = 58.0
__meta__ = {
"_edit_use_anchors_": false
}
[node name="OnionSkinningPast" type="Label" parent="OnionSkinningSettings/OnionSkinningButtons"]
margin_right = 212.0
margin_bottom = 14.0
text = "Past Frames"
[node name="PastOnionSkinning" type="SpinBox" parent="OnionSkinningSettings/OnionSkinningButtons"]
margin_top = 18.0
margin_right = 212.0
margin_bottom = 42.0
mouse_default_cursor_shape = 2
min_value = 1.0
value = 1.0
align = 1
[node name="OnionSkinningFuture" type="Label" parent="OnionSkinningSettings/OnionSkinningButtons"]
margin_top = 46.0
margin_right = 212.0
margin_bottom = 60.0
text = "Future Frames"
[node name="FutureOnionSkinning" type="SpinBox" parent="OnionSkinningSettings/OnionSkinningButtons"]
margin_top = 64.0
margin_right = 212.0
margin_bottom = 88.0
mouse_default_cursor_shape = 2
min_value = 1.0
value = 1.0
align = 1
[node name="BlueRedMode" type="CheckBox" parent="OnionSkinningSettings/OnionSkinningButtons"]
margin_top = 92.0
margin_right = 212.0
margin_bottom = 116.0
mouse_default_cursor_shape = 2
text = "Blue-Red Mode"
[node name="FrameTagDialog" parent="." instance=ExtResource( 42 )]
[node name="FakeVSplitContainerGrabber" type="TextureRect" parent="."]
@ -997,26 +412,6 @@ __meta__ = {
[connection signal="pressed" from="AnimationContainer/TimelineContainer/TimelineButtons/LayerButtonPanelContainer/LayerButtons/MoveDownLayer" to="." method="change_layer_order" binds= [ -1 ]]
[connection signal="pressed" from="AnimationContainer/TimelineContainer/TimelineButtons/LayerButtonPanelContainer/LayerButtons/CloneLayer" to="." method="add_layer" binds= [ false ]]
[connection signal="pressed" from="AnimationContainer/TimelineContainer/TimelineButtons/LayerButtonPanelContainer/LayerButtons/MergeDownLayer" to="." method="_on_MergeDownLayer_pressed"]
[connection signal="pressed" from="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/FrameButtons/AddFrame" to="." method="add_frame"]
[connection signal="pressed" from="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/FrameButtons/DeleteFrame" to="." method="_on_DeleteFrame_pressed"]
[connection signal="pressed" from="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/FrameButtons/CopyFrame" to="." method="_on_CopyFrame_pressed"]
[connection signal="pressed" from="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/FrameButtons/FrameTagButton" to="." method="_on_FrameTagButton_pressed"]
[connection signal="pressed" from="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/FrameButtons/MoveLeft" to="." method="_on_MoveLeft_pressed"]
[connection signal="pressed" from="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/FrameButtons/MoveRight" to="." method="_on_MoveRight_pressed"]
[connection signal="pressed" from="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/PlaybackButtons/FirstFrame" to="." method="_on_FirstFrame_pressed"]
[connection signal="pressed" from="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/PlaybackButtons/PreviousFrame" to="." method="_on_PreviousFrame_pressed"]
[connection signal="toggled" from="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/PlaybackButtons/PlayBackwards" to="." method="_on_PlayBackwards_toggled"]
[connection signal="toggled" from="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/PlaybackButtons/PlayForward" to="." method="_on_PlayForward_toggled"]
[connection signal="pressed" from="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/PlaybackButtons/NextFrame" to="." method="_on_NextFrame_pressed"]
[connection signal="pressed" from="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/PlaybackButtons/LastFrame" to="." method="_on_LastFrame_pressed"]
[connection signal="pressed" from="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/LoopButtons/OnionSkinningSettings" to="." method="_on_OnionSkinningSettings_pressed"]
[connection signal="pressed" from="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/LoopButtons/OnionSkinning" to="." method="_on_OnionSkinning_pressed"]
[connection signal="pressed" from="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/LoopButtons/LoopAnim" to="." method="_on_LoopAnim_pressed"]
[connection signal="value_changed" from="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/LoopButtons/FPSValue" to="." method="_on_FPSValue_value_changed"]
[connection signal="value_changed" from="AnimationContainer/TimelineContainer/OpacityAndTagContainer/OpacityContainer/OpacitySlider" to="." method="_on_OpacitySlider_value_changed"]
[connection signal="value_changed" from="AnimationContainer/TimelineContainer/OpacityAndTagContainer/OpacityContainer/OpacitySpinBox" to="." method="_on_OpacitySlider_value_changed"]
[connection signal="timeout" from="AnimationTimer" to="." method="_on_AnimationTimer_timeout"]
[connection signal="popup_hide" from="OnionSkinningSettings" to="." method="_on_OnionSkinningSettings_popup_hide"]
[connection signal="value_changed" from="OnionSkinningSettings/OnionSkinningButtons/PastOnionSkinning" to="." method="_on_PastOnionSkinning_value_changed"]
[connection signal="value_changed" from="OnionSkinningSettings/OnionSkinningButtons/FutureOnionSkinning" to="." method="_on_FutureOnionSkinning_value_changed"]
[connection signal="toggled" from="OnionSkinningSettings/OnionSkinningButtons/BlueRedMode" to="." method="_on_BlueRedMode_toggled"]