using Robust.Client.UserInterface.CustomControls; using Robust.Shared.Sandboxing; using System.Diagnostics.CodeAnalysis; using System.Numerics; namespace Content.Client._White.UserInterface; /// /// Used for buttons that open a window when pressed, and, if pressed again, close that window instead of opening another one. /// This kills the boilerplate. /// /// public sealed class WindowTracker where T : BaseWindow, new() { public T? Window { get; private set; } public bool IsOpen => Window is not null; private static ISandboxHelper? _sandbox = null; [MemberNotNullWhen(true, nameof(Window))] private bool Toggle() { _sandbox ??= IoCManager.Resolve(); if (Window is not null) { Window.Close(); return false; } Window = (T) _sandbox.CreateInstance(typeof(T)); Window.OnClose += () => Window = null; return true; } public bool Close() { if (Window is null) return false; Window.Close(); return true; } public bool TryOpen() { if (!Toggle()) return false; Window.Open(); return true; } public bool TryOpenCentered() { if (!Toggle()) return false; Window.OpenCentered(); return true; } public bool TryOpenCenteredAt(Vector2 pos) { if (!Toggle()) return false; Window.OpenCenteredAt(pos); return true; } public bool TryOpenCenteredLeft() { if (!Toggle()) return false; Window.OpenCenteredLeft(); return true; } public bool TryOpenCenteredRight() { if (!Toggle()) return false; Window.OpenCenteredRight(); return true; } // why the fuck does it take clyde as an arg //public bool TryOpenScreenAt() //{ // if (!Toggle()) // return false; // Window.OpenScreenAt(); // return true; //} public bool TryOpenToLeft() { if (!Toggle()) return false; Window.OpenToLeft(); return true; } public bool TryOpenToRight() { if (!Toggle()) return false; Window.OpenToRight(); return true; } }