Use a new Layer class to handle layer information

This replaces the old Global.layers nested array mess, and makes the code easier to read and to understand.
This commit is contained in:
OverloadedOrama 2020-06-01 16:42:53 +03:00
parent 1762383c6b
commit a9ca858303
13 changed files with 100 additions and 86 deletions

View file

@ -366,13 +366,11 @@ func _ready() -> void:
error_dialog = find_node_by_name(root, "ErrorDialog")
# Store [Layer name (0), Layer visibility boolean (1), Layer lock boolean (2), Frame container (3),
# will new cels be linked boolean (4), Array of linked cels (5)]
layers.append([tr("Layer") + " 0", true, false, HBoxContainer.new(), false, []])
layers.append(Layer.new())
# Thanks to https://godotengine.org/qa/17524/how-to-find-an-instanced-scene-by-its-name
func find_node_by_name(root, node_name) -> Node:
func find_node_by_name(root : Node, node_name : String) -> Node:
if root.get_name() == node_name:
return root
for child in root.get_children():
@ -488,7 +486,7 @@ func canvases_changed(value : Array) -> void:
frame_id.queue_free()
for i in range(layers.size() - 1, -1, -1):
frames_container.add_child(layers[i][3])
frames_container.add_child(layers[i].frame_container)
for j in range(canvases.size()):
var label := Label.new()
@ -503,7 +501,7 @@ func canvases_changed(value : Array) -> void:
cel_button.layer = i
cel_button.get_child(0).texture = Global.canvases[j].layers[i][1]
layers[i][3].add_child(cel_button)
layers[i].frame_container.add_child(cel_button)
# This is useful in case tagged frames get deleted DURING the animation is playing
# otherwise, this code is useless in this context, since these values are being set
@ -556,27 +554,27 @@ func layers_changed(value : Array) -> void:
for i in range(layers.size() - 1, -1, -1):
var layer_container = load("res://src/UI/Timeline/LayerButton.tscn").instance()
layer_container.i = i
if !layers[i][0]:
layers[i][0] = tr("Layer") + " %s" % i
if !layers[i].name:
layers[i].name = tr("Layer") + " %s" % i
layers_container.add_child(layer_container)
layer_container.label.text = layers[i][0]
layer_container.line_edit.text = layers[i][0]
layer_container.label.text = layers[i].name
layer_container.line_edit.text = layers[i].name
frames_container.add_child(layers[i][3])
frames_container.add_child(layers[i].frame_container)
for j in range(canvases.size()):
var cel_button = load("res://src/UI/Timeline/CelButton.tscn").instance()
cel_button.frame = j
cel_button.layer = i
cel_button.get_child(0).texture = Global.canvases[j].layers[i][1]
layers[i][3].add_child(cel_button)
layers[i].frame_container.add_child(cel_button)
var layer_button = layers_container.get_child(layers_container.get_child_count() - 1 - current_layer)
layer_button.pressed = true
self.current_frame = current_frame # Call frame_changed to update UI
if layers[current_layer][2]:
if layers[current_layer].locked:
disable_button(remove_layer_button, true)
if layers.size() == 1:
@ -584,7 +582,7 @@ func layers_changed(value : Array) -> void:
disable_button(move_up_layer_button, true)
disable_button(move_down_layer_button, true)
disable_button(merge_down_layer_button, true)
elif !layers[current_layer][2]:
elif !layers[current_layer].locked:
disable_button(remove_layer_button, false)
@ -602,20 +600,20 @@ func frame_changed(value : int) -> void:
text_color = Color.black
frame_ids.get_child(i).add_color_override("font_color", text_color)
for layer in layers:
if i < layer[3].get_child_count():
layer[3].get_child(i).pressed = false
if i < layer.frame_container.get_child_count():
layer.frame_container.get_child(i).pressed = false
i += 1
# Select the new canvas/frame
canvas = canvases[current_frame]
canvas.visible = true
frame_ids.get_child(current_frame).add_color_override("font_color", control.theme.get_color("Selected Color", "Label"))
if current_frame < layers[current_layer][3].get_child_count():
layers[current_layer][3].get_child(current_frame).pressed = true
if current_frame < layers[current_layer].frame_container.get_child_count():
layers[current_layer].frame_container.get_child(current_frame).pressed = true
if canvases.size() == 1:
disable_button(remove_frame_button, true)
elif !layers[current_layer][2]:
elif !layers[current_layer].locked:
disable_button(remove_frame_button, false)
Global.transparent_checker._ready() # To update the rect size
@ -646,7 +644,7 @@ func layer_changed(value : int) -> void:
disable_button(merge_down_layer_button, true)
if current_layer < layers.size():
if layers[current_layer][2]:
if layers[current_layer].locked:
disable_button(remove_layer_button, true)
else:
if layers.size() > 1:

View file

@ -60,9 +60,8 @@ func open_pxo_file(path : String, untitled_backup : bool = false) -> void:
var layer_new_cels_linked := file.get_8()
linked_cels.append(file.get_var())
# Store [Layer name (0), Layer visibility boolean (1), Layer lock boolean (2), Frame container (3),
# will new cels be linked boolean (4), Array of linked cels (5)]
Global.layers.append([layer_name, layer_visibility, layer_lock, HBoxContainer.new(), layer_new_cels_linked, []])
var l := Layer.new(layer_name, layer_visibility, layer_lock, HBoxContainer.new(), layer_new_cels_linked, [])
Global.layers.append(l)
global_layer_line = file.get_line()
var frame_line := file.get_line()
@ -80,9 +79,8 @@ func open_pxo_file(path : String, untitled_backup : bool = false) -> void:
if file_major_version == 0 and file_minor_version < 7:
var layer_name_old_version = file.get_line()
if frame == 0:
# Store [Layer name (0), Layer visibility boolean (1), Layer lock boolean (2), Frame container (3),
# will new frames be linked boolean (4), Array of linked frames (5)]
Global.layers.append([layer_name_old_version, true, false, HBoxContainer.new(), false, []])
var l := Layer.new(layer_name_old_version)
Global.layers.append(l)
var layer_transparency := 1.0
if file_major_version >= 0 and file_minor_version > 5:
layer_transparency = file.get_float()
@ -94,7 +92,7 @@ func open_pxo_file(path : String, untitled_backup : bool = false) -> void:
canvas.layers.append([image, tex, layer_transparency])
if file_major_version >= 0 and file_minor_version >= 7:
if frame in linked_cels[layer_i]:
Global.layers[layer_i][5].append(canvas)
Global.layers[layer_i].linked_cels.append(canvas)
layer_i += 1
layer_line = file.get_line()
@ -185,12 +183,12 @@ func save_pxo_file(path : String, autosave : bool) -> void:
# Store Global layers
for layer in Global.layers:
file.store_line(".")
file.store_line(layer[0]) # Layer name
file.store_8(layer[1]) # Layer visibility
file.store_8(layer[2]) # Layer lock
file.store_8(layer[4]) # Future cels linked
file.store_line(layer.name)
file.store_8(layer.visible)
file.store_8(layer.locked)
file.store_8(layer.new_cels_linked)
var linked_cels := []
for canvas in layer[5]:
for canvas in layer.linked_cels:
linked_cels.append(canvas.frame)
file.store_var(linked_cels) # Linked cels as cel numbers