From f9655a47e6086a2694db3fda7fa4a93687c6ebc9 Mon Sep 17 00:00:00 2001 From: Tiger Jove Date: Fri, 23 Jan 2026 13:39:47 +0100 Subject: [PATCH] feat: basic prompt button, needs work --- src/singletons/main/main.gd | 4 - src/ui/menu_main/pause_menu.gd | 22 +++- src/ui/prompter/input_parent.gd | 6 + src/ui/prompter/input_parent.gd.uid | 1 + src/ui/prompter/prompt_button.gd | 38 ++++++ src/ui/prompter/prompt_button.gd.uid | 1 + src/ui/prompter/prompt_button.tscn | 40 ++++++ src/ui/prompter/prompter.gd | 6 + src/ui/prompter/prompter.gd.uid | 1 + src/ui/prompter/prompter.tscn | 184 +++++++++++++++++++++------ 10 files changed, 255 insertions(+), 48 deletions(-) create mode 100644 src/ui/prompter/input_parent.gd create mode 100644 src/ui/prompter/input_parent.gd.uid create mode 100644 src/ui/prompter/prompt_button.gd create mode 100644 src/ui/prompter/prompt_button.gd.uid create mode 100644 src/ui/prompter/prompt_button.tscn create mode 100644 src/ui/prompter/prompter.gd create mode 100644 src/ui/prompter/prompter.gd.uid diff --git a/src/singletons/main/main.gd b/src/singletons/main/main.gd index cfa6736..5805b2d 100644 --- a/src/singletons/main/main.gd +++ b/src/singletons/main/main.gd @@ -111,10 +111,6 @@ var last_mode := DisplayServer.WINDOW_MODE_WINDOWED func _unhandled_input(event: InputEvent) -> void: #if event.is_action_type(): print_debug("Unhandled Input", event) - if event.is_action_pressed("ui_pause") and state == AppState.PLAY: - state = AppState.PAUSE - get_viewport().set_input_as_handled() - if not Engine.is_editor_hint(): if event.is_action_pressed("toggle_fullscreen"): get_viewport().set_input_as_handled() diff --git a/src/ui/menu_main/pause_menu.gd b/src/ui/menu_main/pause_menu.gd index 941ac88..3f52dac 100644 --- a/src/ui/menu_main/pause_menu.gd +++ b/src/ui/menu_main/pause_menu.gd @@ -16,12 +16,15 @@ func _ready() -> void: helpline_button.pressed.connect(func(): OS.shell_open("https://findahelpline.com/")) #skip_story_button.pressed.connect(_process) -func _on_help_pressed(): +func _on_help_pressed() -> void: OS.shell_open("https://findahelpline.com/") var last_mouse_mode: Input.MouseMode -func appear(): - State.save_game.save_to_file(get_tree().root.get_texture()) +func appear() -> void: + if State.save_game: + State.save_game.save_to_file(get_tree().root.get_texture()) + else: + push_warning("No save game exists.") get_tree().paused = true show() @@ -30,12 +33,17 @@ func appear(): %ResumeButton.grab_focus.call_deferred() -func disappear(): +func disappear() -> void: Main.state = Main.AppState.PLAY hide() Input.mouse_mode = last_mouse_mode get_tree().paused = false -func _unhandled_input(_event: InputEvent) -> void: - if not visible: return - get_viewport().set_input_as_handled() + +func _unhandled_input(event: InputEvent) -> void: + if not visible: + return + + if event.is_action_pressed("ui_pause") and Main.state == Main.AppState.PLAY: + Main.state = Main.AppState.PAUSE + get_viewport().set_input_as_handled() diff --git a/src/ui/prompter/input_parent.gd b/src/ui/prompter/input_parent.gd new file mode 100644 index 0000000..123ee09 --- /dev/null +++ b/src/ui/prompter/input_parent.gd @@ -0,0 +1,6 @@ +extends Node + +func _gui_input(event : InputEvent): + for child in get_children(): + if child.has_method("_gui_input"): + child._gui_input(event) \ No newline at end of file diff --git a/src/ui/prompter/input_parent.gd.uid b/src/ui/prompter/input_parent.gd.uid new file mode 100644 index 0000000..28a0eb1 --- /dev/null +++ b/src/ui/prompter/input_parent.gd.uid @@ -0,0 +1 @@ +uid://cjhic61ivhauc diff --git a/src/ui/prompter/prompt_button.gd b/src/ui/prompter/prompt_button.gd new file mode 100644 index 0000000..c5b964f --- /dev/null +++ b/src/ui/prompter/prompt_button.gd @@ -0,0 +1,38 @@ +@tool +extends Button +## A button representing a specific action, and offering a default prompt that can be changed +class_name PromptButton + +var _action : StringName +var _override : String + +@export_custom(PROPERTY_HINT_INPUT_NAME, "show_builtin") var action : StringName = &"ui_accept": + set(value): + if is_node_ready(): + _set_action(value) + else: + _set_action.call_deferred(value) + + get: return _action + + +func _set_action(value: StringName): + if _action == text or not text or not _action: + text = value + _action = value + $ActionPrompt.action = _action + +func appear(prompt: String = "") -> void: + assert(not _override, "Prompt is already in use, overridden from '" + _override + "' to '" + text + "'") + if prompt: + _override = text + text = prompt + show() + +func vanish() -> void: + hide() + if _override: + text = _override + _override = "" + else: + text = action # TODO: this is a bit backwards and doesn't allow manual overrides in editor diff --git a/src/ui/prompter/prompt_button.gd.uid b/src/ui/prompter/prompt_button.gd.uid new file mode 100644 index 0000000..c4163a7 --- /dev/null +++ b/src/ui/prompter/prompt_button.gd.uid @@ -0,0 +1 @@ +uid://d3gymb7uc8pkc diff --git a/src/ui/prompter/prompt_button.tscn b/src/ui/prompter/prompt_button.tscn new file mode 100644 index 0000000..94a1c05 --- /dev/null +++ b/src/ui/prompter/prompt_button.tscn @@ -0,0 +1,40 @@ +[gd_scene load_steps=7 format=3 uid="uid://nvbffevo54eh"] + +[ext_resource type="Script" uid="uid://d3gymb7uc8pkc" path="res://ui/prompter/prompt_button.gd" id="1_j4nun"] +[ext_resource type="Texture2D" uid="uid://b7breoabkyifr" path="res://addons/input_prompts/icons/xbox/A.png" id="2_3b7la"] +[ext_resource type="Script" uid="uid://bbs1u7ojno7xo" path="res://addons/input_prompts/action_prompt/action_prompt.gd" id="3_flaeu"] + +[sub_resource type="InputEventKey" id="InputEventKey_j4nun"] +keycode = 4194309 +unicode = 4194309 + +[sub_resource type="InputEventKey" id="InputEventKey_3b7la"] +keycode = 4194310 +unicode = 4194310 + +[sub_resource type="InputEventJoypadButton" id="InputEventJoypadButton_flaeu"] +device = -1 +pressed = true + +[node name="PromptButton" type="Button"] +text = "ui_accept" +script = ExtResource("1_j4nun") + +[node name="ActionPrompt" type="TextureRect" parent="."] +custom_minimum_size = Vector2(32, 32) +layout_mode = 1 +anchors_preset = 4 +anchor_top = 0.5 +anchor_bottom = 0.5 +offset_left = -90.0 +offset_top = -50.0 +offset_right = 10.0 +offset_bottom = 50.0 +grow_vertical = 2 +size_flags_vertical = 3 +texture = ExtResource("2_3b7la") +stretch_mode = 5 +script = ExtResource("3_flaeu") +action = "ui_accept" +icon = 0 +events = Array[InputEvent]([SubResource("InputEventKey_j4nun"), SubResource("InputEventKey_3b7la"), SubResource("InputEventJoypadButton_flaeu")]) diff --git a/src/ui/prompter/prompter.gd b/src/ui/prompter/prompter.gd new file mode 100644 index 0000000..ff6d823 --- /dev/null +++ b/src/ui/prompter/prompter.gd @@ -0,0 +1,6 @@ +extends Control +## Provides methods and pre-instantiated prompts that can be easily arranged. +class_name Prompter + + +signal action_performed(action: String) diff --git a/src/ui/prompter/prompter.gd.uid b/src/ui/prompter/prompter.gd.uid new file mode 100644 index 0000000..50294e9 --- /dev/null +++ b/src/ui/prompter/prompter.gd.uid @@ -0,0 +1 @@ +uid://de6ettn5s20va diff --git a/src/ui/prompter/prompter.tscn b/src/ui/prompter/prompter.tscn index 51a543c..fa04c89 100644 --- a/src/ui/prompter/prompter.tscn +++ b/src/ui/prompter/prompter.tscn @@ -1,17 +1,23 @@ -[gd_scene load_steps=5 format=3 uid="uid://btmlxxbucfqa7"] +[gd_scene load_steps=6 format=3 uid="uid://btmlxxbucfqa7"] -[ext_resource type="Texture2D" uid="uid://615hvpuiacvm" path="res://addons/input_prompts/icons/xbox/X.png" id="1_uowr1"] -[ext_resource type="Script" uid="uid://bbs1u7ojno7xo" path="res://addons/input_prompts/action_prompt/action_prompt.gd" id="2_xtx06"] +[ext_resource type="Script" uid="uid://de6ettn5s20va" path="res://ui/prompter/prompter.gd" id="1_ba0r8"] +[ext_resource type="FontFile" uid="uid://c5ql8u7tpd10j" path="res://import/fonts/KleeOne-SemiBold.ttf" id="3_xtx06"] +[ext_resource type="PackedScene" uid="uid://nvbffevo54eh" path="res://ui/prompter/prompt_button.tscn" id="5_fbpt0"] -[sub_resource type="InputEventKey" id="InputEventKey_uowr1"] -device = -1 -physical_keycode = 88 -unicode = 120 +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ba0r8"] +bg_color = Color(0, 0, 0, 0.5019608) +corner_radius_top_left = 10 +corner_radius_top_right = 10 +corner_radius_bottom_right = 10 +corner_radius_bottom_left = 10 -[sub_resource type="InputEventJoypadButton" id="InputEventJoypadButton_xtx06"] -device = -1 -button_index = 2 -pressed = true +[sub_resource type="LabelSettings" id="LabelSettings_fbpt0"] +font = ExtResource("3_xtx06") +font_size = 48 +outline_size = 4 +outline_color = Color(0, 0, 0, 1) +shadow_size = 4 +shadow_color = Color(0, 0, 0, 0.78431374) [node name="Prompter" type="MarginContainer"] anchors_preset = 15 @@ -23,42 +29,146 @@ theme_override_constants/margin_left = 42 theme_override_constants/margin_top = 42 theme_override_constants/margin_right = 42 theme_override_constants/margin_bottom = 42 +script = ExtResource("1_ba0r8") -[node name="CenterContainer" type="CenterContainer" parent="."] +[node name="SafeZone" type="Control" parent="."] layout_mode = 2 +mouse_filter = 2 -[node name="MarginContainer" type="MarginContainer" parent="CenterContainer"] -custom_minimum_size = Vector2(500, 500) +[node name="CenterContainer" type="CenterContainer" parent="SafeZone"] +layout_mode = 0 +offset_right = 1836.0 +offset_bottom = 996.0 +mouse_filter = 2 + +[node name="MarginContainer" 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="VPrompt" type="VBoxContainer" parent="CenterContainer/MarginContainer"] -custom_minimum_size = Vector2(480, 80) +[node name="TopCenter" type="PanelContainer" parent="SafeZone/CenterContainer/MarginContainer"] +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"] +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"] layout_mode = 2 size_flags_horizontal = 4 size_flags_vertical = 8 -[node name="CenterContainer" type="CenterContainer" parent="CenterContainer/MarginContainer/VPrompt"] -custom_minimum_size = Vector2(32, 32) -layout_mode = 2 +[node name="VBoxContainer" type="VBoxContainer" parent="SafeZone/CenterContainer/MarginContainer/Control"] +layout_mode = 1 +anchors_preset = 7 +anchor_left = 0.5 +anchor_top = 1.0 +anchor_right = 0.5 +anchor_bottom = 1.0 +offset_left = -157.0 +offset_top = -144.0 +offset_right = 253.0 +grow_horizontal = 2 +grow_vertical = 0 +size_flags_horizontal = 4 +size_flags_vertical = 8 +theme_override_constants/separation = 48 +alignment = 2 -[node name="ActionPrompt" type="TextureRect" parent="CenterContainer/MarginContainer/VPrompt/CenterContainer"] -unique_name_in_owner = true -custom_minimum_size = Vector2(48, 48) -layout_mode = 2 -size_flags_vertical = 3 -texture = ExtResource("1_uowr1") -stretch_mode = 5 -script = ExtResource("2_xtx06") -action = "scene_skip" -icon = 0 -events = Array[InputEvent]([null, SubResource("InputEventKey_uowr1"), SubResource("InputEventJoypadButton_xtx06")]) - -[node name="SkipButton" type="Button" parent="CenterContainer/MarginContainer/VPrompt"] +[node name="collect_memento_ui" parent="SafeZone/CenterContainer/MarginContainer/Control/VBoxContainer" instance=ExtResource("5_fbpt0")] unique_name_in_owner = true layout_mode = 2 -size_flags_vertical = 3 -text = "reveal full text (hold)" +text = "collect_memento_ui" +action = &"collect_memento_ui" -[connection signal="button_down" from="CenterContainer/MarginContainer/VPrompt/SkipButton" to="CenterContainer/MarginContainer/VPrompt" method="_on_skip_button_button_down"] -[connection signal="button_up" from="CenterContainer/MarginContainer/VPrompt/SkipButton" to="CenterContainer/MarginContainer/VPrompt" method="_on_skip_button_button_up"] -[connection signal="toggled" from="CenterContainer/MarginContainer/VPrompt/SkipButton" to="CenterContainer/MarginContainer/VPrompt" method="_on_skip_button_toggled"] +[node name="option_memento_ui" parent="SafeZone/CenterContainer/MarginContainer/Control/VBoxContainer" instance=ExtResource("5_fbpt0")] +unique_name_in_owner = true +layout_mode = 2 +text = "option_memento_ui" +action = &"option_memento_ui" + +[node name="Top" type="PanelContainer" parent="SafeZone"] +layout_mode = 1 +anchors_preset = 5 +anchor_left = 0.5 +anchor_right = 0.5 +offset_left = -230.5 +offset_right = 230.5 +offset_bottom = 98.33334 +grow_horizontal = 2 + +[node name="Label" type="Label" parent="SafeZone/Top"] +layout_mode = 2 +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"] +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"] +layout_mode = 1 +anchors_preset = 2 +anchor_top = 1.0 +anchor_bottom = 1.0 +offset_left = 64.0 +offset_top = -240.0 +offset_right = 386.0 +grow_vertical = 0 +size_flags_horizontal = 0 +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 +layout_mode = 2 + +[node name="Cancel" parent="SafeZone/LeftBottom/VBox" instance=ExtResource("5_fbpt0")] +unique_name_in_owner = true +layout_mode = 2 +text = "ui_cancel" +action = &"ui_cancel" + +[node name="Skip" parent="SafeZone/LeftBottom/VBox" instance=ExtResource("5_fbpt0")] +layout_mode = 2 +text = "scene_skip" +action = &"scene_skip" + +[node name="RightBottom" type="Control" parent="SafeZone"] +layout_mode = 1 +anchors_preset = 3 +anchor_left = 1.0 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -40.0 +offset_top = -40.0 +grow_horizontal = 0 +grow_vertical = 0 + +[node name="VBox" type="VBoxContainer" parent="SafeZone/RightBottom"] +layout_mode = 1 +anchors_preset = 3 +anchor_left = 1.0 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -322.0 +offset_top = -240.0 +grow_horizontal = 0 +grow_vertical = 0 +size_flags_horizontal = 0 +size_flags_vertical = 4 +theme_override_constants/separation = 48 +alignment = 2