acdream/tests/AcDream.App.Tests/UI
Erik b7dc91a053 feat(ui): D.2b item interaction + retail cursors + live character sheet
Lands the codex-worktree D.2b stream plus the extraction the 2026-07-02
UI architecture review mandated before commit:

- ItemInteractionController: single owner of double-click use/equip/
  container-open, targeted-use mode (health kits), drag-out drop;
  toolbar shortcut drags don't drop the real item. ItemEquipRules for
  multi-slot (coat) coverage via equip masks.
- Cursor phase: CursorFeedbackController (semantic priority chain:
  drag > resize > window-move > target-mode > text) + RetailCursorCatalog
  (enums 0x27/0x28/0x29, hotspot 14,14; ClientUISystem::UpdateCursorState
  0x00564630) resolved through the portal EnumIDMap chain by
  RetailCursorResolver; RetailCursorManager applies dat cursor art to the
  OS cursor. Register row AP-72 covers the OS standard-cursor fallback.
- Character window goes live: CharacterSheetProvider owns sheet assembly,
  XP-curve/raise-cost math and the raise flow — extracted out of
  GameWindow per Code Structure Rule 1 instead of committing the ~430-line
  feature body there. Optimistic XP/credit debits go through eventful
  store APIs (new ClientObjectTable.UpdateInt64Property +
  LocalPlayerState.DebitIntProperty/DebitInt64Property) instead of raw
  property-dictionary writes; register row AP-73 covers the still-missing
  raise ledger (#163).
- RetailWindowFrame: the shared nine-slice window mount recipe; the
  character window uses it, remaining windows migrate via #164.
- Status-bar buttons toggle inventory/character windows; retail row-major
  backpack ordering; WorldSession.SendUseWithTarget + raise/train sends.

GameWindow shrinks 14,214 -> 13,877 lines despite the new features; the
sheet/raise logic is unit-tested in CharacterSheetProviderTests instead
of trapped in the god object. Build green; full suite 3,286 tests pass.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 09:18:43 +02:00
..
Layout feat(ui): D.2b item interaction + retail cursors + live character sheet 2026-07-03 09:18:43 +02:00
ControlsIniTests.cs feat(D.2b): controls.ini stylesheet loader + apply title color 2026-06-14 17:31:55 +02:00
CursorFeedbackControllerTests.cs feat(ui): D.2b item interaction + retail cursors + live character sheet 2026-07-03 09:18:43 +02:00
DatWidgetFactoryZOrderTests.cs fix(ui): #145 — importer honors ZLevel so the backdrop sits behind panels 2026-06-21 07:22:26 +02:00
DragDropSpineTests.cs feat(ui): D.5.3/B.2 — spine: drag-lift hook + ghost snapshot (full opacity) + drop-on-hit-only 2026-06-20 15:22:27 +02:00
IconComposerTests.cs fix(D.5.2): effect tint = per-pixel tile copy (surface ReplaceColor overload) 2026-06-18 10:21:33 +02:00
ItemInteractionControllerTests.cs feat(ui): D.2b item interaction + retail cursors + live character sheet 2026-07-03 09:18:43 +02:00
LayoutImporterMountTests.cs feat(ui): D.2b-B — sub-window mount (inheritor attaches base subtree) 2026-06-20 22:36:20 +02:00
MarkupDocumentTests.cs feat(D.2b): retail 3-slice vital bars + headless mockup verifier 2026-06-14 21:40:11 +02:00
RetailCursorCatalogTests.cs feat(ui): D.2b item interaction + retail cursors + live character sheet 2026-07-03 09:18:43 +02:00
RetailUiAutomationProbeTests.cs feat(ui): D.2b item interaction + retail cursors + live character sheet 2026-07-03 09:18:43 +02:00
RetailUiInteractionFlowTests.cs feat(ui): D.2b item interaction + retail cursors + live character sheet 2026-07-03 09:18:43 +02:00
UiButtonTests.cs feat(D.2b): UiButton (Type 1) — Send + Max/Min as generic buttons (widget-generalization Task 3) 2026-06-16 17:07:58 +02:00
UiCollapsibleFrameTests.cs feat(ui): D.2b — toolbar collapse-to-one-row (bottom-edge snap resize hides/shows row 2) 2026-06-20 18:33:35 +02:00
UiDatFontTests.cs feat(D.2b): retail dat-font (Font 0x40000000) for vitals numbers 2026-06-14 23:02:35 +02:00
UiFieldTests.cs feat(D.2b): UiField (Type 3) — editable input as a generic field; remove the stray Type-12 input placeholder (widget-generalization Task 6) 2026-06-16 17:48:51 +02:00
UiItemListGridTests.cs feat(ui): D.2b item interaction + retail cursors + live character sheet 2026-07-03 09:18:43 +02:00
UiItemListScrollTests.cs fix(ui): D.2b inventory finish — grid cells exempt from the anchor pass 2026-06-21 20:51:08 +02:00
UiItemListTests.cs feat(ui): D.2b empty-slot art — UiItemList.CellEmptySprite stamps cells 2026-06-22 11:03:19 +02:00
UiItemSlotTests.cs feat(ui): D.2b item interaction + retail cursors + live character sheet 2026-07-03 09:18:43 +02:00
UiMenuTests.cs fix(D.2b): UiMenu — controller owns Selected (review fix for Task 4) 2026-06-16 17:27:30 +02:00
UiMeterTests.cs feat(D.2b): UiMeter vital bar + fill-geometry tests 2026-06-14 16:38:07 +02:00
UiMeterVerticalTests.cs feat(ui): D.2b-B — UiMeter vertical fill (burden bar, retail m_eDirection 2/4) 2026-06-21 08:58:37 +02:00
UiNineSlicePanelTests.cs feat(D.2b): UiNineSlicePanel — 8-piece retail window frame + geometry test 2026-06-14 16:36:11 +02:00
UiRootInputTests.cs feat(ui): D.2b item interaction + retail cursors + live character sheet 2026-07-03 09:18:43 +02:00
UiScrollablePanelTests.cs feat(ui): D.2b item interaction + retail cursors + live character sheet 2026-07-03 09:18:43 +02:00
UiScrollableTests.cs feat(D.2b): UiScrollable — pixel scroll model (UIElement_Scrollable port) 2026-06-15 22:19:29 +02:00
UiScrollbarTests.cs feat(D.2b): UiScrollbar (Type 11) — promote the generic chat scrollbar (widget-generalization Task 2) 2026-06-16 17:02:49 +02:00
UiTextDatFontTests.cs feat(D.2b): UiText (Type 12) -- generic text + Type-12 flip; transcript factory-built (widget-generalization Task 5) 2026-06-16 17:39:02 +02:00
UiTextTests.cs feat(ui): importer carries dat justification (0x14/0x15) onto text widgets; drop character footer-title height hack 2026-06-26 10:05:36 +02:00