extends VBoxContainer class_name GroupMenu const ITEM_SCENE := preload("res://UI/Components/InstallItem.tscn") @onready var collapse_button: Button = %CollapseButton @onready var header_icon: TextureRect = %HeaderIcon @onready var header_text_label: Label = %HeaderTextLabel @onready var header_custom_control_container: HBoxContainer = %HeaderCustomControlContainer @onready var child_container: VBoxContainer = %ChildContainer @onready var add_install_button_container: CenterContainer = %AddInstallButtonContainer @onready var add_install_button: Button = %AddInstallButton @onready var description_label: Label = %DescriptionLabel @onready var inner_separator: HSeparator = %InnerSeparator @onready var edit_group_button: Button = %EditGroupButton @onready var delete_group_button: Button = %DeleteGroupButton @onready var header_container: HBoxContainer = %HeaderContainer @onready var install_edit_dialog: InstallEditDialog = %InstallEditDialog var group_metadata: GroupMetadata signal add_install_button_pressed signal edit_group_button_pressed signal delete_button_pressed signal header_text_changed(new_text: String, old_text: String) func _ready() -> void: collapse_button.pressed.connect( func(): var b := collapse_button set_children_visible(b.button_pressed) ) add_install_button.pressed.connect(add_new_install) install_edit_dialog.canceled.connect(install_edit_dialog.clear_ok_button_connections) # edit_group_button.pressed.connect(setup_rename) edit_group_button.pressed.connect(func(): edit_group_button_pressed.emit()) delete_group_button.pressed.connect(func(): delete_button_pressed.emit()) header_text_label.gui_input.connect(_on_header_text_label_gui_input) func add_new_install() -> void: install_edit_dialog.clear() install_edit_dialog.ok_button_text = "Create" install_edit_dialog.confirmed.connect( func(): var im := install_edit_dialog.get_install_metadata() var install_item: InstallItem = ITEM_SCENE.instantiate() child_container.add_child(install_item) install_item.setup_from_metadata(install_edit_dialog.get_install_metadata()) install_item.edit_item_button_pressed.connect(edit_install.bind(install_item)) , CONNECT_ONE_SHOT) install_edit_dialog.show() func edit_install(install_item: InstallItem) -> void: install_edit_dialog.clear() install_edit_dialog.ok_button_text = "OK" install_edit_dialog.install_metadata = install_item.install_metadata install_edit_dialog.fill_from_install_metadata() install_edit_dialog.confirmed.connect( func(): install_item.setup_from_metadata(install_edit_dialog.get_install_metadata()) , CONNECT_ONE_SHOT) install_edit_dialog.show() func free_item(at_idx: int) -> void: child_container.get_child(at_idx).queue_free() func clear() -> void: child_container.get_children().map( func(child: Node): child.queue_free() ) func set_text(text: String) -> void: header_text_label.text = text func get_text() -> String: return header_text_label.text func set_description(text: String) -> void: if text == "": description_label.visible = false return description_label.visible = true description_label.text = text func set_icon(icon: Texture2D) -> void: header_icon.texture = icon func set_icon_visible(p_visible: bool) -> void: header_icon.visible = p_visible func set_children_visible(p_visible: bool) -> void: collapse_button.text = "v" if p_visible else ">" child_container.visible = p_visible add_install_button_container.visible = p_visible inner_separator.visible = p_visible description_label.visible = p_visible && !description_label.text.is_empty() func add_custom(control: Control) -> void: header_custom_control_container.add_child(control) func setup_rename() -> void: header_text_label.visible = false var l := RenameLineEdit.new(header_text_label.text) l.size_flags_horizontal = header_text_label.size_flags_horizontal # edit_group_button.disabled = true var label_index := header_text_label.get_index() header_container.add_child(l) header_container.move_child(l, label_index) var reenable = func(): header_text_label.visible = true # edit_group_button.disabled = false l.canceled.connect(reenable) l.text_submitted.connect( func(new_text: String): var old_text: = header_text_label.text header_text_label.text = new_text header_text_changed.emit(new_text, old_text) reenable.call() ) l.grab_focus() func setup_from_metadata(header_text: String, p_group_metadata: GroupMetadata) -> void: group_metadata = p_group_metadata set_text(header_text) set_description(group_metadata.description) # TODO: add installs # TODO: add icon func _on_header_text_label_gui_input(event: InputEvent) -> void: if event is InputEventMouseButton && \ (event as InputEventMouseButton).double_click && \ (event as InputEventMouseButton).button_index == MOUSE_BUTTON_LEFT: get_viewport().set_input_as_handled() setup_rename()