fix(ui): unify target-mode primary clicks

This commit is contained in:
Erik 2026-07-11 01:36:43 +02:00
parent b7e7ca9ee2
commit eb6229394a
12 changed files with 176 additions and 25 deletions

View file

@ -371,16 +371,28 @@ controller tests. Full suite green before launch: 4,575 passed, 5 skipped.
### 3.3 Add one item primary-click chokepoint
- [ ] Define a controller-level activation router: target-mode acquisition first,
- [x] Define a controller-level activation router: target-mode acquisition first,
then window-specific fallback (select/open/use).
- [ ] Return a typed result (`NotActive`, `ConsumedSuccess`, `ConsumedRejected`) so
- [x] Return a typed result (`NotActive`, `ConsumedSuccess`, `ConsumedRejected`) so
both valid and rejected target attempts are consumed and cannot accidentally fall
through to selection, double-click use, or container opening.
- [ ] Route toolbar, inventory grid, bags, paperdoll slots/body, main pack and world
- [x] Route toolbar, inventory grid, bags, paperdoll slots/body, main pack and world
objects through it. Widgets expose events; they do not depend on game controllers.
- [ ] Add end-to-end tests for health-kit target use on self, inventory item, worn
- [x] Add end-to-end tests for health-kit target use on self, inventory item, worn
item, and world entity, including invalid-target behavior.
**Implementation (2026-07-11):** `ItemInteractionController.OfferPrimaryClick`
is the sole typed target-mode offer. `ConsumedRejected` is intentionally terminal:
invalid clicks clear retail target mode but never fall through to selection,
container opening, or ordinary activation. Inventory contents/bags/main pack,
paperdoll equipment/body, toolbar items, radar blips, and world picks all use the
router; retained widgets remain controller-agnostic event sources. End-to-end
retained tests pin self targeting and rejected inventory/worn targets without
selection drift, while controller tests pin valid world/self and invalid target
results. The consumed target is retained for retail's 500 ms double-click window,
so the second Click/DoubleClick pair cannot reactivate or equip the rejected
object after target mode clears. Issue #197 and AP-107 are retired.
### 3.4 Complete retail cursor precedence and catalog
- [ ] Port every reachable branch of `ClientUISystem::UpdateCursorState`, not only