fix(inventory): correct drag overlay priority

Keep the persistent selection indicator above retail's waiting mesh, use the normal green accept circle for backpack-grid placement, and reserve the green drop-in arrow for bag-column containers as ItemList_DragOver does.

Co-Authored-By: Codex <codex@openai.com>
This commit is contained in:
Erik 2026-07-13 09:21:22 +02:00
parent ace5880fed
commit 64a056e656
6 changed files with 63 additions and 19 deletions

View file

@ -65,6 +65,30 @@ on drag release/cancel:
hide m_elem_Icon_Ghosted
```
## Destination feedback and source overlay order
`UIElement_ItemList::ItemList_DragOver @ 0x004e3400` distinguishes an ordinary
slot insertion from dropping into a container:
```text
if target list is a container selector
and target cell is occupied by a container
and that container has an empty item slot:
target.SetDragAcceptState(0x10000046) # ItemSlot_DragOver_DropIn
# 0x060011F7 green arrow
else if target accepts an ordinary item-list placement:
target.SetDragAcceptState(0x10000041) # ItemSlot_DragOver_Accept
# 0x060011F9 green circle
else:
target.SetDragAcceptState(0x10000040) # 0x060011F8 reject
```
Therefore the backpack contents grid uses the green circle; the side-bag column
and main-pack container cell use the green drop-in arrow. The selected/open
indicators remain visible while `m_elem_Icon_Ghosted` is active, so the
procedural leaf draws the waiting mesh before those persistent indicators and
keeps drag-accept feedback topmost.
## Port mapping
- `IconComposer` caches the underlay-free composite separately and exposes
@ -85,6 +109,6 @@ on drag release/cancel:
- `DragDropSpineTests.InventoryDrag_ghostsSourceUntilRelease`
- `DragDropSpineTests.ShortcutDrag_doesNotGhostSource`
- `UiItemSlotTests.DefaultWaitingSprite_isRetailGhostMesh`
- `InventoryControllerTests.Empty_sprites_and_drop_feedback_are_applied_per_list_role`
- Existing `IconComposerTests.TwoStageWithEffect_copiesTilePixelBeforeUnderlay`
locks the two-stage composition order.