@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 int(clamp(_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()