fix(ui): match retail spell bar controls

Place favorite-bar arrows by their authored sides, import rollover and pressed media through the shared scrollbar, and preserve manual offsets across passive refreshes. Carry the mixed-parent DAT anchor chain to a fixed 18-cell favorite viewport so overflow controls and the Cast button remain inside the retail-sized combat frame.

Co-authored-by: Codex <codex@openai.com>
This commit is contained in:
Erik 2026-07-23 07:01:01 +02:00
parent 02c29e67c8
commit 0134122c28
17 changed files with 424 additions and 59 deletions

View file

@ -230,24 +230,32 @@ public class DatWidgetFactoryTests
const uint IncrementId = 0x10000072u;
const uint DecrementSprite = 0x06004CDCu;
const uint IncrementSprite = 0x06004CDEu;
const uint DecrementRollover = 0x06004CDDu;
const uint IncrementRollover = 0x06004CDFu;
var decrement = new ElementInfo
{
Id = DecrementId, Type = 1u, Width = 23f, Height = 36f,
Id = DecrementId, Type = 1u, X = 63f, Width = 23f, Height = 36f,
};
decrement.States[UiStateInfo.DirectStateId] = new UiStateInfo
{
Id = UiStateInfo.DirectStateId,
Image = new UiImageMedia(DecrementSprite, 1),
};
decrement.StateMedia["Normal"] = (DecrementSprite, 1);
decrement.StateMedia["Normal_rollover"] = (DecrementRollover, 1);
decrement.StateMedia["Normal_pressed"] = (DecrementSprite, 1);
var increment = new ElementInfo
{
Id = IncrementId, Type = 1u, Width = 23f, Height = 36f,
Id = IncrementId, Type = 1u, X = 0f, Width = 23f, Height = 36f,
};
increment.States[UiStateInfo.DirectStateId] = new UiStateInfo
{
Id = UiStateInfo.DirectStateId,
Image = new UiImageMedia(IncrementSprite, 1),
};
increment.StateMedia["Normal"] = (IncrementSprite, 1);
increment.StateMedia["Normal_rollover"] = (IncrementRollover, 1);
increment.StateMedia["Normal_pressed"] = (IncrementSprite, 1);
var info = new ElementInfo
{
Type = 11u,
@ -271,8 +279,12 @@ public class DatWidgetFactoryTests
Assert.True(bar.HideWhenDisabled);
Assert.Equal(23f, bar.DecrementButtonExtent);
Assert.Equal(23f, bar.IncrementButtonExtent);
Assert.Equal(DecrementSprite, bar.UpSprite);
Assert.Equal(IncrementSprite, bar.DownSprite);
Assert.Equal(IncrementSprite, bar.UpSprite);
Assert.Equal(IncrementRollover, bar.UpRolloverSprite);
Assert.Equal(IncrementSprite, bar.UpPressedSprite);
Assert.Equal(DecrementSprite, bar.DownSprite);
Assert.Equal(DecrementRollover, bar.DownRolloverSprite);
Assert.Equal(DecrementSprite, bar.DownPressedSprite);
Assert.Equal(0u, bar.TrackSprite);
Assert.Equal(0u, bar.ThumbSprite);
}