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

Only use one LayerButton scene instead of using inheritence

And make some code improvements in LayerButton.gd
This commit is contained in:
Emmanouil Papadeas 2023-12-05 01:08:26 +02:00
parent a627cff107
commit 5ece616a9a
11 changed files with 107 additions and 194 deletions

View file

@ -421,12 +421,8 @@ var onion_skinning_blue_red := false ## If [code]true[/code], then blue-red mod
var current_version: String = ProjectSettings.get_setting("application/config/Version")
# Nodes
## The preload of button used by the [BaseLayer].
var base_layer_button_node: PackedScene = load("res://src/UI/Timeline/BaseLayerButton.tscn")
## The preload of button used by the [PixelLayer].
var pixel_layer_button_node: PackedScene = load("res://src/UI/Timeline/PixelLayerButton.tscn")
## The preload of button used by the [GroupLayer].
var group_layer_button_node: PackedScene = load("res://src/UI/Timeline/GroupLayerButton.tscn")
## TThe [PackedScene] of the button used by layers in the timeline.
var layer_button_node := preload("res://src/UI/Timeline/LayerButton.tscn")
## The [PackedScene] of the button used by cels in the timeline.
var cel_button_scene: PackedScene = load("res://src/UI/Timeline/CelButton.tscn")

View file

@ -289,4 +289,4 @@ func accepts_child(_layer: BaseLayer) -> bool:
## Returns an instance of the layer button that will be added to the timeline.
func instantiate_layer_button() -> Node:
return null
return Global.layer_button_node.instantiate()

View file

@ -63,7 +63,3 @@ func set_name_to_default(number: int) -> void:
func accepts_child(_layer: BaseLayer) -> bool:
return true
func instantiate_layer_button() -> Node:
return Global.group_layer_button_node.instantiate()

View file

@ -27,7 +27,3 @@ func new_empty_cel() -> BaseCel:
func can_layer_get_drawn() -> bool:
return is_visible_in_hierarchy() && !is_locked_in_hierarchy()
func instantiate_layer_button() -> Node:
return Global.base_layer_button_node.instantiate()

View file

@ -34,7 +34,3 @@ func new_empty_cel() -> BaseCel:
func can_layer_get_drawn() -> bool:
return is_visible_in_hierarchy() && !is_locked_in_hierarchy()
func instantiate_layer_button() -> Node:
return Global.pixel_layer_button_node.instantiate()

View file

@ -884,7 +884,7 @@ func _update_frame_ui() -> void:
func _update_layer_ui() -> void:
for l in layers.size():
layers[l].index = l
Global.layer_vbox.get_child(layers.size() - 1 - l).layer = l
Global.layer_vbox.get_child(layers.size() - 1 - l).layer_index = l
var cel_hbox: HBoxContainer = Global.cel_vbox.get_child(layers.size() - 1 - l)
for f in frames.size():
cel_hbox.get_child(f).layer = l

View file

@ -1052,7 +1052,7 @@ func project_layer_added(layer: int) -> void:
var project := Global.current_project
var layer_button := project.layers[layer].instantiate_layer_button() as LayerButton
layer_button.layer = layer
layer_button.layer_index = layer
if project.layers[layer].name == "":
project.layers[layer].set_name_to_default(Global.current_project.layers.size())

View file

@ -1,44 +0,0 @@
[gd_scene load_steps=3 format=3 uid="uid://j2uq83bsi4si"]
[ext_resource type="PackedScene" uid="uid://bai814sqvk68f" path="res://src/UI/Timeline/BaseLayerButton.tscn" id="1"]
[ext_resource type="Texture2D" uid="uid://dndlglvqc7v6a" path="res://assets/graphics/layers/group_expanded.png" id="4"]
[node name="GroupLayerButton" instance=ExtResource("1")]
hide_expand_button = false
[node name="HBoxContainer" parent="." index="0"]
layout_mode = 1
anchors_preset = 15
grow_horizontal = 2
grow_vertical = 2
[node name="TextureRect" parent="HBoxContainer/LayerButtons/ExpandButton" index="0"]
anchor_left = 0.0
anchor_top = 0.0
anchor_right = 0.0
anchor_bottom = 0.0
offset_left = 0.0
offset_top = 0.0
offset_right = 22.0
offset_bottom = 22.0
texture = ExtResource("4")
[node name="TextureRect" parent="HBoxContainer/LayerButtons/VisibilityButton" index="0"]
anchor_left = 0.0
anchor_top = 0.0
anchor_right = 0.0
anchor_bottom = 0.0
offset_left = 0.0
offset_top = 0.0
offset_right = 22.0
offset_bottom = 22.0
[node name="TextureRect" parent="HBoxContainer/LayerButtons/LockButton" index="0"]
anchor_left = 0.0
anchor_top = 0.0
anchor_right = 0.0
anchor_bottom = 0.0
offset_left = 0.0
offset_top = 0.0
offset_right = 22.0
offset_bottom = 22.0

View file

@ -1,26 +1,29 @@
class_name LayerButton
extends Button
const HIERARCHY_DEPTH_PIXEL_SHIFT = 8
const HIERARCHY_DEPTH_PIXEL_SHIFT := 8
@export var hide_expand_button := true
var layer_index := 0
var layer := 0
@onready var expand_button: BaseButton = find_child("ExpandButton")
@onready var expand_button := %ExpandButton as BaseButton
@onready var visibility_button: BaseButton = find_child("VisibilityButton")
@onready var lock_button: BaseButton = find_child("LockButton")
@onready var label: Label = find_child("Label")
@onready var line_edit: LineEdit = find_child("LineEdit")
@onready var hierarchy_spacer: Control = find_child("HierarchySpacer")
@onready var linked_button: BaseButton = find_child("LinkButton")
@onready var linked_button := %LinkButton as BaseButton
func _ready() -> void:
var layer := Global.current_project.layers[layer_index]
if layer is PixelLayer:
linked_button.visible = true
elif layer is GroupLayer:
expand_button.visible = true
custom_minimum_size.y = Global.animation_timeline.cel_size
label.text = Global.current_project.layers[layer].name
line_edit.text = Global.current_project.layers[layer].name
label.text = layer.name
line_edit.text = layer.name
var layer_buttons = find_child("LayerButtons")
for child in layer_buttons.get_children():
@ -28,7 +31,7 @@ func _ready() -> void:
texture.modulate = Global.modulate_icon_color
# Visualize how deep into the hierarchy the layer is
var hierarchy_depth := Global.current_project.layers[layer].get_hierarchy_depth()
var hierarchy_depth := layer.get_hierarchy_depth()
hierarchy_spacer.custom_minimum_size.x = hierarchy_depth * HIERARCHY_DEPTH_PIXEL_SHIFT
if Global.control.theme.get_color("font_color", "Button").v > 0.5: # Light text is dark theme
@ -42,45 +45,44 @@ func _ready() -> void:
func update_buttons() -> void:
if hide_expand_button:
expand_button.mouse_filter = Control.MOUSE_FILTER_IGNORE
expand_button.get_child(0).visible = false # Hide the TextureRect
else:
if Global.current_project.layers[layer].expanded:
var layer := Global.current_project.layers[layer_index]
if layer is GroupLayer:
if layer.expanded:
Global.change_button_texturerect(expand_button.get_child(0), "group_expanded.png")
else:
Global.change_button_texturerect(expand_button.get_child(0), "group_collapsed.png")
if Global.current_project.layers[layer].visible:
if layer.visible:
Global.change_button_texturerect(visibility_button.get_child(0), "layer_visible.png")
else:
Global.change_button_texturerect(visibility_button.get_child(0), "layer_invisible.png")
if Global.current_project.layers[layer].locked:
if layer.locked:
Global.change_button_texturerect(lock_button.get_child(0), "lock.png")
else:
Global.change_button_texturerect(lock_button.get_child(0), "unlock.png")
if linked_button:
if Global.current_project.layers[layer].new_cels_linked: # If new layers will be linked
if layer.new_cels_linked: # If new layers will be linked
Global.change_button_texturerect(linked_button.get_child(0), "linked_layer.png")
else:
Global.change_button_texturerect(linked_button.get_child(0), "unlinked_layer.png")
visibility_button.modulate.a = 1
lock_button.modulate.a = 1
if is_instance_valid(Global.current_project.layers[layer].parent):
if not Global.current_project.layers[layer].parent.is_visible_in_hierarchy():
if is_instance_valid(layer.parent):
if not layer.parent.is_visible_in_hierarchy():
visibility_button.modulate.a = 0.33
if Global.current_project.layers[layer].parent.is_locked_in_hierarchy():
if layer.parent.is_locked_in_hierarchy():
lock_button.modulate.a = 0.33
## When pressing a button, change the appearance of other layers (ie: expand or visible)
func _update_buttons_all_layers() -> void:
var layer := Global.current_project.layers[layer_index]
for layer_button in Global.layer_vbox.get_children():
layer_button.update_buttons()
var expanded := Global.current_project.layers[layer_button.layer].is_expanded_in_hierarchy()
var expanded := layer.is_expanded_in_hierarchy()
layer_button.visible = expanded
Global.cel_vbox.get_child(layer_button.get_index()).visible = expanded
@ -109,21 +111,21 @@ func _on_LayerContainer_gui_input(event: InputEvent) -> void:
Global.canvas.selection.transform_content_confirm()
var prev_curr_layer := project.current_layer
if Input.is_action_pressed("shift"):
var layer_diff_sign := signi(layer - prev_curr_layer)
var layer_diff_sign := signi(layer_index - prev_curr_layer)
if layer_diff_sign == 0:
layer_diff_sign = 1
for i in range(0, project.frames.size()):
for j in range(prev_curr_layer, layer + layer_diff_sign, layer_diff_sign):
for j in range(prev_curr_layer, layer_index + layer_diff_sign, layer_diff_sign):
var frame_layer := [i, j]
if !project.selected_cels.has(frame_layer):
project.selected_cels.append(frame_layer)
project.change_cel(-1, layer)
project.change_cel(-1, layer_index)
elif Input.is_action_pressed("ctrl"):
for i in range(0, project.frames.size()):
var frame_layer := [i, layer]
var frame_layer := [i, layer_index]
if !project.selected_cels.has(frame_layer):
project.selected_cels.append(frame_layer)
project.change_cel(-1, layer)
project.change_cel(-1, layer_index)
else: # If the button is pressed without Shift or Control
_select_current_layer()
@ -143,18 +145,20 @@ func _save_layer_name(new_name: String) -> void:
line_edit.visible = false
line_edit.editable = false
label.text = new_name
if layer < Global.current_project.layers.size():
Global.current_project.layers[layer].name = new_name
if layer_index < Global.current_project.layers.size():
Global.current_project.layers[layer_index].name = new_name
func _on_ExpandButton_pressed() -> void:
Global.current_project.layers[layer].expanded = !Global.current_project.layers[layer].expanded
var layer := Global.current_project.layers[layer_index]
layer.expanded = !layer.expanded
_update_buttons_all_layers()
func _on_VisibilityButton_pressed() -> void:
Global.canvas.selection.transform_content_confirm()
Global.current_project.layers[layer].visible = !Global.current_project.layers[layer].visible
var layer := Global.current_project.layers[layer_index]
layer.visible = !layer.visible
Global.canvas.update_all_layers = true
Global.canvas.queue_redraw()
if Global.select_layer_on_button_click:
@ -164,7 +168,8 @@ func _on_VisibilityButton_pressed() -> void:
func _on_LockButton_pressed() -> void:
Global.canvas.selection.transform_content_confirm()
Global.current_project.layers[layer].locked = !Global.current_project.layers[layer].locked
var layer := Global.current_project.layers[layer_index]
layer.locked = !layer.locked
if Global.select_layer_on_button_click:
_select_current_layer()
_update_buttons_all_layers()
@ -172,10 +177,10 @@ func _on_LockButton_pressed() -> void:
func _on_LinkButton_pressed() -> void:
Global.canvas.selection.transform_content_confirm()
var layer_class := Global.current_project.layers[layer]
if not layer_class is PixelLayer:
var layer := Global.current_project.layers[layer_index]
if not layer is PixelLayer:
return
layer_class.new_cels_linked = !layer_class.new_cels_linked
layer.new_cels_linked = !layer.new_cels_linked
update_buttons()
if Global.select_layer_on_button_click:
_select_current_layer()
@ -183,17 +188,16 @@ func _on_LinkButton_pressed() -> void:
func _select_current_layer() -> void:
Global.current_project.selected_cels.clear()
var frame_layer := [Global.current_project.current_frame, layer]
var frame_layer := [Global.current_project.current_frame, layer_index]
if !Global.current_project.selected_cels.has(frame_layer):
Global.current_project.selected_cels.append(frame_layer)
Global.current_project.change_cel(-1, layer)
Global.current_project.change_cel(-1, layer_index)
func _get_drag_data(_position: Vector2) -> Variant:
var layers := range(
layer - Global.current_project.layers[layer].get_child_count(true), layer + 1
)
var layer := Global.current_project.layers[layer_index]
var layers := range(layer_index - layer.get_child_count(true), layer_index + 1)
var box := VBoxContainer.new()
for i in layers.size():
@ -204,7 +208,7 @@ func _get_drag_data(_position: Vector2) -> Variant:
box.add_child(button)
set_drag_preview(box)
return ["Layer", layer]
return ["Layer", layer_index]
func _can_drop_data(_pos: Vector2, data) -> bool:
@ -214,7 +218,7 @@ func _can_drop_data(_pos: Vector2, data) -> bool:
if data[0] != "Layer":
Global.animation_timeline.drag_highlight.visible = false
return false
var curr_layer: BaseLayer = Global.current_project.layers[layer]
var curr_layer: BaseLayer = Global.current_project.layers[layer_index]
var drag_layer: BaseLayer = Global.current_project.layers[data[1]]
if curr_layer == drag_layer:
@ -222,7 +226,7 @@ func _can_drop_data(_pos: Vector2, data) -> bool:
return false
var region: Rect2
var depth := Global.current_project.layers[layer].get_hierarchy_depth()
var depth := curr_layer.get_hierarchy_depth()
if Input.is_action_pressed("ctrl"): # Swap layers
if drag_layer.is_ancestor_of(curr_layer) or curr_layer.is_ancestor_of(drag_layer):
@ -236,7 +240,7 @@ func _can_drop_data(_pos: Vector2, data) -> bool:
return false
# If accepted as a child, is it in the center region?
if (
Global.current_project.layers[layer].accepts_child(drag_layer)
curr_layer.accepts_child(drag_layer)
and _get_region_rect(0.25, 0.75).has_point(get_global_mouse_position())
):
# Drawn regions are adjusted a bit from actual to clarify drop position
@ -275,7 +279,9 @@ func _drop_data(_pos: Vector2, data) -> void:
if Input.is_action_pressed("ctrl"): # Swap layers
# a and b both need "from", "to", and "to_parents"
# a is this layer (and children), b is the dropped layers
var a := {"from": range(layer - layers[layer].get_child_count(true), layer + 1)}
var a := {
"from": range(layer_index - layers[layer_index].get_child_count(true), layer_index + 1)
}
var b := {"from": drop_from_indices}
if a.from[0] < b.from[0]:
@ -311,28 +317,28 @@ func _drop_data(_pos: Vector2, data) -> void:
# If accepted as a child, is it in the center region?
if (
layers[layer].accepts_child(layers[drop_layer])
layers[layer_index].accepts_child(layers[drop_layer])
and _get_region_rect(0.25, 0.75).has_point(get_global_mouse_position())
):
to_index = layer
to_parent = layers[layer]
to_index = layer_index
to_parent = layers[layer_index]
else:
# Top or bottom region?
if _get_region_rect(0, 0.5).has_point(get_global_mouse_position()):
to_index = layer + 1
to_parent = layers[layer].parent
to_index = layer_index + 1
to_parent = layers[layer_index].parent
else:
# Place under the layer, if it has children, place after its lowest child
if layers[layer].has_children():
to_index = layers[layer].get_children(true)[0].index
if layers[layer_index].has_children():
to_index = layers[layer_index].get_children(true)[0].index
if layers[layer].is_ancestor_of(layers[drop_layer]):
if layers[layer_index].is_ancestor_of(layers[drop_layer]):
to_index += drop_from_indices.size()
else:
to_index = layer
to_parent = layers[layer].parent
to_index = layer_index
to_parent = layers[layer_index].parent
if drop_layer < layer:
if drop_layer < layer_index:
to_index -= drop_from_indices.size()
var drop_to_indices := range(to_index, to_index + drop_from_indices.size())
@ -347,7 +353,7 @@ func _drop_data(_pos: Vector2, data) -> void:
project.move_layers.bind(drop_to_indices, drop_from_indices, drop_from_parents)
)
if project.current_layer == drop_layer:
project.undo_redo.add_do_method(project.change_cel.bind(-1, layer))
project.undo_redo.add_do_method(project.change_cel.bind(-1, layer_index))
else:
project.undo_redo.add_do_method(project.change_cel.bind(-1, project.current_layer))
project.undo_redo.add_undo_method(project.change_cel.bind(-1, project.current_layer))

View file

@ -1,17 +1,19 @@
[gd_scene load_steps=4 format=3 uid="uid://bai814sqvk68f"]
[gd_scene load_steps=6 format=3 uid="uid://bai814sqvk68f"]
[ext_resource type="Script" path="res://src/UI/Timeline/LayerButton.gd" id="1"]
[ext_resource type="Texture2D" uid="uid://c2b3htff5yox8" path="res://assets/graphics/layers/layer_visible.png" id="2"]
[ext_resource type="Texture2D" uid="uid://dhc0pnnqojd2m" path="res://assets/graphics/layers/unlock.png" id="3"]
[ext_resource type="Script" path="res://src/UI/Timeline/LayerButton.gd" id="1_6hlpe"]
[ext_resource type="Texture2D" uid="uid://c2b3htff5yox8" path="res://assets/graphics/layers/layer_visible.png" id="2_ef6fb"]
[ext_resource type="Texture2D" uid="uid://dndlglvqc7v6a" path="res://assets/graphics/layers/group_expanded.png" id="2_enrtd"]
[ext_resource type="Texture2D" uid="uid://dhc0pnnqojd2m" path="res://assets/graphics/layers/unlock.png" id="3_ah1my"]
[ext_resource type="Texture2D" uid="uid://cofw1x6chh4i" path="res://assets/graphics/layers/unlinked_layer.png" id="4_058qm"]
[node name="BaseLayerButton" type="Button"]
[node name="LayerButton" type="Button"]
offset_right = 200.0
offset_bottom = 36.0
focus_mode = 0
mouse_default_cursor_shape = 2
toggle_mode = true
action_mode = 0
script = ExtResource("1")
script = ExtResource("1_6hlpe")
[node name="HBoxContainer" type="HBoxContainer" parent="."]
layout_mode = 1
@ -32,6 +34,8 @@ layout_mode = 2
theme_override_constants/separation = 10
[node name="ExpandButton" type="Button" parent="HBoxContainer/LayerButtons" groups=["UIButtons"]]
unique_name_in_owner = true
visible = false
custom_minimum_size = Vector2(22, 22)
layout_mode = 2
size_flags_horizontal = 0
@ -51,6 +55,7 @@ offset_right = 11.0
offset_bottom = 11.0
size_flags_horizontal = 0
size_flags_vertical = 0
texture = ExtResource("2_enrtd")
[node name="VisibilityButton" type="Button" parent="HBoxContainer/LayerButtons" groups=["UIButtons"]]
custom_minimum_size = Vector2(22, 22)
@ -73,7 +78,7 @@ offset_right = 11.0
offset_bottom = 11.0
size_flags_horizontal = 0
size_flags_vertical = 0
texture = ExtResource("2")
texture = ExtResource("2_ef6fb")
[node name="LockButton" type="Button" parent="HBoxContainer/LayerButtons" groups=["UIButtons"]]
custom_minimum_size = Vector2(22, 22)
@ -96,7 +101,33 @@ offset_right = 11.0
offset_bottom = 11.0
size_flags_horizontal = 0
size_flags_vertical = 0
texture = ExtResource("3")
texture = ExtResource("3_ah1my")
[node name="LinkButton" type="Button" parent="HBoxContainer/LayerButtons" groups=["UIButtons"]]
unique_name_in_owner = true
visible = false
custom_minimum_size = Vector2(22, 22)
layout_mode = 2
size_flags_horizontal = 0
size_flags_vertical = 4
tooltip_text = "Enable/disable automatic linking of new cels when creating new frames
Linked cels share content across multiple frames"
mouse_default_cursor_shape = 2
[node name="TextureRect" type="TextureRect" parent="HBoxContainer/LayerButtons/LinkButton"]
layout_mode = 0
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
offset_left = -11.0
offset_top = -11.0
offset_right = 11.0
offset_bottom = 11.0
size_flags_horizontal = 0
size_flags_vertical = 0
texture = ExtResource("4_058qm")
[node name="LayerName" type="HBoxContainer" parent="HBoxContainer"]
layout_mode = 2
@ -132,4 +163,5 @@ mouse_filter = 2
[connection signal="pressed" from="HBoxContainer/LayerButtons/ExpandButton" to="." method="_on_ExpandButton_pressed"]
[connection signal="pressed" from="HBoxContainer/LayerButtons/VisibilityButton" to="." method="_on_VisibilityButton_pressed"]
[connection signal="pressed" from="HBoxContainer/LayerButtons/LockButton" to="." method="_on_LockButton_pressed"]
[connection signal="pressed" from="HBoxContainer/LayerButtons/LinkButton" to="." method="_on_LinkButton_pressed"]
[connection signal="focus_exited" from="HBoxContainer/LayerName/LineEdit" to="." method="_on_LineEdit_focus_exited"]

View file

@ -1,65 +0,0 @@
[gd_scene load_steps=3 format=3 uid="uid://b7huapiokn3h4"]
[ext_resource type="PackedScene" uid="uid://bai814sqvk68f" path="res://src/UI/Timeline/BaseLayerButton.tscn" id="1"]
[ext_resource type="Texture2D" uid="uid://cofw1x6chh4i" path="res://assets/graphics/layers/unlinked_layer.png" id="4"]
[node name="PixelLayerButton" instance=ExtResource("1")]
[node name="ExpandButton" parent="HBoxContainer/LayerButtons" index="0"]
visible = false
[node name="TextureRect" parent="HBoxContainer/LayerButtons/ExpandButton" index="0"]
anchor_left = 0.0
anchor_top = 0.0
anchor_right = 0.0
anchor_bottom = 0.0
offset_left = 0.0
offset_top = 0.0
offset_right = 22.0
offset_bottom = 22.0
[node name="TextureRect" parent="HBoxContainer/LayerButtons/VisibilityButton" index="0"]
anchor_left = 0.0
anchor_top = 0.0
anchor_right = 0.0
anchor_bottom = 0.0
offset_left = 0.0
offset_top = 0.0
offset_right = 22.0
offset_bottom = 22.0
[node name="TextureRect" parent="HBoxContainer/LayerButtons/LockButton" index="0"]
anchor_left = 0.0
anchor_top = 0.0
anchor_right = 0.0
anchor_bottom = 0.0
offset_left = 0.0
offset_top = 0.0
offset_right = 22.0
offset_bottom = 22.0
[node name="LinkButton" type="Button" parent="HBoxContainer/LayerButtons" index="3" groups=["UIButtons"]]
custom_minimum_size = Vector2(22, 22)
layout_mode = 2
size_flags_horizontal = 0
size_flags_vertical = 4
tooltip_text = "Enable/disable automatic linking of new cels when creating new frames
Linked cels share content across multiple frames"
mouse_default_cursor_shape = 2
[node name="TextureRect" type="TextureRect" parent="HBoxContainer/LayerButtons/LinkButton" index="0"]
layout_mode = 0
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
offset_left = -11.0
offset_top = -11.0
offset_right = 11.0
offset_bottom = 11.0
size_flags_horizontal = 0
size_flags_vertical = 0
texture = ExtResource("4")
[connection signal="pressed" from="HBoxContainer/LayerButtons/LinkButton" to="." method="_on_LinkButton_pressed"]