feat(ui): complete retail item drop branches
Give retained buttons a reusable item-drop seam, wire the toolbar backpack target, and port retail stack-merge legality, capacity clamping, wire dispatch, destination selection, and immediate shortcut rekey notice. Record the live ACE merge gate and keep split quantity under AP-101. Co-Authored-By: Codex <codex@openai.com>
This commit is contained in:
parent
3281e0acb4
commit
dc1649c493
19 changed files with 479 additions and 28 deletions
|
|
@ -45,6 +45,19 @@ public sealed class UiButton : UiElement, IUiGlobalTimeListener, IUiDatStateful
|
|||
/// <summary>Optional click handler. Wired by the controller (e.g. chat Submit, ToggleMaximize).</summary>
|
||||
public Action? OnClick { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Optional item-drop target callbacks. Retail uses ordinary buttons as drop surfaces
|
||||
/// in a few panels (notably gmToolbarUI's inventory button), so this belongs on the
|
||||
/// retained button rather than in UiRoot or a panel-specific hit-test workaround.
|
||||
/// </summary>
|
||||
public Func<ItemDragPayload, ItemDragAcceptance>? OnItemDragOver { get; set; }
|
||||
public Action<ItemDragPayload>? OnItemDrop { get; set; }
|
||||
public uint ItemDragAcceptSprite { get; set; }
|
||||
public uint ItemDragRejectSprite { get; set; }
|
||||
private ItemDragAcceptance _itemDragAcceptance;
|
||||
|
||||
internal ItemDragAcceptance ItemDragAcceptanceForTest => _itemDragAcceptance;
|
||||
|
||||
/// <summary>The dat element id from <see cref="ElementInfo.Id"/>.</summary>
|
||||
public uint ElementId => _info.Id;
|
||||
|
||||
|
|
@ -224,6 +237,19 @@ public sealed class UiButton : UiElement, IUiGlobalTimeListener, IUiDatStateful
|
|||
float ty = (Height - lf.LineHeight) * 0.5f;
|
||||
ctx.DrawStringDat(lf, label, tx, ty, LabelColor);
|
||||
}
|
||||
|
||||
uint dragSprite = _itemDragAcceptance switch
|
||||
{
|
||||
ItemDragAcceptance.Accept => ItemDragAcceptSprite,
|
||||
ItemDragAcceptance.Reject => ItemDragRejectSprite,
|
||||
_ => 0u,
|
||||
};
|
||||
if (dragSprite != 0)
|
||||
{
|
||||
var (tex, _, _) = _resolve(dragSprite);
|
||||
if (tex != 0)
|
||||
ctx.DrawSprite(tex, 0f, 0f, Width, Height, 0f, 0f, 1f, 1f, Vector4.One);
|
||||
}
|
||||
}
|
||||
|
||||
public override bool OnEvent(in UiEvent e)
|
||||
|
|
@ -276,6 +302,19 @@ public sealed class UiButton : UiElement, IUiGlobalTimeListener, IUiDatStateful
|
|||
}
|
||||
OnClick?.Invoke();
|
||||
return OnClick is not null;
|
||||
case UiEventType.DragEnter:
|
||||
_itemDragAcceptance = e.Payload is ItemDragPayload payload
|
||||
? OnItemDragOver?.Invoke(payload) ?? ItemDragAcceptance.None
|
||||
: ItemDragAcceptance.None;
|
||||
return OnItemDragOver is not null;
|
||||
case UiEventType.DragOver:
|
||||
_itemDragAcceptance = ItemDragAcceptance.None;
|
||||
return OnItemDragOver is not null;
|
||||
case UiEventType.DropReleased:
|
||||
_itemDragAcceptance = ItemDragAcceptance.None;
|
||||
if (e.Payload is ItemDragPayload dropped)
|
||||
OnItemDrop?.Invoke(dropped);
|
||||
return OnItemDrop is not null;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue