class_name PalettePanel extends VBoxContainer ## Catalog-sourced object palette (docs/architecture/editor.md ยง7.2 ## `PalettePanel`). Lists every id in an `EditorObjectCatalog` and emits ## which one the player picked; `InGameEditor` remembers it as the pending ## `catalog_id` for the next `ObjectPlaceTool` placement. signal object_selected(catalog_id: String) var _list: ItemList var _catalog: EditorObjectCatalog = null var _ids: Array[String] = [] func _init() -> void: name = "PalettePanel" func _ready() -> void: var header := Label.new() header.text = "Palette" add_child(header) _list = ItemList.new() _list.size_flags_vertical = Control.SIZE_EXPAND_FILL _list.item_selected.connect(_on_item_selected) add_child(_list) func set_catalog(catalog: EditorObjectCatalog) -> void: _catalog = catalog _refresh() func _refresh() -> void: _list.clear() _ids.clear() if _catalog == null or not _catalog.is_loaded(): return for id in _catalog.get_all_ids(): var entry := _catalog.resolve(id) var label: String = entry.get("display_name", id) _list.add_item(label) _ids.append(id) func _on_item_selected(index: int) -> void: if index < 0 or index >= _ids.size(): return object_selected.emit(_ids[index]) func get_selected_catalog_id() -> String: var selected: PackedInt32Array = _list.get_selected_items() if selected.is_empty(): return "" return _ids[selected[0]]