acdream/src/AcDream.App/UI/Layout
Erik ad4ed51d6b feat(ui): importer Fix 5 — build meter text children; drop character XP injection hacks
LayoutImporter.BuildWidget gains a UiMeter-specific branch after the
ConsumesDatChildren gate: Type-3 slice containers (already consumed by
DatWidgetFactory.BuildMeter to extract sprite ids) are skipped, but all
other children (Type-12 UIElement_Text overlays) are built normally,
registered in byId, and attached as UiElement children of the meter.

This fixes the XP meter (0x10000236): its two Type-12 children
  0x10000237 "XP for next level:" label
  0x10000238 XP-to-next-level value
are now real UiText widgets in the tree, findable via FindElement.

CharacterStatController.Bind now uses FindElement + LinesProvider binding
instead of injecting runtime AddChild nodes. The two previously-injected
UiText overlays are removed; the controller binds Padding=0, ClickThrough,
RightAligned on the dat-origin widgets instead.

New constants XpNextLabelId + XpNextValueId replace the old comment block.

TAB GROUPS (SKIPPED — documented): UiText.ConsumesDatChildren flipping is
NOT safe globally (risks chat/vitals) and the page-visibility pass in
CharacterStatController depends on tab group Children.Count==0. Tab sprite
injection onto layout.Root stays and is explicitly commented as deliberate.

VITALS SAFE: health/stamina/mana meters have only Type-3 children → new
loop finds nothing → zero UiElement children added → byte-identical render.
VitalsController.BindMeter AddChild(number) pattern unchanged.

Tests: 3 new LayoutImporterTests (slice-only, Fix-5 text children,
vitals regression guard) + 3 CharacterStatControllerTests (label bound,
value bound, missing children no-throw). 715 tests pass.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 11:35:19 +02:00
..
CharacterController.cs fix(studio): Character pilot — CREATE m_pMainText (it's a runtime element, not static) 2026-06-25 19:01:09 +02:00
CharacterSheet.cs feat(studio): Attributes tab Pass 2 — click-to-select (highlight + footer B + raise triangles) + tab states 2026-06-25 21:48:16 +02:00
CharacterStatController.cs feat(ui): importer Fix 5 — build meter text children; drop character XP injection hacks 2026-06-26 11:35:19 +02:00
ChatWindowController.cs feat(D.2b): UiField (Type 3) — editable input as a generic field; remove the stray Type-12 input placeholder (widget-generalization Task 6) 2026-06-16 17:48:51 +02:00
DatWidgetFactory.cs feat(ui): importer Fix C — per-element dat FontDid resolver (studio path); character level uses its retail font 2026-06-26 10:30:13 +02:00
ElementReader.cs feat(ui): importer carries dat FontColor (0x1B) onto text widgets; character colors from dat where present 2026-06-26 10:15:55 +02:00
InventoryController.cs fix(D.2b): gapless insert on optimistic move — stop the inventory reshuffle 2026-06-22 20:29:22 +02:00
ItemListCellTemplate.cs fix(ui): D.2b empty-slot art — container cells use inner slot bg, not the selected-container triangle 2026-06-22 12:45:36 +02:00
LayoutImporter.cs feat(ui): importer Fix 5 — build meter text children; drop character XP injection hacks 2026-06-26 11:35:19 +02:00
PaperdollController.cs fix(D.2b): Slice 2 — retail-exact doll pose, camera + heading (visual gate) 2026-06-25 13:16:27 +02:00
SelectedObjectController.cs fix(D.5.3a): selected-object meter visual-gate fixes (name, gate, flash, magenta) 2026-06-20 09:37:15 +02:00
ToolbarController.cs refactor(core): D.5.3/B.2 — move ShortcutStore to Core.Items (decouple Load from the wire type) 2026-06-20 15:50:33 +02:00
UiDatElement.cs fix(D.2b): Character window — tab bar sprites on root + footer State-A all 3 lines 2026-06-25 22:59:44 +02:00
VitalsController.cs feat(D.2b): vitals numbers as UiText (widget-generalization Task 8) 2026-06-16 18:52:42 +02:00