fix(studio): Character window polish — XP-label left-align, smaller icons/tighter rows, selection bar full-width + top/bottom
Item 1 — XP-next label left-alignment: the "XP for next level:" label (child of the XP meter) was not left-aligned with the "Total Experience (XP):" caption above it. Fixed by computing the meter's x-offset at bind time and setting xpLabel.Left = TotalXpLabel.Left - meter.Left, plus Centered=false/RightAligned=false. Item 2 — icon size / row height: attribute-row icons reduced from 24px → 16px, row height from 30px → 22px. The 9 rows are now compact and tightly packed matching the retail reference (2026-06-26). Row font (18px dat) still fits the 22px row. Item 3 — selection bar: UiClickablePanel gains UseSelectionBars (default false) and SelectionBarHeight (default 3px). When UseSelectionBars=true and BackgroundSprite is set, OnDraw draws the sprite as a thin horizontal bar at the TOP edge (y=0) and BOTTOM edge (y=H-barH) of the row — full panel width, no left/right end-caps, UV-tiled horizontally (u1=Width/nativeW). Falls back to the base UiPanel fill (BackgroundColor or full-stretch sprite) when UseSelectionBars=false. AddRow sets UseSelectionBars=true on all attribute/vital rows so the selection highlight shows as retail-style bars. Sprite 0x06001397 is 300×32 px; at 3px bar height the UV crop shows the sprite's top 3px (top bar) and bottom 3px (bottom bar). Temp pre-select for screenshot verification was added then removed before this commit. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
ad4ed51d6b
commit
4b5961ec04
2 changed files with 76 additions and 12 deletions
|
|
@ -140,11 +140,12 @@ public static class CharacterStatController
|
|||
private static readonly Vector4 HighlightBg = new(1f, 0.75f, 0.2f, 0.25f);
|
||||
|
||||
// ── Row layout constants ─────────────────────────────────────────────────
|
||||
// RowHeight reduced from 44 to 30px to match retail's tighter attribute list.
|
||||
// The larger row font (0x40000001, MaxCharHeight=18) fits in 30px with 6px total vertical
|
||||
// padding (3px above/below). Retail spec (2026-06-26 ref): "rows tighter, text ≈ icon height".
|
||||
private const float RowHeight = 30f;
|
||||
private const float IconSize = 24f;
|
||||
// RowHeight 22px + IconSize 16px: retail spec (2026-06-26) says icons ~icon-height
|
||||
// and rows tighter. 16px icon fits inside 22px row with 3px vertical padding each side.
|
||||
// The larger row font (0x40000001, MaxCharHeight=18) is clipped to the 22px height which
|
||||
// gives a tight-but-readable line. Retail spec (2026-06-26 ref): "rows tighter, text ≈ icon height".
|
||||
private const float RowHeight = 22f;
|
||||
private const float IconSize = 16f;
|
||||
private const float RowPadX = 4f;
|
||||
private const float IconGap = 6f;
|
||||
|
||||
|
|
@ -242,7 +243,22 @@ public static class CharacterStatController
|
|||
{
|
||||
if (datFont is not null) xpLabel.DatFont = datFont;
|
||||
xpLabel.ClickThrough = true;
|
||||
xpLabel.Centered = false; // left-align (retail: aligns with Total XP label above)
|
||||
xpLabel.RightAligned = false;
|
||||
xpLabel.Padding = 0f; // avoid scroll clip — meter bar is ~13px tall
|
||||
|
||||
// Item 1: align the XP-next label's left edge to match the TotalXpLabel's
|
||||
// absolute left edge. The XP-next label is a child of the meter (local coords),
|
||||
// so its Left = TotalXpLabel.Left − meter.Left. This accounts for the meter's
|
||||
// horizontal offset within the panel (the meter starts to the right of the
|
||||
// "Total Experience (XP):" caption row). Source: retail spec §State 1 (the
|
||||
// "XP for next level:" caption left-aligns with "Total Experience (XP):" above).
|
||||
if (layout.FindElement(TotalXpLabelId) is { } totalXpLbl)
|
||||
{
|
||||
float xpNextLeft = totalXpLbl.Left - meter.Left;
|
||||
xpLabel.Left = xpNextLeft >= 0f ? xpNextLeft : 0f;
|
||||
}
|
||||
|
||||
xpLabel.LinesProvider = static () => new[] { new UiText.Line("XP for next level:", Body) };
|
||||
}
|
||||
if (layout.FindElement(XpNextValueId) is UiText xpValue)
|
||||
|
|
@ -605,13 +621,14 @@ public static class CharacterStatController
|
|||
{
|
||||
var row = new UiClickablePanel
|
||||
{
|
||||
Left = left,
|
||||
Top = top,
|
||||
Width = width,
|
||||
Height = height,
|
||||
BackgroundColor = Vector4.Zero, // transparent until selected
|
||||
BorderColor = Vector4.Zero,
|
||||
Anchors = AnchorEdges.Left | AnchorEdges.Top,
|
||||
Left = left,
|
||||
Top = top,
|
||||
Width = width,
|
||||
Height = height,
|
||||
BackgroundColor = Vector4.Zero, // transparent until selected
|
||||
BorderColor = Vector4.Zero,
|
||||
UseSelectionBars = true, // Item 3: draw sprite as top+bottom bars, not full stretch
|
||||
Anchors = AnchorEdges.Left | AnchorEdges.Top,
|
||||
};
|
||||
|
||||
float iconY = (height - IconSize) * 0.5f;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue