CppUtils/Utils/Event.h

303 lines
6.3 KiB
C
Raw Permalink Normal View History

2025-06-05 10:06:43 +08:00
#pragma once
#include "defines.h"
#include "List.h"
#include <functional>
#include <string>
enum class MouseButtons
{
None = 0x00000000,
Left = 0x00100000,
Right = 0x00200000,
Middle = 0x00400000,
XButton1 = 0x00800000,
XButton2 = 0x01000000
};
enum class Keys
{
None = 0x00000000,
LButton = 0x00000001,
RButton = 0x00000002,
Cancel = 0x00000003,
MButton = 0x00000004,
XButton1 = 0x00000005,
XButton2 = 0x00000006,
Back = 0x00000008,
Tab = 0x00000009,
LineFeed = 0x0000000A,
Clear = 0x0000000C,
Return = 0x0000000D,
Enter = 0x0000000D,
ShiftKey = 0x00000010,
ControlKey = 0x00000011,
Menu = 0x00000012,
Pause = 0x00000013,
CapsLock = 0x00000014,
Capital = 0x00000014,
KanaMode = 0x00000015,
HanguelMode = 0x00000015,
HangulMode = 0x00000015,
JunjaMode = 0x00000017,
FinalMode = 0x00000018,
KanjiMode = 0x00000019,
HanjaMode = 0x00000019,
Escape = 0x0000001B,
IMEConvert = 0x0000001C,
IMENonconvert = 0x0000001D,
IMEAceept = 0x0000001E,
IMEModeChange = 0x0000001F,
Space = 0x00000020,
PageUp = 0x00000021,
Prior = 0x00000021,
PageDown = 0x00000022,
Next = 0x00000022,
End = 0x00000023,
Home = 0x00000024,
Left = 0x00000025,
Up = 0x00000026,
Right = 0x00000027,
Down = 0x00000028,
Select = 0x00000029,
Print = 0x0000002A,
Execute = 0x0000002B,
PrintScreen = 0x0000002C,
Snapshot = 0x0000002C,
Insert = 0x0000002D,
Delete = 0x0000002E,
Help = 0x0000002F,
D0 = 0x00000030,
D1 = 0x00000031,
D2 = 0x00000032,
D3 = 0x00000033,
D4 = 0x00000034,
D5 = 0x00000035,
D6 = 0x00000036,
D7 = 0x00000037,
D8 = 0x00000038,
D9 = 0x00000039,
A = 0x00000041,
B = 0x00000042,
C = 0x00000043,
D = 0x00000044,
E = 0x00000045,
F = 0x00000046,
G = 0x00000047,
H = 0x00000048,
I = 0x00000049,
J = 0x0000004A,
K = 0x0000004B,
L = 0x0000004C,
M = 0x0000004D,
N = 0x0000004E,
O = 0x0000004F,
P = 0x00000050,
Q = 0x00000051,
R = 0x00000052,
S = 0x00000053,
T = 0x00000054,
U = 0x00000055,
V = 0x00000056,
W = 0x00000057,
X = 0x00000058,
Y = 0x00000059,
Z = 0x0000005A,
LWin = 0x0000005B,
RWin = 0x0000005C,
Apps = 0x0000005D,
NumPad0 = 0x00000060,
NumPad1 = 0x00000061,
NumPad2 = 0x00000062,
NumPad3 = 0x00000063,
NumPad4 = 0x00000064,
NumPad5 = 0x00000065,
NumPad6 = 0x00000066,
NumPad7 = 0x00000067,
NumPad8 = 0x00000068,
NumPad9 = 0x00000069,
Multiply = 0x0000006A,
Add = 0x0000006B,
Separator = 0x0000006C,
Subtract = 0x0000006D,
Decimal = 0x0000006E,
Divide = 0x0000006F,
F1 = 0x00000070,
F2 = 0x00000071,
F3 = 0x00000072,
F4 = 0x00000073,
F5 = 0x00000074,
F6 = 0x00000075,
F7 = 0x00000076,
F8 = 0x00000077,
F9 = 0x00000078,
F10 = 0x00000079,
F11 = 0x0000007A,
F12 = 0x0000007B,
F13 = 0x0000007C,
F14 = 0x0000007D,
F15 = 0x0000007E,
F16 = 0x0000007F,
F17 = 0x00000080,
F18 = 0x00000081,
F19 = 0x00000082,
F20 = 0x00000083,
F21 = 0x00000084,
F22 = 0x00000085,
F23 = 0x00000086,
F24 = 0x00000087,
NumLock = 0x00000090,
Scroll = 0x00000091,
LShiftKey = 0x000000A0,
RShiftKey = 0x000000A1,
LControlKey = 0x000000A2,
RControlKey = 0x000000A3,
LMenu = 0x000000A4,
RMenu = 0x000000A5,
BrowserBack = 0x000000A6,
BrowserForward = 0x000000A7,
BrowserRefresh = 0x000000A8,
BrowserStop = 0x000000A9,
BrowserSearch = 0x000000AA,
BrowserFavorites = 0x000000AB,
BrowserHome = 0x000000AC,
VolumeMute = 0x000000AD,
VolumeDown = 0x000000AE,
VolumeUp = 0x000000AF,
MediaNextTrack = 0x000000B0,
MediaPreviousTrack = 0x000000B1,
MediaStop = 0x000000B2,
MediaPlayPause = 0x000000B3,
LaunchMail = 0x000000B4,
SelectMedia = 0x000000B5,
LaunchApplication1 = 0x000000B6,
LaunchApplication2 = 0x000000B7,
OemSemicolon = 0x000000BA,
Oemplus = 0x000000BB,
Oemcomma = 0x000000BC,
OemMinus = 0x000000BD,
OemPeriod = 0x000000BE,
OemQuestion = 0x000000BF,
Oemtilde = 0x000000C0,
OemOpenBrackets = 0x000000DB,
OemPipe = 0x000000DC,
OemCloseBrackets = 0x000000DD,
OemQuotes = 0x000000DE,
Oem8 = 0x000000DF,
OemBackslash = 0x000000E2,
ProcessKey = 0x000000E5,
Attn = 0x000000F6,
Crsel = 0x000000F7,
Exsel = 0x000000F8,
EraseEof = 0x000000F9,
Play = 0x000000FA,
Zoom = 0x000000FB,
NoName = 0x000000FC,
Pa1 = 0x000000FD,
OemClear = 0x000000FE,
KeyCode = 0x0000FFFF,
Shift = 0x00010000,
Control = 0x00020000,
Alt = 0x00040000,
Modifiers = ((int)0xFFFF0000),
IMEAccept = 0x0000001E,
Oem1 = 0x000000BA,
Oem102 = 0x000000E2,
Oem2 = 0x000000BF,
Oem3 = 0x000000C0,
Oem4 = 0x000000DB,
Oem5 = 0x000000DC,
Oem6 = 0x000000DD,
Oem7 = 0x000000DE,
Packet = 0x000000E7,
Sleep = 0x0000005F
};
template<typename Func>
class Event
{
public:
using function_type = typename std::remove_pointer<Func>::type;
using std_function_type = std::function<function_type>;
std::vector<std_function_type> _events;
Event() = default;
~Event() = default;
template <typename... Args>
void Invoke(Args&&... args) {
for (auto& event : _events) {
event(std::forward<Args>(args)...);
}
}
template<typename F>
void operator+=(F&& fn) {
std_function_type func(std::forward<F>(fn));
if constexpr (std::is_pointer_v<std::decay_t<F>>) {
for (const auto& existing_fn : _events) {
if (existing_fn.target<function_type*>() == func.target<function_type*>()) {
return;
}
}
}
_events.push_back(std::move(func));
}
template<typename F>
void operator-=(F&& fn) {
std_function_type func(std::forward<F>(fn));
if constexpr (std::is_pointer_v<std::decay_t<F>>) {
auto it = std::remove_if(_events.begin(), _events.end(),
[&](const std_function_type& existing_fn) {
return existing_fn.target<function_type*>() == func.target<function_type*>();
});
_events.erase(it, _events.end());
}
}
template <typename... Args>
void operator()(Args&&... args) {
Invoke(std::forward<Args>(args)...);
}
int Count() const {
return static_cast<int>(_events.size());
}
void Clear() {
_events.clear();
}
};
class EventArgs
{
public:
EventArgs() {}
};
class MouseEventArgs : public EventArgs
{
public:
MouseButtons Buttons;
int Clicks;
int Delta;
int X;
int Y;
MouseEventArgs() {}
MouseEventArgs(MouseButtons button, int clicks, int x, int y, int delta);
};
class KeyEventArgs : EventArgs
{
public:
Keys KeyData;
bool EventHandled;
bool SupressKeyPress;
KeyEventArgs() {}
KeyEventArgs(Keys keyData);
bool Alt();
bool Control();
bool Shift();
Keys Modifiers();
Keys KeyCode();
int KeyValue();
static KeyEventArgs ProcessKeyEventArgs(MSG m);
};
MouseButtons FromParamToMouseButtons(UINT message);