fix(ui): select retained items on mouse down

Port UIElement_ListBox's press-time selection ordering through the shared retained item-list contract. Inventory, loot, paperdoll, and physical shortcuts now update canonical selection before release or drag promotion, while target-mode consumption suppresses drag and release-time activation.

Co-authored-by: Codex <codex@openai.com>
This commit is contained in:
Erik 2026-07-24 06:17:31 +02:00
parent 2dd5cb80d2
commit 043ab10b3c
18 changed files with 292 additions and 62 deletions

View file

@ -275,6 +275,61 @@ public class DragDropSpineTests
Assert.True(used);
}
[Fact]
public void PhysicalItemPress_selectsBeforeRelease_thenClickActivates()
{
var (root, list, cell) = RootWithBoundSlot(0x5001u);
var selected = new List<uint>();
bool used = false;
list.PrimaryItemPressed = item =>
{
selected.Add(item);
return false;
};
cell.Clicked = () => used = true;
root.OnMouseDown(UiMouseButton.Left, 10, 10);
Assert.Equal(new uint[] { 0x5001u }, selected);
Assert.False(used);
root.OnMouseUp(UiMouseButton.Left, 10, 10);
Assert.True(used);
}
[Fact]
public void ConsumedPhysicalItemPress_suppressesCompletedActivation()
{
var (root, list, cell) = RootWithBoundSlot(0x5001u);
bool used = false;
bool doubleUsed = false;
list.PrimaryItemPressed = _ => true;
cell.Clicked = () => used = true;
cell.DoubleClicked = () => doubleUsed = true;
root.OnMouseDown(UiMouseButton.Left, 10, 10);
root.OnMouseUp(UiMouseButton.Left, 10, 10);
root.OnMouseDown(UiMouseButton.Left, 10, 10);
root.OnMouseUp(UiMouseButton.Left, 10, 10);
Assert.False(used);
Assert.False(doubleUsed);
}
[Fact]
public void ConsumedPhysicalItemPress_cannotPromoteIntoDrag()
{
var (root, list, _) = RootWithBoundSlot(0x5001u);
list.PrimaryItemPressed = _ => true;
root.OnMouseDown(UiMouseButton.Left, 10, 10);
root.OnMouseMove(20, 10);
Assert.Null(root.DragSource);
Assert.Null(root.DragPayload);
}
[Fact]
public void RightClick_withoutDrag_requestsItemListAppraisal()
{