refactor(ui): own retained controller lifetimes

This commit is contained in:
Erik 2026-07-10 23:35:26 +02:00
parent 921c388e2c
commit 5d9e98c118
21 changed files with 373 additions and 35 deletions

View file

@ -12,7 +12,7 @@ namespace AcDream.App.UI.Layout;
/// 175480 / 173620). Slice 1: equip slots only — no 3D doll viewport (that's Slice 2).
/// Unwield is handled by InventoryController (dragging an equipped item onto the pack grid).
/// </summary>
public sealed class PaperdollController : IItemListDragHandler
public sealed class PaperdollController : IItemListDragHandler, IRetainedPanelController
{
// ── Slots-toggle public surface ───────────────────────────────────────────────────────────────
/// <summary>
@ -82,6 +82,7 @@ public sealed class PaperdollController : IItemListDragHandler
private readonly PaperdollViewState _viewState = new();
private readonly List<UiItemList> _armorSlots = new();
private UiElement? _dollViewport; // UiViewport wired in Slice 3; UiElement? keeps this task independent
private bool _disposed;
private PaperdollController(
ImportedLayout layout, ClientObjectTable objects, Func<uint> playerGuid,
@ -244,6 +245,8 @@ public sealed class PaperdollController : IItemListDragHandler
/// <summary>Detach event handlers (idempotent).</summary>
public void Dispose()
{
if (_disposed) return;
_disposed = true;
_objects.ObjectAdded -= OnObjectChanged;
_objects.ObjectMoved -= OnObjectMoved;
_objects.ObjectRemoved -= OnObjectChanged;