From a49325eb37262b3169ead2490fcf0f10fe577ade Mon Sep 17 00:00:00 2001 From: Tiger Jove Date: Fri, 23 Jan 2026 14:47:10 +0100 Subject: [PATCH] feat: can now add things to prompter and it can perform things. --- src/ui/prompter/prompt_button.gd | 21 +++++++++--- src/ui/prompter/prompter.gd | 57 ++++++++++++++++++++++++++++++-- src/ui/prompter/prompter.tscn | 35 +++++++++----------- 3 files changed, 86 insertions(+), 27 deletions(-) diff --git a/src/ui/prompter/prompt_button.gd b/src/ui/prompter/prompt_button.gd index 82c2b4e..026de32 100644 --- a/src/ui/prompter/prompt_button.gd +++ b/src/ui/prompter/prompt_button.gd @@ -3,22 +3,33 @@ extends Button ## A button representing a specific action, and offering a default prompt that can be changed class_name PromptButton -var _action : StringName +signal performed(action: StringName) + +@onready var action_prompt : ActionPrompt = $ActionPrompt @export_custom(PROPERTY_HINT_INPUT_NAME, "show_builtin") var action : StringName = &"ui_accept": set(value): - _action = value + action = value if is_node_ready(): _update_action() else: _update_action.call_deferred() - get: return _action + get: return action + + +func _ready(): + self.pressed.connect(perform) + action_prompt.pressed.connect(perform) + + +func perform() -> void: + performed.emit(action) func _update_action(): - text = _action - $ActionPrompt.action = _action + text = action + action_prompt.action = action func _override_prompt(prompt: String): diff --git a/src/ui/prompter/prompter.gd b/src/ui/prompter/prompter.gd index 0af6bbd..88ab96b 100644 --- a/src/ui/prompter/prompter.gd +++ b/src/ui/prompter/prompter.gd @@ -3,12 +3,63 @@ extends Control class_name Prompter -signal action_performed(action: String) +signal performed(action: String) var _prompts : Dictionary[StringName, Control] = {} func _ready() -> void: - for prompt in get_tree().get_nodes_in_group("prompts"): + _register_prompts() + test() + +func _register_prompts() -> void: + for prompt in get_tree().get_nodes_in_group("prompts") as Array[PromptButton]: _prompts[prompt.name] = prompt prompt.get_parent().remove_child(prompt) - print(prompt) + prompt.performed.connect(_perform) + prints("Prompter.gd:", "registered", prompt) + + +func _perform(action : StringName): + prints("Prompter.gd:", "PERFORMED", action) + performed.emit(action) + + +func test() -> void: + await get_tree().create_timer(0.5).timeout + var prompts := pick("ui_cancel", "ui_accept") + show_left_bottom(prompts) + + +func _show(container: Control, controls: Array[Control], overrides: Array[StringName] = []) -> void: + for i in range(len(controls)): + var control := controls[i] + var override : StringName = overrides[i] if overrides else &"" + container.add_child(control) + control.appear(override) + + +func _clear(container: Control) -> void: + for child in container.get_children(): + container.remove_child(child) + + +func show_left_bottom(controls: Array[Control], overrides: Array[StringName] = []) -> void: + _show(%LeftBottom, controls, overrides) + + +func clear_left_bottom() -> void: + _clear(%LeftBottom) + + +## Selects a list of up to three prompts to be passed to the show_xxxxx() functions +func pick(p0: StringName, p1: StringName = "", p2: StringName = "") -> Array[Control]: + var result : Array[Control] = [] + assert(p0 in _prompts, p0 + " is not a known prompt.") + assert(not p1 or p1 in _prompts, p1 + " is not a known prompt.") + assert(not p2 or p2 in _prompts, p2 + " is not a known prompt.") + + result.append(_prompts[p0]) + if p1: result.append(_prompts[p1]) + if p2: result.append(_prompts[p2]) + + return result diff --git a/src/ui/prompter/prompter.tscn b/src/ui/prompter/prompter.tscn index fa04c89..de127b9 100644 --- a/src/ui/prompter/prompter.tscn +++ b/src/ui/prompter/prompter.tscn @@ -41,30 +41,30 @@ offset_right = 1836.0 offset_bottom = 996.0 mouse_filter = 2 -[node name="MarginContainer" type="MarginContainer" parent="SafeZone/CenterContainer"] +[node name="CenterZone" type="MarginContainer" parent="SafeZone/CenterContainer"] custom_minimum_size = Vector2(700, 700) layout_mode = 2 theme_override_constants/margin_top = 42 theme_override_constants/margin_right = 42 -[node name="TopCenter" type="PanelContainer" parent="SafeZone/CenterContainer/MarginContainer"] +[node name="TopCenter" type="PanelContainer" parent="SafeZone/CenterContainer/CenterZone"] layout_mode = 2 size_flags_horizontal = 4 size_flags_vertical = 0 theme_override_styles/panel = SubResource("StyleBoxFlat_ba0r8") -[node name="Label" type="Label" parent="SafeZone/CenterContainer/MarginContainer/TopCenter"] +[node name="Label" type="Label" parent="SafeZone/CenterContainer/CenterZone/TopCenter"] layout_mode = 2 text = "object to interact with" label_settings = SubResource("LabelSettings_fbpt0") horizontal_alignment = 1 -[node name="Control" type="Control" parent="SafeZone/CenterContainer/MarginContainer"] +[node name="CenterAnchor" type="Control" parent="SafeZone/CenterContainer/CenterZone"] layout_mode = 2 size_flags_horizontal = 4 size_flags_vertical = 8 -[node name="VBoxContainer" type="VBoxContainer" parent="SafeZone/CenterContainer/MarginContainer/Control"] +[node name="Center" type="VBoxContainer" parent="SafeZone/CenterContainer/CenterZone/CenterAnchor"] layout_mode = 1 anchors_preset = 7 anchor_left = 0.5 @@ -81,14 +81,11 @@ size_flags_vertical = 8 theme_override_constants/separation = 48 alignment = 2 -[node name="collect_memento_ui" parent="SafeZone/CenterContainer/MarginContainer/Control/VBoxContainer" instance=ExtResource("5_fbpt0")] -unique_name_in_owner = true +[node name="collect_memento_ui" parent="SafeZone/CenterContainer/CenterZone/CenterAnchor/Center" instance=ExtResource("5_fbpt0")] layout_mode = 2 text = "collect_memento_ui" -action = &"collect_memento_ui" -[node name="option_memento_ui" parent="SafeZone/CenterContainer/MarginContainer/Control/VBoxContainer" instance=ExtResource("5_fbpt0")] -unique_name_in_owner = true +[node name="option_memento_ui" parent="SafeZone/CenterContainer/CenterZone/CenterAnchor/Center" instance=ExtResource("5_fbpt0")] layout_mode = 2 text = "option_memento_ui" action = &"option_memento_ui" @@ -109,14 +106,15 @@ text = "a general explanation or hint about what is going on or an evaluation such as on the card-board" horizontal_alignment = 1 -[node name="LeftBottom" type="Control" parent="SafeZone"] +[node name="LeftBottomAnchor" type="Control" parent="SafeZone"] anchors_preset = 0 offset_top = 996.0 offset_bottom = 996.0 size_flags_horizontal = 0 size_flags_vertical = 8 -[node name="VBox" type="VBoxContainer" parent="SafeZone/LeftBottom"] +[node name="LeftBottom" type="VBoxContainer" parent="SafeZone/LeftBottomAnchor"] +unique_name_in_owner = true layout_mode = 1 anchors_preset = 2 anchor_top = 1.0 @@ -130,22 +128,20 @@ size_flags_vertical = 4 theme_override_constants/separation = 48 alignment = 2 -[node name="Accept" parent="SafeZone/LeftBottom/VBox" instance=ExtResource("5_fbpt0")] -unique_name_in_owner = true +[node name="ui_accept" parent="SafeZone/LeftBottomAnchor/LeftBottom" instance=ExtResource("5_fbpt0")] layout_mode = 2 -[node name="Cancel" parent="SafeZone/LeftBottom/VBox" instance=ExtResource("5_fbpt0")] -unique_name_in_owner = true +[node name="ui_cancel" parent="SafeZone/LeftBottomAnchor/LeftBottom" instance=ExtResource("5_fbpt0")] layout_mode = 2 text = "ui_cancel" action = &"ui_cancel" -[node name="Skip" parent="SafeZone/LeftBottom/VBox" instance=ExtResource("5_fbpt0")] +[node name="scene_skip" parent="SafeZone/LeftBottomAnchor/LeftBottom" instance=ExtResource("5_fbpt0")] layout_mode = 2 text = "scene_skip" action = &"scene_skip" -[node name="RightBottom" type="Control" parent="SafeZone"] +[node name="RightBottomAnchor" type="Control" parent="SafeZone"] layout_mode = 1 anchors_preset = 3 anchor_left = 1.0 @@ -157,7 +153,8 @@ offset_top = -40.0 grow_horizontal = 0 grow_vertical = 0 -[node name="VBox" type="VBoxContainer" parent="SafeZone/RightBottom"] +[node name="RightBottom" type="VBoxContainer" parent="SafeZone/RightBottomAnchor"] +unique_name_in_owner = true layout_mode = 1 anchors_preset = 3 anchor_left = 1.0