CMCore/inc/hgl/io/event/KeyboardEvent.h

278 lines
8.9 KiB
C
Raw Normal View History

2022-01-24 18:56:05 +08:00
#ifndef HGL_IO_KEYBOARD_EVENT_INCLUDE
#define HGL_IO_KEYBOARD_EVENT_INCLUDE
#include<hgl/io/event/InputEvent.h>
namespace hgl
{
namespace io
{
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD>ٶ<EFBFBD><EFBFBD><EFBFBD>
*/
enum class KeyboardButton
{
NONE=0,
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Esc, ///<ESC
//F<><46><EFBFBD>ܼ<EFBFBD>
F1, ///<F1
F2, ///<F2
F3, ///<F3
F4, ///<F4
F5, ///<F5
F6, ///<F6
F7, ///<F7
F8, ///<F8
F9, ///<F9
F10, ///<F10
F11, ///<F11
F12, ///<F12
Grave, //<`<60><>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ּ<EFBFBD>1<EFBFBD><31><EFBFBD>ߵİ<DFB5>ť)
//10<31><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
_0, ///<<3C><><EFBFBD>ּ<EFBFBD>0
_1, ///<<3C><><EFBFBD>ּ<EFBFBD>1
_2, ///<<3C><><EFBFBD>ּ<EFBFBD>2
_3, ///<<3C><><EFBFBD>ּ<EFBFBD>3
_4, ///<<3C><><EFBFBD>ּ<EFBFBD>4
_5, ///<<3C><><EFBFBD>ּ<EFBFBD>5
_6, ///<<3C><><EFBFBD>ּ<EFBFBD>6
_7, ///<<3C><><EFBFBD>ּ<EFBFBD>7
_8, ///<<3C><><EFBFBD>ּ<EFBFBD>8
_9, ///<<3C><><EFBFBD>ּ<EFBFBD>9
Minus, ///< - (<28><><EFBFBD><EFBFBD>)
Equals, ///< = (<28>Ⱥ<EFBFBD>)
BackSlash, ///< \ (<28><>б<EFBFBD><D0B1>)
BackSpace, ///< <20>˸<EFBFBD><CBB8><EFBFBD>
Tab, ///<Tab<61><62>
A, ///<A
B, ///<B
C, ///<C
D, ///<D
E, ///<E
F, ///<F
G, ///<G
H, ///<H
I, ///<I
J, ///<J
K, ///<K
L, ///<L
M, ///<M
N, ///<N
O, ///<O
P, ///<P
Q, ///<Q
R, ///<R
S, ///<S
T, ///<T
U, ///<U
V, ///<V
W, ///<W
X, ///<X
Y, ///<Y
Z, ///<Z
LeftBracket, ///<[
RightBracket, ///<]
CapsLock, ///<<3C><>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Semicolon, ///<; (<28>ֺ<EFBFBD>)
Apostrophe, ///<' (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
Enter, ///<<3C>س<EFBFBD><D8B3><EFBFBD>
LeftShift, ///<<3C><><EFBFBD>ߵ<EFBFBD>Shift<66><74>
Comma, ///<, (<28><><EFBFBD><EFBFBD>)
Period, ///<. (<28><><EFBFBD><EFBFBD>)
Slash, ///</ (<28><><EFBFBD><EFBFBD>)
RightShift, ///<<3C>ұߵ<D2B1>Shift<66><74>
LeftCtrl, ///<<3C><><EFBFBD>ߵ<EFBFBD>Ctrl<72><6C>
LeftOS, ///<<3C><><EFBFBD>ߵ<EFBFBD>OS<4F><53>(Win/Apple<6C><65>)
LeftAlt, ///<<3C><><EFBFBD>ߵ<EFBFBD>Alt<6C><74>
Space, ///<<3C>ո<EFBFBD><D5B8><EFBFBD>
RightAlt, ///<<3C>ұߵ<D2B1>Alt<6C><74>
RightOS, ///<<3C>ұߵ<D2B1>OS<4F><53>(Win/Apple<6C><65>)
RightMenu, ///<<3C>ұߵ<D2B1>Menu<6E><75>
RightCtrl, ///<<3C>ұߵ<D2B1>Ctrl<72><6C>
//<2F>м<EFBFBD><D0BC><EFBFBD><EFBFBD><EFBFBD>
PrintScreen, ///<<3C><>ӡ<EFBFBD><D3A1>Ļ<EFBFBD><C4BB>
ScrollLock, ///<<3C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Pause, ///<<3C><>ͣ<EFBFBD><CDA3>
Insert, ///<<3C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Delete, ///<ɾ<><C9BE><EFBFBD><EFBFBD>
Home, ///<<3C><><EFBFBD>׼<EFBFBD>
End, ///<<3C><>β<EFBFBD><CEB2>
PageUp, ///<<3C><>ǰ<EFBFBD><C7B0>ҳ<EFBFBD><D2B3>
PageDown, ///<<3C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҳ<EFBFBD><D2B3>
Up, ///<<3C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Down, ///<<3C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Left, ///<<3C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Right, ///<<3C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//С<><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
NumLock, ///<С<><D0A1><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
NumAdd, ///<С<><D0A1><EFBFBD><EFBFBD> +
NumSubtract, ///<С<><D0A1><EFBFBD><EFBFBD> -
NumMultiply, ///<С<><D0A1><EFBFBD><EFBFBD> *
NumDivide, ///<С<><D0A1><EFBFBD><EFBFBD> /
Num0, ///<С<><D0A1><EFBFBD><EFBFBD> 0
Num1, ///<С<><D0A1><EFBFBD><EFBFBD> 1
Num2, ///<С<><D0A1><EFBFBD><EFBFBD> 2
Num3, ///<С<><D0A1><EFBFBD><EFBFBD> 3
Num4, ///<С<><D0A1><EFBFBD><EFBFBD> 4
Num5, ///<С<><D0A1><EFBFBD><EFBFBD> 5
Num6, ///<С<><D0A1><EFBFBD><EFBFBD> 6
Num7, ///<С<><D0A1><EFBFBD><EFBFBD> 7
Num8, ///<С<><D0A1><EFBFBD><EFBFBD> 8
Num9, ///<С<><D0A1><EFBFBD><EFBFBD> 9
NumDecimal, ///<С<><D0A1><EFBFBD><EFBFBD> . (С<><D0A1><EFBFBD><EFBFBD><><C9BE><EFBFBD><EFBFBD>)
NumEnter, ///<С<><D0A1><EFBFBD><EFBFBD> <20>س<EFBFBD><D8B3><EFBFBD>
ENUM_CLASS_RANGE(NONE,NumEnter)
};//enum KeyboardButton
enum class KeyboardEventID
{
Pressed=0,
Released,
Char
};
union KeyboardEventData
{
uint64 data;
uint32 key;
os_char ch;
};
class KeyboardEvent:public InputEvent
{
public:
KeyboardEvent():InputEvent(InputEventSource::Keyboard){}
virtual ~KeyboardEvent()=default;
EventProcResult OnEvent(const EventHeader &header,const uint64 data) override
{
if(InputEvent::OnEvent(header,data)==EventProcResult::Break)
return EventProcResult::Break;
switch(KeyboardEventID(header.id))
{
case KeyboardEventID::Pressed: if(OnPressed (KeyboardButton(((KeyboardEventData *)&data)->key)))return EventProcResult::Break;break;
case KeyboardEventID::Released: if(OnReleased (KeyboardButton(((KeyboardEventData *)&data)->key)))return EventProcResult::Break;break;
case KeyboardEventID::Char: if(OnChar ( ((KeyboardEventData *)&data)->ch ) )return EventProcResult::Break;break;
}
return EventProcResult::Continue;
}
2022-01-24 19:29:19 +08:00
virtual bool OnPressed(const KeyboardButton &kb){return(false);}
virtual bool OnReleased(const KeyboardButton &kb){return(false);}
virtual bool OnChar(const wchar_t &){return(false);}
2022-01-24 18:56:05 +08:00
};//class KeyboardEvent
class KeyboardStateEvent:public KeyboardEvent
{
protected:
double cur_time;
bool press_states[size_t(KeyboardButton::RANGE_SIZE)];
double pressed_time[size_t(KeyboardButton::RANGE_SIZE)];
public:
KeyboardStateEvent():KeyboardEvent()
{
cur_time=0;
hgl_zero(press_states);
hgl_zero(pressed_time);
}
virtual ~KeyboardStateEvent()=default;
virtual bool OnPressed(const KeyboardButton &kb) override
{
if(!RangeCheck(kb))return(false);
press_states[(size_t)kb]=true;
pressed_time[(size_t)kb]=cur_time;
return(true);
}
virtual bool OnReleased(const KeyboardButton &kb) override
{
if(!RangeCheck(kb))return(false);
press_states[(size_t)kb]=false;
pressed_time[(size_t)kb]=0;
return(true);
}
public:
/**
* ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
*/
const bool HasPressed(const KeyboardButton &kb)const
{
if(!RangeCheck(kb))return(false);
return press_states[size_t(kb)];
}
/**
* <EFBFBD><EFBFBD><EFBFBD>ǰʱ<EFBFBD><EFBFBD>
*/
void SetCurTime(const double &ct)
{
cur_time=ct;
}
/**
* <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD>ʱ<EFBFBD><EFBFBD>
*/
const double GetPressedTime(const KeyboardButton &kb)const
{
if(!RangeCheck(kb))return(0);
return pressed_time[size_t(kb)];
}
const bool ShiftPressed()const
{
return press_states[size_t(KeyboardButton::LeftShift)]
||press_states[size_t(KeyboardButton::RightShift)];
}
const bool CtrlPressed()const
{
return press_states[size_t(KeyboardButton::LeftCtrl)]
||press_states[size_t(KeyboardButton::RightCtrl)];
}
const bool AltPressed()const
{
return press_states[size_t(KeyboardButton::LeftAlt)]
||press_states[size_t(KeyboardButton::RightAlt)];
}
};//class KeyboardStateEvent
}//namespace io
}//namespace hgl
#endif//HGL_IO_KEYBOARD_EVENT_INCLUDE