UI/Window/WindowManager.cs
using Sandbox.UI;

namespace HC3.UI;

public class WindowManager : PanelComponent
{
	public static WindowManager Instance { get; private set; }

	public IEnumerable<Window> Windows => instances.Keys;
	public IEnumerable<WindowContainer> Containers => instances.Values;

	public Window Focused { get; private set; }

	private Dictionary<Window, WindowContainer> instances = new();

	protected override void OnAwake()
	{
		base.OnAwake();
		Instance = this;
	}

	/// <summary>
	/// Open and register a window
	/// </summary>
	public void Open( Window window )
	{
		// bring existing window to front
		if ( window.Key is { } value && Windows.FirstOrDefault( x => x.Key == value ) is { } existing )
		{
			BringToFront( existing );
			return;
		}

		var container = new WindowContainer( window );
		Panel.AddChild( container );

		instances.Add( window, container );

		// open under mouse by default
		window.ScreenPosition = Mouse.Position;
		BringToFront( window );
	}

	/// <summary>
	/// Close a window instance
	/// </summary>
	public void Close( Window window )
	{
		if ( !window.IsValid() ) return;

		Panel container = GetContainer( window );
		container?.Delete( true );

		window.OnClose();
		instances.Remove( window );

		StateHasChanged();
	}

	/// <summary>
	/// Get container for a window
	/// </summary>
	public WindowContainer GetContainer( Window window )
	{
		if ( instances.TryGetValue( window, out var container ) )
			return container;

		return null;
	}

	/// <summary>
	/// Activate a window
	/// </summary>
	public void BringToFront( Window window )
	{
		Deactivate( Focused );
		Focused = window;

		Focused.ConstrainToScreen();
		Focused.OnActivated();

		var container = GetContainer( window );
		if ( container.IsValid() )
		{
			container.Style.ZIndex = 99;
			container.Style.Dirty();
		}
	}

	/// <summary>
	/// Deactivate a given window
	/// </summary>
	private void Deactivate( Window window )
	{
		if ( !window.IsValid() ) return;

		window.OnDeactivated();

		var container = GetContainer( window );
		if ( container.IsValid() )
		{
			container.Style.ZIndex = 10;
			container.Style.Dirty();
		}

		Focused = null;
	}

	/// <summary>
	/// Deactivates all open windows
	/// </summary>
	public void DeactivateAll()
	{
		foreach ( var container in Containers.Where( x => x?.IsActive ?? false ) )
		{
			Deactivate( container.Window );
		}
	}
}