feat(ui): importer carries dat justification (0x14/0x15) onto text widgets; drop character footer-title height hack
LayoutImporter.ReadState now reads Properties[0x14] (HorizontalJustification, EnumBaseProperty: 0=Left, 1=Center, 3/5=Right) and Properties[0x15] (VerticalJustification: 2=Top, 4=Bottom; else Center) into two new ElementInfo fields HJustify/VJustify. Merge propagates them with the same non-default-wins rule used for FontDid. DatWidgetFactory.BuildText applies the resolved justify at build time: HJustify=Center sets Centered=true, HJustify=Right sets RightAligned=true, VJustify=Top/Bottom sets VerticalJustify. Controllers that FindElement and set those properties afterward continue to override - backward-compat preserved. UiText gains VerticalJustify (Top/Center/Bottom, default Center). The Centered and RightAligned single-line paths call UiText.VOffset() for the Y coordinate, so VJustify.Top renders text at y=Padding rather than the fixed (H-lh)/2 center. CharacterStatController: footer title (0x1000024E, H=55 dat box) previously used Height=18 + Anchors=None to prevent center-vertical overlap with line-1/2. Diagnostic confirmed dat says HJustify=Center, VJustify=Center. The hack is replaced with one minimal explicit override: VerticalJustify=Top on the already-Centered element. Text now renders at top of the 55px box natively. Centered=false and RightAligned=false hand-sets removed where dat supplies them. Dat justify values (studio diagnostic, 2026-06-26): 0x1000024E footer title: HJustify=Center, VJustify=Center 0x10000235/0x10000243/0x10000245 value fields: HJustify=Right header name/heritage/pk/level: HJustify=Center +13 tests: ElementReader Merge propagation; DatWidgetFactory BuildText justify application + controller-override backward-compat; UiText VOffset. 696 passed, 0 failed. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
8f222f7506
commit
41430420b3
8 changed files with 328 additions and 18 deletions
|
|
@ -228,4 +228,75 @@ public class DatWidgetFactoryTests
|
|||
Assert.NotEqual(OverlayFile, m.FrontRight);
|
||||
Assert.NotEqual(OverlayFile, m.FrontTile);
|
||||
}
|
||||
|
||||
// ── Justification build-time application (new for importer Fix A) ────────
|
||||
|
||||
/// <summary>
|
||||
/// A Type-12 text element with HJustify=Center (the default) must produce a
|
||||
/// UiText with Centered=true and RightAligned=false at build time.
|
||||
/// This proves BuildText applies the dat's HJustify at construction without a
|
||||
/// controller binding step.
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void BuildText_HJustifyCenter_SetsCentered()
|
||||
{
|
||||
var info = new ElementInfo { Type = 12, Width = 100, Height = 20, HJustify = HJustify.Center };
|
||||
var t = Assert.IsType<UiText>(DatWidgetFactory.Create(info, NoTex, null));
|
||||
Assert.True(t.Centered);
|
||||
Assert.False(t.RightAligned);
|
||||
Assert.Equal(VJustify.Center, t.VerticalJustify);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// A Type-12 text element with HJustify=Right must produce a UiText with
|
||||
/// Centered=false and RightAligned=true at build time.
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void BuildText_HJustifyRight_SetsRightAligned()
|
||||
{
|
||||
var info = new ElementInfo { Type = 12, Width = 100, Height = 20, HJustify = HJustify.Right };
|
||||
var t = Assert.IsType<UiText>(DatWidgetFactory.Create(info, NoTex, null));
|
||||
Assert.False(t.Centered);
|
||||
Assert.True(t.RightAligned);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// A Type-12 text element with HJustify=Left must produce a UiText with
|
||||
/// Centered=false and RightAligned=false at build time.
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void BuildText_HJustifyLeft_SetsNeitherCenteredNorRight()
|
||||
{
|
||||
var info = new ElementInfo { Type = 12, Width = 100, Height = 20, HJustify = HJustify.Left };
|
||||
var t = Assert.IsType<UiText>(DatWidgetFactory.Create(info, NoTex, null));
|
||||
Assert.False(t.Centered);
|
||||
Assert.False(t.RightAligned);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// A Type-12 text element with VJustify=Top must produce a UiText with
|
||||
/// VerticalJustify=Top at build time.
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void BuildText_VJustifyTop_SetsVerticalJustifyTop()
|
||||
{
|
||||
var info = new ElementInfo { Type = 12, Width = 100, Height = 55, VJustify = VJustify.Top };
|
||||
var t = Assert.IsType<UiText>(DatWidgetFactory.Create(info, NoTex, null));
|
||||
Assert.Equal(VJustify.Top, t.VerticalJustify);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// A controller override: build-time sets Centered=true (HJustify=Center), then
|
||||
/// a controller sets Centered=false afterward. The controller's override wins —
|
||||
/// this is the backward-compatibility guarantee.
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void BuildText_ControllerOverrideWinsAfterBuild()
|
||||
{
|
||||
var info = new ElementInfo { Type = 12, Width = 100, Height = 20, HJustify = HJustify.Center };
|
||||
var t = Assert.IsType<UiText>(DatWidgetFactory.Create(info, NoTex, null));
|
||||
Assert.True(t.Centered); // build-time value
|
||||
t.Centered = false; // controller override
|
||||
Assert.False(t.Centered); // override wins
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue