feat(ui): port retained widget foundations
This commit is contained in:
parent
44f9ec13d9
commit
d825572e31
44 changed files with 84813 additions and 292 deletions
|
|
@ -42,7 +42,42 @@ public class DatWidgetFactoryTests
|
|||
public void Type12_Text_MakesUiText()
|
||||
{
|
||||
var e = DatWidgetFactory.Create(new ElementInfo { Type = 12, Width = 100, Height = 40 }, NoTex, null);
|
||||
Assert.IsType<UiText>(e);
|
||||
var text = Assert.IsType<UiText>(e);
|
||||
Assert.False(text.Selectable);
|
||||
Assert.True(text.ClickThrough);
|
||||
Assert.False(text.AcceptsFocus);
|
||||
Assert.False(text.CapturesPointerDrag);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Type12_EditableProperty_MakesUiFieldInPlace()
|
||||
{
|
||||
var info = TextInfo(
|
||||
(0x16u, Bool(true)),
|
||||
(0x20u, Bool(true)),
|
||||
(0x27u, Bool(true)),
|
||||
(0x1Eu, Integer(80)));
|
||||
|
||||
var field = Assert.IsType<UiField>(DatWidgetFactory.Create(info, NoTex, null));
|
||||
|
||||
Assert.Equal(info.Id, field.ElementId);
|
||||
Assert.True(field.OneLine);
|
||||
Assert.True(field.Selectable);
|
||||
Assert.Equal(80, field.MaxCharacters);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Type12_SelectableProperty_MakesSelectableUiText()
|
||||
{
|
||||
var text = Assert.IsType<UiText>(DatWidgetFactory.Create(
|
||||
TextInfo((0x27u, Bool(true))),
|
||||
NoTex,
|
||||
null));
|
||||
|
||||
Assert.True(text.Selectable);
|
||||
Assert.False(text.ClickThrough);
|
||||
Assert.True(text.AcceptsFocus);
|
||||
Assert.True(text.CapturesPointerDrag);
|
||||
}
|
||||
|
||||
// ── Test 4: Rect + anchors set from ElementInfo ───────────────────────────
|
||||
|
|
@ -74,6 +109,46 @@ public class DatWidgetFactoryTests
|
|||
Assert.Equal(AnchorEdges.Left | AnchorEdges.Top | AnchorEdges.Right, e.Anchors);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ImportedDescendant_PreservesExactRawEdgePolicy()
|
||||
{
|
||||
var info = new ElementInfo
|
||||
{
|
||||
Type = 3,
|
||||
X = 10,
|
||||
Y = 20,
|
||||
Width = 30,
|
||||
Height = 40,
|
||||
Left = 4,
|
||||
Top = 3,
|
||||
Right = 1,
|
||||
Bottom = 0,
|
||||
OriginalParentWidth = 100,
|
||||
OriginalParentHeight = 200,
|
||||
HasOriginalParentSize = true,
|
||||
};
|
||||
|
||||
var element = DatWidgetFactory.Create(info, NoTex, null)!;
|
||||
var policy = Assert.IsType<UiLayoutPolicy>(element.LayoutPolicy);
|
||||
|
||||
Assert.Equal(4u, policy.LeftMode);
|
||||
Assert.Equal(3u, policy.TopMode);
|
||||
Assert.Equal(1u, policy.RightMode);
|
||||
Assert.Equal(0u, policy.BottomMode);
|
||||
Assert.Equal(new UiPixelRect(0, 0, 99, 199), policy.OriginalParent);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ImportedRoot_HasNoRawEdgePolicy()
|
||||
{
|
||||
var element = DatWidgetFactory.Create(
|
||||
new ElementInfo { Type = 3, Width = 100, Height = 200 },
|
||||
NoTex,
|
||||
null)!;
|
||||
|
||||
Assert.Null(element.LayoutPolicy);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Create_PropagatesStateCursors()
|
||||
{
|
||||
|
|
@ -339,6 +414,22 @@ public class DatWidgetFactoryTests
|
|||
Assert.Equal(gold, t.DefaultColor);
|
||||
}
|
||||
|
||||
private static ElementInfo TextInfo(params (uint Id, UiPropertyValue Value)[] properties)
|
||||
{
|
||||
var info = new ElementInfo { Id = 0x10000016u, Type = 12, Width = 100, Height = 20 };
|
||||
var state = new UiStateInfo { Id = UiStateInfo.DirectStateId };
|
||||
foreach (var property in properties)
|
||||
state.Properties.Values[property.Id] = property.Value;
|
||||
info.States[UiStateInfo.DirectStateId] = state;
|
||||
return info;
|
||||
}
|
||||
|
||||
private static UiPropertyValue Bool(bool value)
|
||||
=> new() { Kind = UiPropertyKind.Bool, BoolValue = value };
|
||||
|
||||
private static UiPropertyValue Integer(int value)
|
||||
=> new() { Kind = UiPropertyKind.Integer, IntegerValue = value };
|
||||
|
||||
/// <summary>
|
||||
/// When ElementInfo.FontColor is null (dat carried no 0x1B), DefaultColor must
|
||||
/// stay at white (Vector4.One) — the backward-compatible default.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue