fix(ui): #145 — importer honors ZLevel so the backdrop sits behind panels
The factory mapped ZOrder from ReadOrder only, so the gmInventoryUI full-window backdrop (0x100001D0, ReadOrder 4) painted over the nested panels (ReadOrder 1-3). Wire ElementDesc.ZLevel through ElementInfo / ToInfo / Merge and fold it into ZOrder = ReadOrder - ZLevel*10000 (higher ZLevel = further back, ReadOrder the within-layer tiebreaker). Vitals (all ZLevel 0) are unchanged; chat (ZLevel 900) + toolbar (1,2) shift to their dat layering — verify visually. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
d81ea11a31
commit
45a5cc5bb6
4 changed files with 56 additions and 2 deletions
43
tests/AcDream.App.Tests/UI/DatWidgetFactoryZOrderTests.cs
Normal file
43
tests/AcDream.App.Tests/UI/DatWidgetFactoryZOrderTests.cs
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
using AcDream.App.UI.Layout;
|
||||
|
||||
namespace AcDream.App.Tests.UI;
|
||||
|
||||
public class DatWidgetFactoryZOrderTests
|
||||
{
|
||||
private static (uint, int, int) NoChrome(uint id) => (0u, 0, 0);
|
||||
|
||||
[Fact]
|
||||
public void ZOrder_HigherZLevel_DrawsBehind()
|
||||
{
|
||||
// The gmInventoryUI backdrop (ZLevel 100, ReadOrder 4) must draw BEHIND the panels
|
||||
// (ZLevel 0, ReadOrder 1): lower ZOrder = drawn first = behind. Before the fix, ZOrder
|
||||
// came from ReadOrder only, so the backdrop (4) painted over the panels (1).
|
||||
var backdrop = new ElementInfo { Type = 3, ReadOrder = 4, ZLevel = 100 };
|
||||
var panel = new ElementInfo { Type = 3, ReadOrder = 1, ZLevel = 0 };
|
||||
|
||||
var b = DatWidgetFactory.Create(backdrop, NoChrome, null);
|
||||
var p = DatWidgetFactory.Create(panel, NoChrome, null);
|
||||
|
||||
Assert.True(b!.ZOrder < p!.ZOrder, $"backdrop ZOrder {b.ZOrder} should be < panel ZOrder {p.ZOrder}");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ZOrder_AllZeroZLevel_EqualsReadOrder()
|
||||
{
|
||||
// Regression guard: a vitals-style window (every element ZLevel 0) keeps ZOrder == ReadOrder.
|
||||
var e = new ElementInfo { Type = 3, ReadOrder = 5, ZLevel = 0 };
|
||||
var w = DatWidgetFactory.Create(e, NoChrome, null);
|
||||
Assert.Equal(5, w!.ZOrder);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ZOrder_SameZLevel_OrderedByReadOrder()
|
||||
{
|
||||
// Within one ZLevel, ReadOrder is the tiebreaker (higher ReadOrder draws on top).
|
||||
var lo = new ElementInfo { Type = 3, ReadOrder = 2, ZLevel = 2 };
|
||||
var hi = new ElementInfo { Type = 3, ReadOrder = 7, ZLevel = 2 };
|
||||
var l = DatWidgetFactory.Create(lo, NoChrome, null);
|
||||
var h = DatWidgetFactory.Create(hi, NoChrome, null);
|
||||
Assert.True(l!.ZOrder < h!.ZOrder);
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue