1
0
Fork 0
mirror of https://github.com/Orama-Interactive/Pixelorama.git synced 2025-02-12 16:53:07 +00:00
Pixelorama/addons/dockable_container/layout_panel.gd
2025-02-10 03:04:42 +02:00

90 lines
1.8 KiB
GDScript

@tool
class_name DockableLayoutPanel
extends DockableLayoutNode
## DockableLayout leaf nodes, defining tabs
@export var names: PackedStringArray:
get:
return get_names()
set(value):
_names = value
emit_tree_changed()
@export var current_tab: int:
get:
return clampi(_current_tab, 0, _names.size() - 1)
set(value):
if value != _current_tab:
_current_tab = value
emit_tree_changed()
var _names := PackedStringArray()
var _current_tab := 0
func _init() -> void:
resource_name = "Tabs"
## Returns all tab names in this node
func get_names() -> PackedStringArray:
return _names
func push_name(name: String) -> void:
_names.append(name)
emit_tree_changed()
func insert_node(position: int, node: Node) -> void:
_names.insert(position, node.name)
emit_tree_changed()
func find_name(node_name: String) -> int:
for i in _names.size():
if _names[i] == node_name:
return i
return -1
func find_child(node: Node) -> int:
return find_name(node.name)
func remove_node(node: Node) -> void:
var i := find_child(node)
if i >= 0:
_names.remove_at(i)
emit_tree_changed()
else:
push_warning("Remove failed, node '%s' was not found" % node)
func rename_node(previous_name: String, new_name: String) -> void:
var i := find_name(previous_name)
if i >= 0:
_names.set(i, new_name)
emit_tree_changed()
else:
push_warning("Rename failed, name '%s' was not found" % previous_name)
## Returns whether there are any nodes
func is_empty() -> bool:
return _names.is_empty()
func update_nodes(node_names: PackedStringArray, data: Dictionary) -> void:
var i := 0
var removed_any := false
while i < _names.size():
var current := _names[i]
if not current in node_names or data.has(current):
_names.remove_at(i)
removed_any = true
else:
data[current] = self
i += 1
if removed_any:
emit_tree_changed()