acdream/tests/AcDream.App.Tests/UI/Layout
Erik defbde1f86 feat(studio): Attributes tab Pass 2 — click-to-select (highlight + footer B + raise triangles) + tab states
- UiClickablePanel: new UiPanel subclass with OnClick action + HandlesClick=true
  so row clicks survive whole-window-Draggable ancestor frames.

- CharacterStatController overhaul (Pass 2):
  - Tab bar button states: SetButtonStateRecursive walks each tab group container
    (0x10000228/229/538) setting UiButton.ActiveState="Open" (Attributes) or
    "Closed" (Skills/Titles) via UIStateId enum string names from DatReaderWriter.
  - Row click: 9 rows become UiClickablePanel; sel[] mutable box drives footer/highlight.
  - Toggle: clicking the same row deselects (→ footer State A); click a new row
    updates title="Attrib: value", line-1 label="Experience To Raise:", line-1
    value=cost, line-2="Unassigned Experience:" in both states.
  - Row highlight: BackgroundColor=HighlightBg (semi-translucent gold) on selected row.
  - Raise buttons (0x10000246 ×1 + 0x100005EB ×10): hidden initially; shown on
    selection with ActiveState="Normal" (affordable) or "Ghosted" (cost=0 or unaffordable).
    CollectButtonsById tree-walk finds ALL copies of the button across tab-page mounts
    (not just the last-registered _byId copy) so all instances are controlled.

- CharacterSheet: AttributeRaiseCosts long[] (Strength…Mana raise costs in retail
  display order; cost=0 → max/disabled row demos the Ghosted button state).
- SampleData.SampleCharacter: fills AttributeRaiseCosts[9] — Strength/Quickness=0
  (maxed), Focus@10→110 matching the retail screenshot (spec §4).

- 35 new tests (total 673 pass) covering: row click→footer B title/line1/line2,
  toggle deselect→footer A, switch row, highlight set/clear, raise button
  hidden/Normal/Ghosted/deselect, tab Open/Closed states, GetRaiseCost helper,
  GetRowName helper, SampleData fixture sanity.

Console.WriteLine("[CharacterStat] Row click: index=N → selected=N (Name)") fires
on every click for the user's live verification in the studio.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-25 21:48:16 +02:00
..
fixtures test(D.2b): chat golden fixture + resolved-Type conformance (widget-generalization Task 1) 2026-06-16 16:55:51 +02:00
CharacterControllerTests.cs fix(studio): Character pilot — CREATE m_pMainText (it's a runtime element, not static) 2026-06-25 19:01:09 +02:00
CharacterStatControllerTests.cs feat(studio): Attributes tab Pass 2 — click-to-select (highlight + footer B + raise triangles) + tab states 2026-06-25 21:48:16 +02:00
ChatLayoutConformanceTests.cs test(D.2b): chat golden fixture + resolved-Type conformance (widget-generalization Task 1) 2026-06-16 16:55:51 +02:00
ChatLayoutFixtureGenerator.cs test(D.2b): chat golden fixture + resolved-Type conformance (widget-generalization Task 1) 2026-06-16 16:55:51 +02:00
ChatWindowControllerTests.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
DatWidgetFactoryTests.cs feat(D.5.3a): selected-object meter — Health bar + name on the action bar 2026-06-18 22:47:24 +02:00
ElementReaderTests.cs fix(D.2b): correct edge-anchor mapping (RightEdge==1=stretch) + enable vitals horizontal resize 2026-06-15 17:05:04 +02:00
FixtureLoader.cs test(D.2b): chat golden fixture + resolved-Type conformance (widget-generalization Task 1) 2026-06-16 16:55:51 +02:00
InventoryControllerTests.cs test(D.2b): close drag-drop spec-review coverage gaps 2026-06-22 20:03:24 +02:00
InventoryFrameImportProbe.cs test(D.2b): probe — paperdoll equip slots resolve to UiItemList 2026-06-22 21:52:54 +02:00
ItemListCellTemplateTests.cs fix(ui): D.2b empty-slot art — container cells use inner slot bg, not the selected-container triangle 2026-06-22 12:45:36 +02:00
LayoutConformanceTests.cs fix(D.2b): do NOT register Type 3 -> UiField (review fix for Task 6) 2026-06-16 17:53:56 +02:00
LayoutImporterTests.cs fix(D.5.1): toolbar movable + chrome-grab + peace-only indicator + no prototype square 2026-06-17 13:03:07 +02:00
PaperdollControllerTests.cs fix(D.2b): paperdoll empty slots show a visible frame (not transparent) 2026-06-23 00:02:11 +02:00
PaperdollToggleTests.cs feat(D.2b): Slice 2 — paperdoll armor/non-armor partition + Slots toggle state 2026-06-23 08:57:50 +02:00
SelectedObjectControllerTests.cs fix(D.5.3a): selected-object meter visual-gate fixes (name, gate, flash, magenta) 2026-06-20 09:37:15 +02:00
ToolbarControllerTests.cs refactor(core): D.5.3/B.2 — move ShortcutStore to Core.Items (decouple Load from the wire type) 2026-06-20 15:50:33 +02:00
UiDatElementTests.cs feat(D.2b): importer renders Type-12-with-sprites + carries DefaultState 2026-06-15 22:54:37 +02:00
UiViewportFactoryTests.cs feat(D.2b): Slice 2 — UiViewport widget (dat Type 0xD) + IUiViewportRenderer seam 2026-06-23 09:03:42 +02:00
VitalsBindingTests.cs feat(D.2b): vitals numbers as UiText (widget-generalization Task 8) 2026-06-16 18:52:42 +02:00