mirror of
https://github.com/Orama-Interactive/Pixelorama.git
synced 2025-02-12 16:53:07 +00:00
90 lines
1.8 KiB
GDScript
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()
|