fix #385: Options dropdowns — white centered text + size-to-content popup

User gate report (Campaign OP happy-testing round, 2026-08-13): every
Config-tab dropdown drew its text gold + left-aligned and its popup a
fixed 6 rows regardless of item count. All three were unmeasured styling
divergences — the authored data (new probe menuprobe3, live DAT) says:

- button label child 0x10000355: fontColor white, hJustify=Center
- row template 0x1000035A: fontColor white, hJustify=Center
- popup ListBox 0x10000358: edge-docked L=T=R=B=1, the authored condition
  arming retail UIElement_Menu::RecalculatePopupSize @0x0046caf0 —
  popup resizes to the ListBox's summed content height, uncapped
  (0x0046e5f4..0046e66c via ResizeScrollableArea's 0x32 broadcast)

UiMenu gains three opt-in properties (ButtonTextCentered,
ItemTextCentered, PopupSizeToContent) plus retail Open @0x0046cc42's
empty-list gate; chat + vendor keep the class defaults, so their shipped
behavior is untouched. ConfigOptionsPageController.ApplyMenuChrome wires
all four corrections for the 8 Config menus with the probe citation.

The same probe found vendor's authored popup ListBox is ALSO docked while
our vendor dropdown ships G5's fixed 6-row window — filed as #386 +
register row AD-88 (UNCLEAR: the G5 retail screenshot and the decomp
mechanism conflict) instead of silently reworking a user-gated surface.

The "resolution change resizes the window" observation from the same
report is #374's designed windowed-mode behavior (display-mode switching
is #376/#377) — no change.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-08-13 08:51:57 +02:00
parent 028920420d
commit a9b6435f55
8 changed files with 422 additions and 9 deletions

View file

@ -564,6 +564,49 @@ public sealed class ConfigOptionsPageControllerTests
Assert.Equal(1, fakeBindings.AudioSaves[^1].SoundFeatures);
}
/// <summary>User gate report 2026-08-13: every Config dropdown drew its
/// text gold + left-aligned and its popup a fixed 6 rows. The corrected
/// values are MEASURED authored facts (menuprobe3,
/// <see cref="OptionsPanelLiveMountProbeTests.ProbeMenuPopupSizingAndTextStyle"/>):
/// label child 0x10000355 + row template 0x1000035A are white +
/// hJustify=Center, and popup ListBox 0x10000358 is edge-docked
/// (L=T=R=B=1), arming retail's RecalculatePopupSize size-to-content
/// path. Asserted on ALL 8 menus — one shared ApplyMenuChrome must not
/// quietly skip any.</summary>
[Fact]
public void MenuRows_All8_UseTheAuthoredTextStyleAndSizeToContent()
{
ImportedLayout layout = FixtureLoader.LoadOptionsPanelHost();
OptionsPanelController controller = OptionsPanelController.Bind(
layout,
new OptionsPanelController.Callbacks(
Toggle: () => { },
RequestExitToCharacterSelection: () => { },
ExitGame: () => { },
UseMouseTurningSettings: () => { },
DisplaySystemMessage: _ => { }))!;
var fakeBindings = new FakeBindings();
Assert.True(ConfigOptionsPageController.Bind(
layout,
controller.ConfigPage,
MakeTemplateResolver(),
(_, _) => null,
fakeBindings.ToBindings(),
resolveSprite: _ => (1u, 8, 8)));
var listBox = Assert.IsType<UiTemplateListBox>(
layout.FindElement(ConfigOptionsPageController.ListBoxElementId));
List<UiMenu> menus = CollectMenus(listBox);
Assert.Equal(8, menus.Count);
foreach (UiMenu menu in menus)
{
Assert.Equal(System.Numerics.Vector4.One, menu.TextColor);
Assert.True(menu.ButtonTextCentered);
Assert.True(menu.ItemTextCentered);
Assert.True(menu.PopupSizeToContent);
}
}
[Fact]
public void MenuRow_Resolution_IsStringBacked_AndWritesThroughDisplayBindings()
{