feat(ui): port retail selected-stack quantity

Bind the authored stack count entry and horizontal slider to one Core split-quantity owner, preserve retail count-first naming and exact 1000-step rounding, refresh on stack changes, and consume the selected amount during merges. Conformance covers the production DAT fixture and retained pointer/focus paths.

Co-Authored-By: Codex <codex@openai.com>
This commit is contained in:
Erik 2026-07-11 10:07:25 +02:00
parent dc1649c493
commit a20e5c68c7
19 changed files with 595 additions and 51 deletions

View file

@ -505,12 +505,12 @@ overlay, while aliases stay neutral. Inventory now tries the pure named-retail
stack-merge legality/amount planner before ordinary insertion, sends `0x0054`,
broadcasts `FullMergingItem` immediately from the attempt owner, rekeys the toolbar
with existing-destination removal, and selects the target. The notice is not a
server confirmation despite its name. AP-101 still covers the absent shared split
entry/slider; until it lands, merge requests use the whole source stack before the
retail destination-capacity clamp. Release build is warning-free and 4,660 tests
pass. The compatible-stack live gate passed 2026-07-11; it exposed the expected
Wave 4.4/AP-101 gap that the selected strip still displays one instead of the
stack count and has no split slider. The inventory-button live gate remains pending.
server confirmation despite its name. Release build is warning-free and 4,660 tests
pass. The compatible-stack live gate passed 2026-07-11 and exposed the expected
Wave 4.4/AP-101 selected-stack gap. Wave 4.4a now implements that gap: exact count-first
name formatting, authored entry/slider media, one Core split-quantity owner, live
stack-size refresh, and selected-source merge amount. The inventory-button and
selected-stack visual gates remain pending.
### 4.4 Finish toolbar controls
@ -518,12 +518,24 @@ stack count and has no split slider. The inventory-button live gate remains pend
Use, and Examine actions; dispatch panel buttons through the window registry,
ghosting unavailable panels rather than constructing placeholders.
- [ ] Make open/closed states event-driven from `RetailWindowManager`.
- [ ] Complete selected-object item mana, formatted stack count, stack entry and
split slider; port `RecvNotice_UpdateItemMana`, `RecvNotice_SplitStack`, and
`HandleSelectionChanged` precedence.
- [ ] Complete selected-object item mana and port `RecvNotice_UpdateItemMana`.
- [x] Complete formatted stack count, stack entry and split slider, the applicable
`RecvNotice_SplitStack` activation behavior, and `HandleSelectionChanged` stack
precedence. Vendor-specific initial quantity remains naturally dormant until a
vendor panel owns an active vendor id.
- [ ] Replace the PWD-only health gate with the exact attackable/player/pet policy.
- [ ] Add item-mana query/cancel state, health query cancellation, and one shared
split-quantity owner for the entry, slider, and item drag payload.
- [ ] Add item-mana query/cancel state and health query cancellation.
- [x] Add one shared split-quantity owner for the entry, slider, and selected-source
item-holder merge payload.
**Wave 4.4a implementation (2026-07-11):** static cdb against the matching retail
binary pinned stack-name `"%d %hs"`, numeric entry `"%d"`, and the slider's exact
1000-step truncation formula. `StackSplitQuantityState` is the single Core owner;
`SelectedObjectController` binds authored elements `0x100001A3/A4`, and
`InventoryController` consumes the value only when the dragged source is selected.
The horizontal scrollbar remains the generic retained `UiScrollbar` in scalar mode,
using the DAT track/thumb rather than panel-local drawing. The warning-free App Release
build and 4,683-test suite are green; the live visual gate follows.
**Wave 4.1 implementation (2026-07-11):** bare `1..9` now use slots 0..8,
Ctrl+`1..9` selects them, Alt+`5..9` uses slots 13..17, and `0` creates a