using Godot;
namespace Babushka.scripts.CSharp.Common.Savegame;
///
/// Tracks important window settings and communicates with the to save/load them.
///
public partial class WindowSettingsSync : Node
{
private Window window;
public override void _Ready()
{
window = GetWindow();
window.SizeChanged += SaveWindowSize;
SyncSettings();
SettingsSaveController.Instance.OnSettingsReloaded += SyncSettings;
}
public override void _ExitTree()
{
SaveWindowPosition();
SaveWindowBorderless();
SaveWindowSize();
SettingsSaveController.Instance.SaveSettings();
}
///
/// Tries to get previous settings from settings-savefile, if available.
///
public void SyncSettings()
{
if (!SettingsSaveController.Instance.LoadedData)
{
SaveWindowPosition();
SaveWindowSize();
SaveWindowBorderless();
return;
}
SettingsData? settingsData = SettingsSaveController.Instance.settings;
if (settingsData != null)
{
window.Position = new Vector2I(settingsData.windowPositionX, settingsData.windowPositionY);
ValidateWindowPosition();
window.Size = new Vector2I(settingsData.windowSizeX, settingsData.windowSizeY);
window.Borderless = settingsData.windowBorderless;
}
}
private void ValidateWindowPosition()
{
bool validWindowPosition = false;
foreach (Rect2I displayRect in DisplayServer.GetDisplayCutouts())
{
if (displayRect.HasPoint(window.Position))
{
validWindowPosition = true;
break;
}
}
if (!validWindowPosition)
{
window.MoveToCenter();
SaveWindowPosition();
}
}
private void SaveWindowPosition()
{
SettingsData? settingsData = SettingsSaveController.Instance.settings;
if (settingsData != null)
{
settingsData.windowPositionX = window.Position.X;
settingsData.windowPositionY = window.Position.Y;
}
}
private void SaveWindowSize()
{
SettingsData? settingsData = SettingsSaveController.Instance.settings;
if (settingsData != null)
{
settingsData.windowSizeX = window.Size.X;
settingsData.windowSizeY = window.Size.Y;
}
}
private void SaveWindowBorderless()
{
SettingsData? settingsData = SettingsSaveController.Instance.settings;
if (settingsData != null)
settingsData.windowBorderless = window.Borderless;
}
}