# (c) 2023-present Eroax # (c) 2023-present Yagich # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) extends VBoxContainer class_name VariableViewer @onready var variable_tree: Tree = %VariableTree @onready var types_popup: PopupMenu = %TypesPopup var root: TreeItem func _ready() -> void: variable_tree.set_column_title(0, "Name") variable_tree.set_column_title(1, "Value") variable_tree.set_column_title(2, "Type") variable_tree.set_column_expand(1, true) variable_tree.set_column_expand_ratio(0, 15) variable_tree.set_column_expand_ratio(1, 70) variable_tree.set_column_expand_ratio(2, 15) root = variable_tree.create_item() rebuild_variable_tree() variable_tree.item_activated.connect( func(): var column := variable_tree.get_selected_column() var item := variable_tree.get_selected() if column < 2: variable_tree.edit_selected(true) else: var pos := get_global_mouse_position() var r := Rect2i(Vector2i(pos), Vector2i(0, 100)) for i in types_popup.get_item_count(): types_popup.set_item_checked(i, false) types_popup.set_item_checked(item.get_metadata(2), true) types_popup.popup(r) ) for i in DeckType.Types.size(): types_popup.add_radio_check_item(DeckType.type_str(i)) func rebuild_variable_tree(data: Dictionary = {}) -> void: #variable_tree.clear() # godot will raw dog a nullptr later if we clear the whole tree for i in root.get_children(): i.free() for i in data: add_item(i, data[i]) func add_item(item_name: String, item_value: Variant, parent: TreeItem = root) -> TreeItem: var item := variable_tree.create_item(parent) item.set_text(0, item_name) var type: DeckType.Types = DeckType.INVERSE_GODOT_TYPES_MAP[typeof(item_value)] match type: DeckType.Types.NUMERIC: item.set_cell_mode(1, TreeItem.CELL_MODE_RANGE) item.set_range(1, item_value) item.set_range_config(1, -9999, 9999, 0.0001) _: item.set_text(1, str(item_value)) item.set_text(2, DeckType.type_str(type)) item.set_metadata(2, type) if item_value is Dictionary: for i in item_value: add_item(i, item_value[i], item) if item_value is Array: for i in (item_value as Array).size(): add_item(str(i), item_value[i], item) item.collapsed = true return item