Files
OpenMaidEngine/godot/WindowLaunchOptions.cs
2026-07-28 22:10:01 -04:00

53 lines
1.9 KiB
C#

using System;
using System.Collections.Generic;
using System.Globalization;
using Age.Engine.Sys4;
/// <summary>
/// Presentation-only window dimensions resolved from Godot user arguments. These never redefine the
/// SYS4 logical canvas, VM coordinates, or AGE surface dimensions.
/// </summary>
public readonly record struct WindowLaunchOptions(
int Width, int Height, bool WidthOverridden, bool HeightOverridden)
{
public const int MaximumDimension = Sys4LogicalCanvas.MaximumDimension;
public bool IsOverridden => WidthOverridden || HeightOverridden;
public static WindowLaunchOptions Resolve(
IReadOnlyList<string> arguments, Sys4LogicalCanvas logicalCanvas)
{
ArgumentNullException.ThrowIfNull(arguments);
int width = logicalCanvas.Width;
int height = logicalCanvas.Height;
bool widthOverridden = false;
bool heightOverridden = false;
for (int index = 0; index < arguments.Count; index++)
{
string argument = arguments[index];
if (argument is not ("--window-width" or "--window-height")) continue;
if (index + 1 >= arguments.Count)
throw new ArgumentException($"{argument} requires a pixel value");
string raw = arguments[++index];
if (!int.TryParse(raw, NumberStyles.Integer, CultureInfo.InvariantCulture, out int value)
|| value <= 0 || value > MaximumDimension)
throw new ArgumentException(
$"{argument} must be an integer from 1 through {MaximumDimension}; got '{raw}'");
if (argument == "--window-width")
{
width = value;
widthOverridden = true;
}
else
{
height = value;
heightOverridden = true;
}
}
return new WindowLaunchOptions(width, height, widthOverridden, heightOverridden);
}
}