diff --git a/scripts/Core/Game.cs b/scripts/Core/Game.cs index 9fbdaba..42d46e5 100644 --- a/scripts/Core/Game.cs +++ b/scripts/Core/Game.cs @@ -100,6 +100,9 @@ namespace TheGame public override void _Input(InputEvent @event) { + if (!IsInsideTree()) + return; + if (@event.IsActionPressed("ui_cancel")) // ESC key { TogglePause(); diff --git a/scripts/Systems/Localization/LocalizationManager.cs b/scripts/Systems/Localization/LocalizationManager.cs index 133306f..74f2140 100644 --- a/scripts/Systems/Localization/LocalizationManager.cs +++ b/scripts/Systems/Localization/LocalizationManager.cs @@ -225,16 +225,24 @@ namespace TheGame public string GetText(string key) { + string text = null; + // Försök hämta från nuvarande språk if (_currentTranslations != null && _currentTranslations.ContainsKey(key)) { - return _currentTranslations[key]; + text = _currentTranslations[key]; + } + // Fallback till engelska + else if (_fallbackTranslations != null && _fallbackTranslations.ContainsKey(key)) + { + text = _fallbackTranslations[key]; } - // Fallback till engelska - if (_fallbackTranslations != null && _fallbackTranslations.ContainsKey(key)) + // Konvertera escape-sekvenser om vi hittade text + if (text != null) { - return _fallbackTranslations[key]; + text = text.Replace("\\n", "\n").Replace("\\t", "\t"); + return text; } // Om inte ens engelska finns, returnera nyckeln diff --git a/scripts/UI/Dialogs/AdvancedSaveDialog.cs b/scripts/UI/Dialogs/AdvancedSaveDialog.cs index 16270be..4265d0c 100644 --- a/scripts/UI/Dialogs/AdvancedSaveDialog.cs +++ b/scripts/UI/Dialogs/AdvancedSaveDialog.cs @@ -271,6 +271,9 @@ namespace TheGame public override void _Input(InputEvent @event) { + if (!IsInsideTree()) + return; + if (@event is InputEventKey keyEvent && keyEvent.Pressed) { if (keyEvent.Keycode == Key.Enter || keyEvent.Keycode == Key.KpEnter) @@ -287,13 +290,19 @@ namespace TheGame OnSaveConfirmed(); } } - GetViewport().SetInputAsHandled(); + if (IsInsideTree()) + { + GetViewport().SetInputAsHandled(); + } } else if (keyEvent.Keycode == Key.Escape) { Hide(); QueueFree(); - GetViewport().SetInputAsHandled(); + if (IsInsideTree()) + { + GetViewport().SetInputAsHandled(); + } } } } diff --git a/scripts/UI/Dialogs/ExitConfirmationDialog.cs b/scripts/UI/Dialogs/ExitConfirmationDialog.cs index 882cde9..0809032 100644 --- a/scripts/UI/Dialogs/ExitConfirmationDialog.cs +++ b/scripts/UI/Dialogs/ExitConfirmationDialog.cs @@ -3,7 +3,7 @@ using System; namespace TheGame { - public partial class ExitConfirmationDialog : AcceptDialog + public partial class ExitConfirmationDialog : Window { private Action _onConfirm; private Button _yesButton; @@ -15,6 +15,9 @@ namespace TheGame // Lägg till i localized_ui gruppen AddToGroup("localized_ui"); + // Dölj dialogen initialt + Hide(); + // Skapa dialog layout SetupDialog(); UpdateLocalization(); @@ -27,29 +30,46 @@ namespace TheGame Unresizable = false; ProcessMode = ProcessModeEnum.WhenPaused; - // Ta bort standard OK knapp - GetOkButton().QueueFree(); + // Konfigurera window egenskaper + Mode = ModeEnum.Windowed; + SetFlag(Flags.Popup, true); // Skapa innehåll var vbox = new VBoxContainer(); + vbox.AddThemeConstantOverride("separation", 10); AddChild(vbox); + // Lägg till padding + var margin = new MarginContainer(); + margin.AddThemeConstantOverride("margin_left", 25); + margin.AddThemeConstantOverride("margin_right", 25); + margin.AddThemeConstantOverride("margin_top", 25); + margin.AddThemeConstantOverride("margin_bottom", 25); + vbox.AddChild(margin); + + var content = new VBoxContainer(); + margin.AddChild(content); + _messageLabel = new Label(); _messageLabel.HorizontalAlignment = HorizontalAlignment.Center; + _messageLabel.VerticalAlignment = VerticalAlignment.Center; _messageLabel.AutowrapMode = TextServer.AutowrapMode.WordSmart; - vbox.AddChild(_messageLabel); + _messageLabel.CustomMinimumSize = new Vector2(300, 80); // Säkerställ tillräcklig höjd för text + content.AddChild(_messageLabel); // Lägg till mellanrum var spacer = new Control(); spacer.CustomMinimumSize = new Vector2(0, 20); - vbox.AddChild(spacer); + content.AddChild(spacer); // Skapa knappar var buttonContainer = new HBoxContainer(); buttonContainer.Alignment = BoxContainer.AlignmentMode.Center; - vbox.AddChild(buttonContainer); + content.AddChild(buttonContainer); _yesButton = new Button(); + _yesButton.FocusMode = Control.FocusModeEnum.All; + _yesButton.CustomMinimumSize = new Vector2(80, 35); _yesButton.Pressed += OnYesPressed; buttonContainer.AddChild(_yesButton); @@ -59,11 +79,14 @@ namespace TheGame buttonContainer.AddChild(buttonSpacer); _noButton = new Button(); + _noButton.FocusMode = Control.FocusModeEnum.All; + _noButton.CustomMinimumSize = new Vector2(80, 35); _noButton.Pressed += OnNoPressed; buttonContainer.AddChild(_noButton); - // Sätt minimum storlek för dialog - Size = new Vector2I(400, 200); + // Sätt lämplig storlek för dialog + MinSize = new Vector2I(380, 200); + Size = new Vector2I(420, 220); } public void UpdateLocalization() @@ -78,28 +101,51 @@ namespace TheGame public void ShowDialog(Action onConfirm) { _onConfirm = onConfirm; - PopupCentered(); - _noButton.GrabFocus(); // Fokusera på "Nej" som säkrare alternativ + // Använd PopupCentered med explicit storlek + PopupCentered(new Vector2I(420, 220)); + // Skjut upp fokusanropet till nästa frame + CallDeferred(nameof(FocusNoButton)); } + + private void FocusNoButton() + { + // Sätt fokus på "Nej"-knappen + if (_noButton != null && IsInsideTree() && _noButton.IsInsideTree()) + { + _noButton.GrabFocus(); + } + } + + private void OnYesPressed() { Hide(); _onConfirm?.Invoke(); + // Återställ onConfirm för nästa användning + _onConfirm = null; } private void OnNoPressed() { Hide(); + // Återställ onConfirm för nästa användning + _onConfirm = null; } public override void _Input(InputEvent @event) { + if (!IsInsideTree()) + return; + // Hantera ESC för att stänga dialog (samma som "Nej") if (@event.IsActionPressed("ui_cancel") && Visible) { OnNoPressed(); - GetViewport().SetInputAsHandled(); + if (IsInsideTree()) + { + GetViewport().SetInputAsHandled(); + } } } } diff --git a/scripts/UI/Dialogs/SaveDialog.cs b/scripts/UI/Dialogs/SaveDialog.cs index 32be990..d9aa812 100644 --- a/scripts/UI/Dialogs/SaveDialog.cs +++ b/scripts/UI/Dialogs/SaveDialog.cs @@ -81,19 +81,28 @@ namespace TheGame public override void _Input(InputEvent @event) { + if (!IsInsideTree()) + return; + // Se till att input fungerar när spelet är pausat if (@event is InputEventKey keyEvent && keyEvent.Pressed) { if (keyEvent.Keycode == Key.Enter || keyEvent.Keycode == Key.KpEnter) { OnSaveConfirmed(); - GetViewport().SetInputAsHandled(); + if (IsInsideTree()) + { + GetViewport().SetInputAsHandled(); + } } else if (keyEvent.Keycode == Key.Escape) { Hide(); QueueFree(); - GetViewport().SetInputAsHandled(); + if (IsInsideTree()) + { + GetViewport().SetInputAsHandled(); + } } } } diff --git a/scripts/UI/Menus/InstanceSelectionMenu.cs b/scripts/UI/Menus/InstanceSelectionMenu.cs index b2f24d0..777bfad 100644 --- a/scripts/UI/Menus/InstanceSelectionMenu.cs +++ b/scripts/UI/Menus/InstanceSelectionMenu.cs @@ -108,12 +108,18 @@ namespace TheGame public override void _Input(InputEvent @event) { + if (!IsInsideTree()) + return; + if (@event is InputEventKey keyEvent && keyEvent.Pressed) { if (keyEvent.Keycode == Key.Escape) { OnCancelPressed(); - GetViewport().SetInputAsHandled(); + if (IsInsideTree()) + { + GetViewport().SetInputAsHandled(); + } } } }