Vista de árbol

Un árbol de escena con dos columnas, construido desde un diccionario anidado por una función recursiva.

El editor de arriba está ejecutando este proyecto. Cambia una línea y se recarga.

Clases de Godot usadas

TreeTreeItem

El código

scripts/main.gd
extends Node

const SCENE: Dictionary = {
	Main = {
		Player = {Camera2D = {}, Sprite2D = {}, CollisionShape2D = {}},
		Level = {TileMapLayer = {}, Enemies = {Slime = {}, Bat = {}}},
		UI = {HealthBar = {}, PauseMenu = {}},
	}
}

var status: Label


func _ready() -> void:
	var column: VBoxContainer = _root()

	var title: Label = Label.new()
	title.text = 'Tree'
	title.add_theme_font_size_override('font_size', 26)
	column.add_child(title)

	var tree: Tree = Tree.new()
	tree.columns = 2
	tree.set_column_title(0, 'node')
	tree.set_column_title(1, 'visible')
	tree.column_titles_visible = true
	tree.custom_minimum_size = Vector2(520, 380)
	tree.item_selected.connect(func(): _on_selected(tree))
	column.add_child(tree)

	_fill(tree, null, SCENE)

	status = Label.new()
	status.text = 'click a row, the item_selected signal reports it'
	status.add_theme_color_override('font_color', Color('#999999'))
	column.add_child(status)


func _fill(tree: Tree, parent: TreeItem, data: Dictionary) -> void:
	for key in data:
		var item: TreeItem = tree.create_item(parent)
		item.set_text(0, key)
		item.set_text(1, 'yes')
		item.set_custom_color(0, Color('#8eef97') if data[key].is_empty() else Color('#ffffff'))

		_fill(tree, item, data[key])


func _on_selected(tree: Tree) -> void:
	var item: TreeItem = tree.get_selected()

	if item:
		status.text = 'selected %s' % item.get_text(0)


func _root() -> VBoxContainer:
	var background: ColorRect = ColorRect.new()
	background.color = Color('#12141a')
	add_child(background)
	background.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT)

	var center: CenterContainer = CenterContainer.new()
	add_child(center)
	center.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT)

	var column: VBoxContainer = VBoxContainer.new()
	column.add_theme_constant_override('separation', 16)
	center.add_child(column)

	return column

Más ejemplos de Interfaz