acdream/tests/AcDream.App.Tests/UI/Layout
Erik cbab79d70c fix(chat): the unseen-text indicator is state-driven, as retail drives it
User report: "the Unseen indicator shows, but not blinking. I thought it was
blinking in retail." They were right, and CT-C1 had the mechanism wrong.

The dat settles it. Element 0x1000048C authors:

    1:Normal      media=13/6     <- SIX image frames: the flash
    3:Normal_pressed  media=2/1
    13:Ghosted    media=0/0      <- the authored DEFAULT, draws nothing

and retail's own click handler ends in SetState(0xD) — Ghosted. So the
indicator is driven by authored STATE, never by visibility, and the blinking is
a multi-frame media list in the DATA rather than anything in code.

CT-C1 toggled Visible instead. That looks almost right — the thing appears and
disappears at the correct moments — and can never blink, because visibility has
no frames. Now switched to Normal/Ghosted, which is both the retail mechanism
and the thing the animation hangs off.

STILL NOT BLINKING, and honestly so: our importer keeps ONE image per state
(ElementInfo.StateMedia is a single file), so multi-frame media is not modelled
anywhere in the UI layer. That is a capability rather than a tweak — the same
shape as the tagged-runs work in Group A — and the state machinery here is
correct either way, so it gains the animation for free once that lands. Recorded
in the method's own doc rather than left as a mystery.

The test fixture gained the element: it was absent, so the whole binding path
had never been exercised by any test — which is why a visibility-based
implementation passed everything. The test now asserts the state TRANSITIONS
(Ghosted at rest, Normal when a line arrives while scrolled up, Ghosted again on
returning to the bottom), not merely that something was bound.

Two notes on reading the decomp here, since both nearly misled me. Binary
Ninja's field names in this function are demonstrably shifted — it assigns a
UIElement* into m_fCurrentOpacity, a float — so the element's ROLE was
confirmed from its id and its click handler, not from a name. And the blink was
found by measuring the dat, not by reading code, because there is no blink code
to read.

Solution builds clean; full hermetic gate green.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 10:23:15 +02:00
..
fixtures fix(ui): restore retail vitals and window interactions 2026-08-20 13:26:35 +02:00
AppraisalUiControllerTests.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
CharacterControllerTests.cs feat(render): Campaign V slice V11 commit 1 - delete ImGui, Studio, and the DevTools frontend 2026-07-28 23:56:04 +02:00
CharacterCreationAppearancePageSwatchColorTests.cs fix(chargen): Campaign CC gate round 1 re-test 2 — R3-5/R3-6 color-key swatch/gradient textures 2026-08-16 17:20:31 +02:00
CharacterCreationLiveDatTests.cs test: separate non-hermetic release lanes 2026-08-18 10:49:22 +02:00
CharacterCreationUiControllerTests.cs fix(ui): systemic escape normalization at the string source 2026-08-17 13:26:25 +02:00
CharacterLayoutImportProbe.cs test: make prerequisite lanes fail honestly 2026-08-18 12:09:41 +02:00
CharacterManagementLiveDatTests.cs test: separate non-hermetic release lanes 2026-08-18 10:49:22 +02:00
CharacterManagementUiControllerTests.cs feat(chargen): Campaign CC slice CC7 — end-to-end create flow + connected checklist 2026-08-16 02:35:21 +02:00
CharacterOptionsPageControllerTests.cs feat(ui): vitals — Side By Side Vitals swaps retail's two vitals windows 2026-08-17 10:40:49 +02:00
CharacterScreensFixedCanvasArbiterTests.cs fix(chargen): Campaign CC CC7 review fix round — F1-F9 — REVIEW-CLOSED 2026-08-16 03:13:02 +02:00
CharacterSheetProviderTests.cs feat(player): port retail augmentation stat chain 2026-07-31 08:08:23 +02:00
CharacterStatControllerTests.cs fix(ui): refresh live skill rows 2026-07-31 08:22:46 +02:00
ChargenColorSpotComposerTests.cs fix(chargen): Campaign CC gate round 1 re-test 2 — R3-5/R3-6 color-key swatch/gradient textures 2026-08-16 17:20:31 +02:00
ChatIndicatorButtonLiveMountProbeTests.cs test: make prerequisite lanes fail honestly 2026-08-18 12:09:41 +02:00
ChatLayoutConformanceTests.cs fix(ui): restore retail vitals and window interactions 2026-08-20 13:26:35 +02:00
ChatOptionsDatDefaultsTests.cs test: make prerequisite lanes fail honestly 2026-08-18 12:09:41 +02:00
ChatOptionsPageControllerTests.cs test: replace campaign labels with behavior names 2026-08-18 12:25:00 +02:00
ChatTagClickTests.cs feat(chat): CT-A5 — clicking a speaker's name opens a tell 2026-08-21 07:34:58 +02:00
ChatTranscriptRendererTests.cs feat(chat): retail text style — two-plane glyph outlines, authored SpewBox/chat styles 2026-08-10 19:28:34 +02:00
ChatTranscriptRunsTests.cs feat(chat): CT-C2 Escape leaves the entry; CT-C3 the timestamp is grey 2026-08-21 08:28:45 +02:00
ChatWindowControllerTests.cs fix(chat): the unseen-text indicator is state-driven, as retail drives it 2026-08-21 10:23:15 +02:00
CombatLayoutConformanceTests.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
CombatUiControllerTests.cs fix: powerbar mode captions - jump 'Height' + combat 'Power'/'Accuracy' 2026-08-14 08:14:14 +02:00
ConfigOptionsPageControllerTests.cs fix(ui): Options panel Config tab content escapes the window frame — stale viewport anchor capture, not a missing clip 2026-08-17 00:24:33 +02:00
CreatureAppraisalRowsTests.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
DatRichTextTests.cs fix(ui): systemic escape normalization at the string source 2026-08-17 13:26:25 +02:00
DatStringEscapeSweepTests.cs test: separate non-hermetic release lanes 2026-08-18 10:49:22 +02:00
DatStringResolverTemplateTests.cs build: make release restore reproducible 2026-08-18 10:29:00 +02:00
DatWidgetFactoryFontResolveTests.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
DatWidgetFactoryTests.cs fix(ui): systemic escape normalization at the string source 2026-08-17 13:26:25 +02:00
DormantDatWidgetConformanceTests.cs test: remove final campaign labels 2026-08-18 13:50:31 +02:00
EffectsUiControllerTests.cs fix(ui): effects list stayed pinned at its authored height in a taller window 2026-08-20 21:00:16 +02:00
ElementReaderTests.cs feat(ui): #409 — client-wide retail tooltip system 2026-08-16 20:03:24 +02:00
ExternalContainerControllerTests.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
FaPanelSlotProbeTests.cs test: make prerequisite lanes fail honestly 2026-08-18 12:09:41 +02:00
FixtureLoader.cs feat(ui): Map/House panel — slices 2+3, panel shell + Map tab 2026-08-17 02:04:19 +02:00
FloatingChatLayoutConformanceTests.cs fix(chat): CH6a/b rework — grip media, retail window-id model, floaty fixture 2026-08-10 13:09:32 +02:00
FloatingChatWindowControllerTests.cs feat(chat): Campaign CH slice CH6b — floating chat windows 1-4 2026-08-10 12:10:20 +02:00
IndicatorBarControllerTests.cs fix(movement): invalidate burden on enchantment changes 2026-07-31 10:16:27 +02:00
IndicatorDetailPanelControllerTests.cs fix(ui): restore effect detail scrolling 2026-07-17 13:28:18 +02:00
InventoryControllerTests.cs fix(ui): restore retail vitals and window interactions 2026-08-20 13:26:35 +02:00
InventoryFrameImportProbe.cs test: make prerequisite lanes fail honestly 2026-08-18 12:09:41 +02:00
ItemAppraisalTextFormatterTests.cs test: make prerequisite lanes fail honestly 2026-08-18 12:09:41 +02:00
ItemCooldownUiControllerTests.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
ItemListCellTemplateTests.cs test: make prerequisite lanes fail honestly 2026-08-18 12:09:41 +02:00
JumpPowerbarControllerTests.cs feat(ui): port retail jump power bar 2026-07-13 10:22:12 +02:00
JumpPowerbarLayoutConformanceTests.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
KeyboardConfigControllerTests.cs fix #394 #395 #396: OP8 re-gate round — caption font, retail key names, capture dialog 2026-08-14 13:45:55 +02:00
KeyboardConfigLiveMountProbeTests.cs test: make prerequisite lanes fail honestly 2026-08-18 12:09:41 +02:00
LayoutConformanceTests.cs feat(ui): port retained widget foundations 2026-07-10 17:55:41 +02:00
LayoutImporterMediaBearingChildSweepTests.cs test: separate non-hermetic release lanes 2026-08-18 10:49:22 +02:00
LayoutImporterTests.cs feat(ui): #409 — client-wide retail tooltip system 2026-08-16 20:03:24 +02:00
MapHousePanelControllerTests.cs fix(ui): morning gate — map town markers: green rollover highlight + the authored map-note tooltip skin/font 2026-08-17 09:22:46 +02:00
MapHousePanelLiveDatMountTests.cs test: separate non-hermetic release lanes 2026-08-18 10:49:22 +02:00
MapHousePanelSlotProbeTests.cs test: make prerequisite lanes fail honestly 2026-08-18 12:09:41 +02:00
MapNoteLiveDatTests.cs test: separate non-hermetic release lanes 2026-08-18 10:49:22 +02:00
MapPageControllerTests.cs fix(ui): Map tab player/house icon resolution — build the button-swallowed icons from the panel-slot resolve tree, detached from the per-frame layout pass 2026-08-17 05:58:17 +02:00
MouseTurningSettingsMacroTests.cs feat(ui): Campaign OP slice OP3 — Options panel shell, open paths, Gameplay tab 2026-08-11 02:14:40 +02:00
OptionPageModelTests.cs fix(ui,runtime): OP4 re-review residuals R1-R4 (coordinator pass) — OP4 CLOSED 2026-08-11 06:36:14 +02:00
OptionsPanelControllerTests.cs fix #381: Options-panel footer needs an opaque backing field 2026-08-11 23:01:43 +02:00
OptionsPanelLayoutConformanceTests.cs test: remove final campaign labels 2026-08-18 13:50:31 +02:00
OptionsPanelLiveMountProbeTests.cs test: make prerequisite lanes fail honestly 2026-08-18 12:09:41 +02:00
PaperdollClickMapTests.cs test: make prerequisite lanes fail honestly 2026-08-18 12:09:41 +02:00
PaperdollControllerTests.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
PaperdollSlotBackgroundTests.cs test: make prerequisite lanes fail honestly 2026-08-18 12:09:41 +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
PowerbarLayoutProbeTests.cs test: make prerequisite lanes fail honestly 2026-08-18 12:09:41 +02:00
RadarControllerTests.cs fix(ui): restore retail vitals and window interactions 2026-08-20 13:26:35 +02:00
RadarLayoutConformanceTests.cs feat(ui): port retail radar and compass 2026-07-10 16:14:37 +02:00
RadarSnapshotProviderTests.cs refactor(app): key live projections by runtime identity 2026-07-25 21:50:58 +02:00
RetailDialogFactoryTests.cs fix(ui,net): Campaign LA gate round 2 — char-select exit confirmation, authored row justify, world name 2026-08-15 11:50:45 +02:00
RetailFixtureConformanceTests.cs feat(ui): port retail appraisal panel 2026-07-23 11:34:08 +02:00
RetailFpsControllerTests.cs fix #213: complete suicide and framerate presentation 2026-07-13 15:50:47 +02:00
RetailKeyNamesTests.cs fix #394 #395 #396: OP8 re-gate round — caption font, retail key names, capture dialog 2026-08-14 13:45:55 +02:00
RetailLayoutFixtureGenerator.cs test: make prerequisite lanes fail honestly 2026-08-18 12:09:41 +02:00
RetailPanelUiControllerTests.cs fix(ui): OP3 review fixes — byte-verified Magic chat lines, Gameplay/OptionPage shape, mid-air tri-state, shared geometry 2026-08-11 03:05:27 +02:00
RetailStringEscapesTests.cs fix(ui): systemic escape normalization at the string source 2026-08-17 13:26:25 +02:00
RetailTooltipPresenterTests.cs fix(ui): morning gate — world tooltips ride retail's mouse-idle dwell, not the found edge 2026-08-17 08:49:11 +02:00
RetailWindowFrameTests.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
RowTemplateResolverTests.cs feat(ui): FA4 -- fellowship page fully live 2026-08-12 04:40:53 +02:00
SelectedObjectControllerTests.cs test: remove final campaign labels 2026-08-18 13:50:31 +02:00
SocialFellowshipPageControllerTests.cs fix: social panel completion batch (user gate 2026-08-13, "fix all") 2026-08-13 19:30:51 +02:00
SocialPanelControllerTests.cs fix: social panel completion batch (user gate 2026-08-13, "fix all") 2026-08-13 19:30:51 +02:00
SocialPanelLiveMountProbeTests.cs test: make prerequisite lanes fail honestly 2026-08-18 12:09:41 +02:00
SpellbookRowStyleTests.cs test: make prerequisite lanes fail honestly 2026-08-18 12:09:41 +02:00
SpellbookWindowControllerTests.cs feat: regen buffs, wand aura, spellbook assess, indicator press flash 2026-08-20 20:38:28 +02:00
SpellcastingUiControllerTests.cs fix(ui): night-round review — F3/F4/F7 cast-button tooltip strings 2026-08-17 04:39:17 +02:00
SpellExamineComponentTemplateFactoryTests.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
ToolbarControllerTests.cs fix(ui): restore retail vitals and window interactions 2026-08-20 13:26:35 +02:00
ToolbarInputControllerTests.cs feat(ui): complete retail quick-slot input 2026-07-11 08:59:49 +02:00
TooltipLiveDatTests.cs test: separate non-hermetic release lanes 2026-08-18 10:49:22 +02:00
UiButtonCorpusSweepTests.cs test: separate non-hermetic release lanes 2026-08-18 10:49:22 +02:00
UiDatElementTests.cs fix #416 #415: the retail button state/media machine — roster hover highlight clears; probe wait verbs bind without an artifact dir 2026-08-17 16:25:36 +02:00
UiPropertyBagTests.cs feat(chat): retail text style — two-plane glyph outlines, authored SpewBox/chat styles 2026-08-10 19:28:34 +02:00
UiTextLayoutCacheTests.cs test(app): put every strict-zero site on the probe (#250) 2026-07-29 03:49:13 +02:00
UiViewportFactoryTests.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
VendorUiControllerTests.cs fix: retail text and golden-string tests must not follow the machine's locale 2026-08-19 19:56:09 +02:00
VitalsBindingTests.cs feat(ui): port retained widget foundations 2026-07-10 17:55:41 +02:00
VitalsDetailToggleTests.cs fix(ui): gate — no void frames around the login wormhole; vitals icons centered 2026-08-17 12:30:51 +02:00
VitalsSideBySideControllerTests.cs feat(ui): vitals — Side By Side Vitals swaps retail's two vitals windows 2026-08-17 10:40:49 +02:00
VividTargetIndicatorLayoutTests.cs feat(selection): port retail offscreen target indicator 2026-07-18 07:41:12 +02:00