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>
43 lines
1.7 KiB
C#
43 lines
1.7 KiB
C#
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);
|
|
}
|
|
}
|