fix(ui): tooltip wrap bound comes from the popup text child's authored P0x3D, and tooltip text left-aligns
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:
parent
1e8596a440
commit
d087b50aa3
4 changed files with 88 additions and 6 deletions
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue