Initial commit, layout mockup
This commit is contained in:
89
addons/dockable_container/layout_panel.gd
Normal file
89
addons/dockable_container/layout_panel.gd
Normal file
@@ -0,0 +1,89 @@
|
||||
@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()
|
||||
Reference in New Issue
Block a user