fix(ui): tooltip wrap bound comes from the popup text child's authored P0x3D, and tooltip text left-aligns
All checks were successful
CI / linux-portable (push) Successful in 3m29s
CI / windows-gate (push) Successful in 6m14s
CI / release (push) Successful in 2m10s

Owner screenshots vs retail at the CA5 re-check caught both:

Wrap width: the popup skins' shared TEXT CHILD (0x10000396) authors
P0x3D=256 on all four skins — live-DAT probed, now pinned by an
installed-DAT test. Retail's InqSizewMargins UITS_MAX_WIDTH reads the
text element's 0x3D BEFORE the display-width fallback, so retail wraps
tooltip text at 256px; our measure pass used the display width because
TS-85's 'zero elements author P0x3D' sweep had only covered hover
TARGETS, never the popup skins. ApplyTooltipText now measures and
re-wraps at the text child's authored bound, falling back to the display
width only when none is authored.

Alignment: tooltip text rendered centered where retail hugs the left
edge. The skin authors no justification; retail's unauthored default is
Left, our importer's ElementInfo default is Center — the same
wrong-default class as #410's VJustify finding, now recorded there as the
horizontal sibling. Point-fixed in the presenter exactly as the chat
transcript already does; the client-wide default flip stays #410's scope.

The two-pass sizing test now models the real skin (max width on the text
child) and asserts left alignment. Full hermetic suite 15,332 passed / 0
failed; the new live-DAT pin passes against the installed DATs.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-08-24 18:29:03 +02:00
parent 1e8596a440
commit d087b50aa3
4 changed files with 88 additions and 6 deletions

View file

@ -643,7 +643,26 @@ public sealed class RetailTooltipPresenter : IDisposable
// than the clamped popup stayed one clipped line.
float lineHeight = text.DatFont?.LineHeight ?? text.Font?.LineHeight ?? 14f;
float measureWrapWidth = MathF.Max(1f, _host.EffectiveCanvasSize.X);
// CA5 re-check corrections (2026-08-24, owner screenshots vs retail):
// (a) The popup skins' TEXT CHILD (0x10000396) authors P0x3D=256 —
// live-DAT probed on all four skins. InqSizewMargins'
// UITS_MAX_WIDTH branch reads GetAttribute_Int(0x3D) on the TEXT
// element BEFORE the display-width fallback, so retail wraps
// tooltip text at 256px, not the screen width. (TS-85's "zero
// elements author P0x3D" sweep only covered hover TARGETS, never
// the popup skins' text children.)
// (b) Tooltip text is LEFT-aligned: the text child authors no
// justification and retail's unauthored default is Left, while
// our importer's ElementInfo default is Center — the same
// wrong-default class as #410's VJustify finding. Point-fixed
// here (the chat transcript does the same); the client-wide
// default remains #410's scope.
text.Centered = false;
text.RightAligned = false;
float measureWrapWidth = text.AuthoredResizeMaxWidth is { } authoredMaxTextWidth
? MathF.Max(1f, authoredMaxTextWidth)
: MathF.Max(1f, _host.EffectiveCanvasSize.X);
var measured = UiText.WrapWords(tooltipText, measure, measureWrapWidth);
float measuredWidth = measured.Count == 0 ? 0f : measured.Max(measure);
float measuredHeight = measured.Count * lineHeight;
@ -673,6 +692,8 @@ public sealed class RetailTooltipPresenter : IDisposable
// measured extents.
float textFinalWidth = MathF.Max(
1f, authoredTextWidth + (requestedWidth - authoredRootWidth));
if (text.AuthoredResizeMaxWidth is { } textMaxWidth)
textFinalWidth = MathF.Min(textFinalWidth, textMaxWidth);
float textFinalHeight =
authoredTextHeight + (requestedHeight - authoredRootHeight);