acdream/src/AcDream.App/UI/RetainedPanelControllerGroup.cs

52 lines
1.6 KiB
C#

using System;
namespace AcDream.App.UI;
/// <summary>
/// Gives one retained window a single lifecycle owner when its imported subtree
/// is bound by multiple focused controllers (for example toolbar+selection or
/// inventory+paperdoll). Teardown runs in reverse construction order and is
/// idempotent.
/// </summary>
public sealed class RetainedPanelControllerGroup : IRetainedPanelController
{
private readonly IRetainedPanelController[] _controllers;
private bool _disposed;
public RetainedPanelControllerGroup(params IRetainedPanelController[] controllers)
{
ArgumentNullException.ThrowIfNull(controllers);
_controllers = (IRetainedPanelController[])controllers.Clone();
for (int i = 0; i < _controllers.Length; i++)
ArgumentNullException.ThrowIfNull(_controllers[i]);
}
public void OnShown()
{
if (_disposed) return;
for (int i = 0; i < _controllers.Length; i++)
_controllers[i].OnShown();
}
public void OnHidden()
{
if (_disposed) return;
for (int i = _controllers.Length - 1; i >= 0; i--)
_controllers[i].OnHidden();
}
public void OnDescendantFocusChanged(UiElement? focusedDescendant)
{
if (_disposed) return;
for (int i = 0; i < _controllers.Length; i++)
_controllers[i].OnDescendantFocusChanged(focusedDescendant);
}
public void Dispose()
{
if (_disposed) return;
_disposed = true;
for (int i = _controllers.Length - 1; i >= 0; i--)
_controllers[i].Dispose();
}
}