From 42db0747553d02b20e1c7a0b0aece619403ad6d5 Mon Sep 17 00:00:00 2001 From: Varylios Date: Sat, 6 Sep 2025 23:26:37 +0200 Subject: [PATCH] chore: add confirm popup --- Globals/Game.gd | 3 +++ Globals/Helper.gd | 17 ++++++++++++++ Towers/Tower.gd | 7 +++--- UI/ConfirmPopup.gd | 18 +++++++++++++++ UI/ConfirmPopup.gd.uid | 1 + UI/confirm_popup.tscn | 51 ++++++++++++++++++++++++++++++++++++++++++ UI/gui.gd | 4 ++-- 7 files changed, 96 insertions(+), 5 deletions(-) create mode 100644 UI/ConfirmPopup.gd create mode 100644 UI/ConfirmPopup.gd.uid create mode 100644 UI/confirm_popup.tscn diff --git a/Globals/Game.gd b/Globals/Game.gd index 0ab9045..ec48873 100644 --- a/Globals/Game.gd +++ b/Globals/Game.gd @@ -37,6 +37,9 @@ func _ready() -> void: func _input(event: InputEvent) -> void: + if Engine.is_editor_hint(): + return + if event.is_action_pressed("pause_game"): get_tree().paused = not get_tree().paused diff --git a/Globals/Helper.gd b/Globals/Helper.gd index 908fb22..9fa04b8 100644 --- a/Globals/Helper.gd +++ b/Globals/Helper.gd @@ -1,6 +1,10 @@ @tool class_name Helper + +const confirmPopupScene : PackedScene = preload("res://UI/confirm_popup.tscn") + + const SCENE_DIR_PATTERN : String = "res://\\w+/(Scenes|Map \\d+)/$" const SCENE_FILE_PATTERN : String = "([^/]*)\\.tscn$" const RESOURCE_FILE_PATTERN : String = "([^/]*)\\.tres$" @@ -63,3 +67,16 @@ static func getFileFromDir(path : String, regexPattern : String, pathRegexPatter files.append(path + file) return files + + +static func showConfirmPopup( + text : String, + nodeToAppend : Node, + confirmCallback : Callable, + cancelCallback : Callable = func(): null +) -> void: + var confirmPopup : ConfirmPopup = confirmPopupScene.instantiate() + nodeToAppend.add_child(confirmPopup) + confirmPopup.label.text = text + confirmPopup.confirmed.connect(confirmCallback) + confirmPopup.canceled.connect(cancelCallback) diff --git a/Towers/Tower.gd b/Towers/Tower.gd index f3aed55..35ef0ae 100644 --- a/Towers/Tower.gd +++ b/Towers/Tower.gd @@ -146,11 +146,12 @@ func onBodyExited(body: Node3D) -> void: func toggleConnection(activate : bool) -> void: - if activate: + if activate && not $Range.body_entered.is_connected(onBodyEntered): $Range.body_entered.connect(onBodyEntered) $Range.body_exited.connect(onBodyExited) else: - $Range.body_entered.disconnect(onBodyEntered) - $Range.body_exited.disconnect(onBodyExited) + if $Range.body_entered.is_connected(onBodyEntered): + $Range.body_entered.disconnect(onBodyEntered) + $Range.body_exited.disconnect(onBodyExited) availableTargets.clear() target = null diff --git a/UI/ConfirmPopup.gd b/UI/ConfirmPopup.gd new file mode 100644 index 0000000..4a1cc99 --- /dev/null +++ b/UI/ConfirmPopup.gd @@ -0,0 +1,18 @@ +extends PanelContainer +class_name ConfirmPopup + + +signal confirmed +signal canceled + +@onready var label : Label = $MarginContainer/ConfirmPrompt/Label + + +func _ready() -> void: + %CancelBtn.pressed.connect(emitPressedButton.bind(canceled)) + %ConfirmBtn.pressed.connect(emitPressedButton.bind(confirmed)) + + +func emitPressedButton(state : Signal) -> void: + state.emit() + queue_free() diff --git a/UI/ConfirmPopup.gd.uid b/UI/ConfirmPopup.gd.uid new file mode 100644 index 0000000..fb573b4 --- /dev/null +++ b/UI/ConfirmPopup.gd.uid @@ -0,0 +1 @@ +uid://8c1ej1k0vbmn diff --git a/UI/confirm_popup.tscn b/UI/confirm_popup.tscn new file mode 100644 index 0000000..9d66c21 --- /dev/null +++ b/UI/confirm_popup.tscn @@ -0,0 +1,51 @@ +[gd_scene load_steps=3 format=3 uid="uid://cxn3x8dq8vawa"] + +[ext_resource type="Script" uid="uid://8c1ej1k0vbmn" path="res://UI/ConfirmPopup.gd" id="1_8vkfp"] +[ext_resource type="Theme" uid="uid://bbp4qcbwkeg7x" path="res://default_theme.tres" id="1_x7bkm"] + +[node name="Panel" type="PanelContainer"] +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -194.0 +offset_right = 194.0 +offset_bottom = 128.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +theme = ExtResource("1_x7bkm") +script = ExtResource("1_8vkfp") + +[node name="MarginContainer" type="MarginContainer" parent="."] +layout_mode = 2 +theme_override_constants/margin_left = 50 +theme_override_constants/margin_top = 50 +theme_override_constants/margin_right = 50 +theme_override_constants/margin_bottom = 25 + +[node name="ConfirmPrompt" type="VBoxContainer" parent="MarginContainer"] +layout_mode = 2 +theme_override_constants/separation = 50 + +[node name="Label" type="Label" parent="MarginContainer/ConfirmPrompt"] +layout_mode = 2 +size_flags_vertical = 6 +horizontal_alignment = 1 + +[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/ConfirmPrompt"] +layout_mode = 2 +theme_override_constants/separation = 50 + +[node name="ConfirmBtn" type="Button" parent="MarginContainer/ConfirmPrompt/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +text = "Confirm" + +[node name="CancelBtn" type="Button" parent="MarginContainer/ConfirmPrompt/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +text = "Cancel +" diff --git a/UI/gui.gd b/UI/gui.gd index 9ea6f37..a6024bb 100644 --- a/UI/gui.gd +++ b/UI/gui.gd @@ -21,8 +21,8 @@ func _ready() -> void: EventBus.wave_has_change.connect(onWaveChange) %NextWaveBtn.pressed.connect(EventBus.lauch_next_wave.emit) $WaveCooldown/Timer.timeout.connect(updateWaveCooldownLabel) - %QuitLevelBtn.pressed.connect(Game.quitLevel) - %QuitGameBtn.pressed.connect(Game.quitGame) + %QuitLevelBtn.pressed.connect(Helper.showConfirmPopup.bind("Quit level ?", self, Game.quitLevel)) + %QuitGameBtn.pressed.connect(Helper.showConfirmPopup.bind("Quit game ?", self, Game.quitGame)) $TowerInfoPanel.visible = false if Engine.is_editor_hint():