added files of io/event
This commit is contained in:
277
inc/hgl/io/event/KeyboardEvent.h
Normal file
277
inc/hgl/io/event/KeyboardEvent.h
Normal file
@@ -0,0 +1,277 @@
|
||||
#ifndef HGL_IO_KEYBOARD_EVENT_INCLUDE
|
||||
#define HGL_IO_KEYBOARD_EVENT_INCLUDE
|
||||
|
||||
#include<hgl/io/event/InputEvent.h>
|
||||
namespace hgl
|
||||
{
|
||||
namespace io
|
||||
{
|
||||
/**
|
||||
* <20><><EFBFBD><EFBFBD>ö<EFBFBD>ٶ<EFBFBD><D9B6><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;
|
||||
}
|
||||
|
||||
virtual bool OnPressed(const KeyboardButton &kb){}
|
||||
virtual bool OnReleased(const KeyboardButton &kb){}
|
||||
virtual bool OnChar(const wchar_t &){}
|
||||
};//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<><C4B3><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>״̬
|
||||
*/
|
||||
const bool HasPressed(const KeyboardButton &kb)const
|
||||
{
|
||||
if(!RangeCheck(kb))return(false);
|
||||
|
||||
return press_states[size_t(kb)];
|
||||
}
|
||||
|
||||
/**
|
||||
* <20>趨<EFBFBD><E8B6A8>ǰʱ<C7B0><CAB1>
|
||||
*/
|
||||
void SetCurTime(const double &ct)
|
||||
{
|
||||
cur_time=ct;
|
||||
}
|
||||
|
||||
/**
|
||||
* <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD>ʱ<EFBFBD><CAB1>
|
||||
*/
|
||||
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
|
Reference in New Issue
Block a user