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 );
}
}
}