Files
TheGame/scripts/UI/Dialogs/SaveDialog.cs
2025-10-17 15:58:42 +02:00

110 lines
3.4 KiB
C#

using Godot;
namespace TheGame
{
public partial class SaveDialog : AcceptDialog
{
private LineEdit _nameInput;
private Game _gameController;
public override void _Ready()
{
// Sätt process mode så att dialogen fungerar när spelet är pausat
ProcessMode = ProcessModeEnum.WhenPaused;
var loc = LocalizationManager.Instance;
Title = loc.GetText("save_dialog_title");
// Skapa innehåll för dialogen
var vbox = new VBoxContainer();
var label = new Label();
label.Text = loc.GetText("save_dialog_enter_name");
vbox.AddChild(label);
_nameInput = new LineEdit();
_nameInput.PlaceholderText = loc.GetText("save_dialog_placeholder");
_nameInput.Text = $"Save {System.DateTime.Now:yyyy-MM-dd HH:mm}";
vbox.AddChild(_nameInput);
AddChild(vbox);
// Sätt process mode på alla child nodes
SetProcessModeRecursive(this, ProcessModeEnum.WhenPaused);
// Anslut signaler
Confirmed += OnSaveConfirmed;
// Fokusera på text input
_nameInput.GrabFocus();
_nameInput.SelectAll();
}
public void Initialize(Game gameController)
{
_gameController = gameController;
}
private void OnSaveConfirmed()
{
if (_gameController != null)
{
string saveName = _nameInput.Text.Trim();
if (string.IsNullOrEmpty(saveName))
{
saveName = $"Save {System.DateTime.Now:yyyy-MM-dd HH:mm}";
}
var saveManager = new SaveManager();
float currentTime = _gameController.GetGameTime();
saveManager.SaveGame(currentTime, saveName);
// Stäng pausmenyn och återgå till spelet
_gameController.TogglePause();
}
QueueFree();
}
private void SetProcessModeRecursive(Node node, ProcessModeEnum mode)
{
if (node is Control control)
{
control.ProcessMode = mode;
}
foreach (Node child in node.GetChildren())
{
SetProcessModeRecursive(child, mode);
}
}
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();
if (IsInsideTree())
{
GetViewport().SetInputAsHandled();
}
}
else if (keyEvent.Keycode == Key.Escape)
{
Hide();
QueueFree();
if (IsInsideTree())
{
GetViewport().SetInputAsHandled();
}
}
}
}
}
}