frame-of-mind/src/ui/prompter/prompter.gd

66 lines
1.8 KiB
GDScript3
Raw Normal View History

2026-01-23 12:39:47 +00:00
extends Control
## Provides methods and pre-instantiated prompts that can be easily arranged.
class_name Prompter
signal performed(action: String)
var _prompts : Dictionary[StringName, Control] = {}
func _ready() -> void:
_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)
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