yagvm/UI/Components/GroupMenu.gd

200 lines
5.9 KiB
GDScript3
Raw Normal View History

2023-03-05 11:03:08 +00:00
extends VBoxContainer
class_name GroupMenu
2023-03-05 11:03:08 +00:00
2023-05-25 22:41:48 +00:00
const ITEM_SCENE := preload("res://UI/Components/InstallItem.tscn")
2023-03-05 11:03:08 +00:00
@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
2023-03-05 11:03:08 +00:00
@onready var edit_group_button: Button = %EditGroupButton
2023-03-05 11:03:08 +00:00
@onready var delete_group_button: Button = %DeleteGroupButton
@onready var header_container: HBoxContainer = %HeaderContainer
2023-05-25 22:41:48 +00:00
@onready var install_edit_dialog: InstallEditDialog = %InstallEditDialog
var group_metadata: GroupMetadata
2023-03-05 11:03:08 +00:00
signal add_install_button_pressed
signal edit_group_button_pressed
2023-03-05 11:03:08 +00:00
func _ready() -> void:
collapse_button.pressed.connect(
func():
var b := collapse_button
set_children_visible(b.button_pressed)
)
2023-05-25 22:41:48 +00:00
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())
2023-05-27 03:08:36 +00:00
delete_group_button.pressed.connect(_on_delete_button_pressed)
2023-03-05 11:03:08 +00:00
header_text_label.gui_input.connect(_on_header_text_label_gui_input)
2023-03-05 11:03:08 +00:00
2023-05-25 22:41:48 +00:00
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)
2023-05-27 00:46:46 +00:00
install_item.setup_from_metadata(im)
2023-05-25 22:41:48 +00:00
install_item.edit_item_button_pressed.connect(edit_install.bind(install_item))
2023-05-27 04:36:20 +00:00
im.index = group_metadata.installs.size()
group_metadata.installs.append(im.to_d())
2023-05-27 02:54:11 +00:00
group_metadata.save_request.emit()
2023-05-27 04:36:20 +00:00
install_item.about_to_delete.connect(_on_install_item_about_to_delete)
2023-05-25 22:41:48 +00:00
, CONNECT_ONE_SHOT)
install_edit_dialog.show()
2023-05-27 04:36:20 +00:00
func add_install_from_metadata(im: InstallMetadata) -> void:
var install_item: InstallItem = ITEM_SCENE.instantiate()
child_container.add_child(install_item)
install_item.setup_from_metadata(im)
install_item.about_to_delete.connect(_on_install_item_about_to_delete)
install_item.edit_item_button_pressed.connect(edit_install.bind(install_item))
2023-05-25 22:41:48 +00:00
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()
2023-03-05 11:03:08 +00:00
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
2023-03-05 11:03:08 +00:00
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()
2023-05-27 03:35:16 +00:00
group_metadata.set_meta("collapsed", !p_visible)
group_metadata.save_request.emit()
2023-03-05 11:03:08 +00:00
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
2023-03-05 12:44:53 +00:00
var label_index := header_text_label.get_index()
2023-03-05 11:03:08 +00:00
header_container.add_child(l)
2023-03-05 12:44:53 +00:00
header_container.move_child(l, label_index)
2023-03-05 11:03:08 +00:00
var reenable = func():
header_text_label.visible = true
# edit_group_button.disabled = false
2023-03-05 11:03:08 +00:00
l.canceled.connect(reenable)
l.text_submitted.connect(
func(new_text: String):
header_text_label.text = new_text
2023-05-27 00:46:46 +00:00
group_metadata.name = new_text
2023-05-27 02:54:11 +00:00
group_metadata.save_request.emit()
2023-03-05 11:03:08 +00:00
reenable.call()
)
l.grab_focus()
2023-05-27 00:46:46 +00:00
func setup_from_metadata(p_group_metadata: GroupMetadata) -> void:
group_metadata = p_group_metadata
2023-05-27 00:46:46 +00:00
set_text(p_group_metadata.name)
set_description(group_metadata.description)
2023-05-27 03:35:16 +00:00
set_children_visible(!group_metadata.get_meta("collapsed", false))
group_metadata.index = get_index()
2023-05-27 04:36:20 +00:00
# add installs
for i in group_metadata.installs:
add_install_from_metadata(InstallMetadata.from_d(i))
# 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()
2023-05-27 03:08:36 +00:00
func _on_delete_button_pressed() -> void:
GroupsInstallsManager.delete_group_folder(group_metadata)
queue_free()
2023-05-27 04:36:20 +00:00
func _on_install_item_about_to_delete(im: InstallMetadata) -> void:
group_metadata.installs.remove_at(im.index)
for i in group_metadata.installs.size():
group_metadata.installs[i]["index"] = i
(child_container.get_child(i) as InstallItem).install_metadata.index = i
group_metadata.save_request.emit()