feat(D.2b): importer renders Type-12-with-sprites + carries DefaultState
Task G1: two gaps blocked chat window static sprite elements from rendering. Change 1 — DatWidgetFactory: only skip Type-12 elements that have no own state media (pure style prototypes). A Type-12 element that carries sprites (e.g. a chat Send button whose derived Type-0 element inherited Type 12 from its base prototype) now renders as a UiDatElement. Change 2 — ElementInfo: add DefaultStateName field (string, default ""). Change 3 — LayoutImporter.ToInfo: read ElementDesc.DefaultState.ToString() into DefaultStateName; normalize Undef/Undefined/0 sentinels to "". Change 4 — ElementReader.Merge: inherit DefaultStateName (derived wins if non-empty, else base). Change 5 — UiDatElement ctor: initialize ActiveState to DefaultStateName when set; else "Normal" when a Normal-state sprite is present (retail's implicit default for buttons/tabs); else "" (DirectState). This makes the Send button, max/min button, and numbered tabs render their default sprite without requiring explicit state assignment at runtime. Vitals neutrality: all vitals chrome/grip elements carry DirectState-only sprites with no "Normal" named state and DefaultStateName="" (Undef in dat), so their ActiveState stays "" and their existing conformance tests are unaffected. Vitals text labels (Type 0→12 via Merge, no StateMedia) are still skipped by the refined Type-12 guard (StateMedia.Count==0). Tests: 4 new tests (2 in DatWidgetFactoryTests, 3 in UiDatElementTests). All 386 pass; 387 total (1 pre-existing skip). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
c2170ab18f
commit
6e6339b026
6 changed files with 126 additions and 19 deletions
|
|
@ -33,4 +33,58 @@ public class UiDatElementTests
|
|||
var e = new UiDatElement(info, _ => (0, 0, 0)) { ActiveState = "NoSuchState" };
|
||||
Assert.Equal(0x06000005u, e.ActiveMedia().File);
|
||||
}
|
||||
|
||||
// ── G1 tests: DefaultStateName + "Normal" implicit default ───────────────
|
||||
|
||||
/// <summary>
|
||||
/// Task G1 change 5: when an element has no DefaultStateName but does have a "Normal"
|
||||
/// state sprite, the ctor should default ActiveState to "Normal" so the element
|
||||
/// renders its normal-state sprite without requiring explicit state assignment.
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void UiDatElement_DefaultsActiveStateToNormal_WhenNormalPresent()
|
||||
{
|
||||
var info = new ElementInfo();
|
||||
info.StateMedia["Normal"] = (0x0000AAAAu, 1);
|
||||
info.StateMedia["Hover"] = (0x0000BBBBu, 1);
|
||||
|
||||
var e = new UiDatElement(info, _ => (0, 0, 0));
|
||||
|
||||
// Should have defaulted to "Normal" state.
|
||||
Assert.Equal(0x0000AAAAu, e.ActiveMedia().File);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Task G1 change 5: when DefaultStateName is set (e.g. "Minimized"),
|
||||
/// it takes priority over the "Normal" implicit default.
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void UiDatElement_DefaultsActiveStateToDefaultStateName_WhenSet()
|
||||
{
|
||||
var info = new ElementInfo { DefaultStateName = "Minimized" };
|
||||
info.StateMedia["Minimized"] = (0x0000BBBBu, 1);
|
||||
info.StateMedia["Maximized"] = (0x0000CCCCu, 1);
|
||||
info.StateMedia["Normal"] = (0x0000DDDDu, 1);
|
||||
|
||||
var e = new UiDatElement(info, _ => (0, 0, 0));
|
||||
|
||||
// DefaultStateName "Minimized" wins over "Normal" implicit default.
|
||||
Assert.Equal(0x0000BBBBu, e.ActiveMedia().File);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Task G1 change 5: elements with only a DirectState sprite and no "Normal" state
|
||||
/// should still default to "" (DirectState) — no regression for chrome/grip elements.
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void UiDatElement_NoDefaultStateName_NoNormal_DefaultsToDirectState()
|
||||
{
|
||||
var info = new ElementInfo();
|
||||
info.StateMedia[""] = (0x06007777u, 1); // DirectState only (e.g. vitals chrome corner)
|
||||
|
||||
var e = new UiDatElement(info, _ => (0, 0, 0));
|
||||
|
||||
// No DefaultStateName, no "Normal" state → ActiveState stays "" (DirectState).
|
||||
Assert.Equal(0x06007777u, e.ActiveMedia().File);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue