using System.Numerics; namespace AcDream.App.UI; /// /// Per-event payload delivered to . /// Mirrors the retail AC client's 24-byte event struct that is passed to /// every widget's vtable slot +0x128 (OnEvent(int* event)). /// /// Layout from decompiled chunk_004A0000.c paperdoll handler /// FUN_004A5FA0: /// /// int source_id; // param_2[0] — e.g. 0x100001d6 (drag source) /// void* target_widget; // param_2[1] /// int event_type; // param_2[2] — see UiEventType /// int data0; // param_2[3] /// int data1; // param_2[4] — typically x in local coords /// int data2; // param_2[5] — typically y /// int data3; // param_2[6] /// /// public readonly record struct UiEvent( uint SourceId, UiElement? Target, int Type, // see int Data0 = 0, int Data1 = 0, int Data2 = 0, int Data3 = 0, object? Payload = null); /// /// Retail AC UI event-type constants. Each value matches the decompiled /// switch-case in widgets' OnEvent handlers (e.g. 0x01 click, 0x15 drag /// begin, 0x3E drop released). Win32 WM_* numbers are reused for raw /// button/key/mouse events (0x200 = WM_MOUSEMOVE etc.) — this matches /// retail where internal event codes collide deliberately with WM_*. /// /// Evidence from decompile: /// - 0x01 click — chunk_00470000.c ~11140, chunk_004C0000.c ~9270 /// - 0x05/0x06 hover — chunk_00460000.c ~6253 /// - 0x07 tooltip — chunk_00460000.c ~6253 (delayed via /// Device::RegisterTimerEvent(7, widget, delayMs)) /// - 0x0A scroll — chunk_00470000.c ~11210 /// - 0x0E right-click— chunk_004A0000.c ~2674 /// - 0x15 drag begin — chunk_004A0000.c ~2707 /// - 0x1C drag-over — chunk_004A0000.c ~2723 /// - 0x21 drag-enter — chunk_004A0000.c ~2714 /// - 0x3E drop-released — chunk_004A0000.c ~2754 /// public static class UiEventType { public const int Click = 0x01; public const int HoverEnter = 0x05; public const int HoverLeave = 0x06; public const int Tooltip = 0x07; public const int DoubleClick = 0x08; public const int Scroll = 0x0A; public const int RightClick = 0x0E; public const int DragBegin = 0x15; public const int DragOver = 0x1C; public const int DragEnter = 0x21; public const int FocusLost = 0x28; public const int FocusGained = 0x29; public const int DropReleased = 0x3E; // Raw Win32-style event numbers (retail uses WM_* verbatim for internal dispatch). public const int MouseMove = 0x200; public const int MouseDown = 0x201; // left button down public const int MouseUp = 0x202; // left button up public const int DoubleClickLeft = 0x203; public const int RightDown = 0x204; public const int RightUp = 0x205; public const int MiddleDown = 0x207; public const int MiddleUp = 0x208; public const int KeyDown = 0x100; public const int KeyUp = 0x101; public const int Char = 0x102; } /// /// Mouse button enum matching retail's 1/2/3 encoding. /// public enum UiMouseButton { Left = 1, Right = 2, Middle = 3, }