InputEvent不再分多类建多组

This commit is contained in:
hyzboy 2025-06-10 01:31:18 +08:00
parent 86ac0c37fc
commit 333bec0a12
5 changed files with 66 additions and 49 deletions

View File

@ -6,7 +6,7 @@ namespace hgl::io
{ {
struct EventHeader struct EventHeader
{ {
uint8 type; ///<输入源类型 InputEventSource type; ///<输入源类型
uint8 index; ///<输入源索引(比如同一设备有多个) uint8 index; ///<输入源索引(比如同一设备有多个)
uint16 id; ///<事件id uint16 id; ///<事件id
}; };
@ -28,7 +28,11 @@ namespace hgl::io
InputEventSource source_type; InputEventSource source_type;
SortedSet<InputEvent *> sub_event_proc[size_t(InputEventSource::RANGE_SIZE)]; InputEvent *parent_input_event;
SortedSet<InputEvent *> sub_event_proc;
void SetParent(InputEvent *ie){parent_input_event=ie;}
public: public:
@ -36,20 +40,12 @@ namespace hgl::io
virtual EventProcResult OnEvent(const EventHeader &header,const uint64 data) virtual EventProcResult OnEvent(const EventHeader &header,const uint64 data)
{ {
if(!RangeCheck((InputEventSource)header.type)) if(!RangeCheck(header.type))
return(EventProcResult::Break); return(EventProcResult::Break);
if(sub_event_proc[header.type].GetCount()>0) if(!sub_event_proc.IsEmpty())
{ {
for(InputEvent *ie:sub_event_proc[header.type]) for(InputEvent *ie:sub_event_proc)
if(ie->OnEvent(header,data)==EventProcResult::Break)
return EventProcResult::Break;
}
if(sub_event_proc[size_t(InputEventSource::Root)].GetCount()>0
&&InputEventSource(header.type)!=InputEventSource::Root)
{
for(InputEvent *ie:sub_event_proc[size_t(InputEventSource::Root)])
if(ie->OnEvent(header,data)==EventProcResult::Break) if(ie->OnEvent(header,data)==EventProcResult::Break)
return EventProcResult::Break; return EventProcResult::Break;
} }
@ -62,14 +58,20 @@ namespace hgl::io
InputEvent() InputEvent()
{ {
source_type=InputEventSource::Root; source_type=InputEventSource::Root;
parent_input_event=nullptr;
} }
InputEvent(InputEventSource ies) InputEvent(InputEventSource ies)
{ {
source_type=ies; source_type=ies;
parent_input_event=nullptr;
} }
virtual ~InputEvent()=default; virtual ~InputEvent()
{
if(parent_input_event)
parent_input_event->Unjoin(this);
}
virtual bool Join(InputEvent *ie) virtual bool Join(InputEvent *ie)
{ {
@ -81,7 +83,9 @@ namespace hgl::io
if(!RangeCheck(ies)) if(!RangeCheck(ies))
return(false); return(false);
return(sub_event_proc[size_t(ies)].Add(ie)!=-1); ie->SetParent(this);
return(sub_event_proc.Add(ie)!=-1);
} }
bool Unjoin(InputEvent *ie) bool Unjoin(InputEvent *ie)
@ -93,7 +97,11 @@ namespace hgl::io
if(!RangeCheck(ies)) if(!RangeCheck(ies))
return(false); return(false);
return sub_event_proc[size_t(ies)].Delete(ie); ie->SetParent(nullptr);
return sub_event_proc.Delete(ie);
} }
virtual bool Update(){return true;}
};//class InputEvent };//class InputEvent
}//namespace hgl::io }//namespace hgl::io

View File

@ -3,7 +3,7 @@
#include<hgl/TypeFunc.h> #include<hgl/TypeFunc.h>
namespace hgl::io namespace hgl::io
{ {
enum class InputEventSource enum class InputEventSource:uint8
{ {
Root=0, Root=0,

View File

@ -167,16 +167,19 @@ namespace hgl
EventProcResult OnEvent(const EventHeader &header,const uint64 data) override EventProcResult OnEvent(const EventHeader &header,const uint64 data) override
{ {
if(header.type==InputEventSource::Keyboard)
{
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;
}
}
if(InputEvent::OnEvent(header,data)==EventProcResult::Break) if(InputEvent::OnEvent(header,data)==EventProcResult::Break)
return 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; return EventProcResult::Continue;
} }

View File

@ -64,30 +64,33 @@ namespace hgl
EventProcResult OnEvent(const EventHeader &header,const uint64 data) override EventProcResult OnEvent(const EventHeader &header,const uint64 data) override
{ {
if(InputEvent::OnEvent(header,data)==EventProcResult::Break) if(header.type==InputEventSource::Mouse)
return EventProcResult::Break;
med=(MouseEventData *)&data;
if(MouseEventID(header.id)==MouseEventID::Wheel)
{
if(OnWheel (med->x,med->y) )return EventProcResult::Break;
}
else
{ {
x=med->x;y=med->y; med=(MouseEventData *)&data;
switch(MouseEventID(header.id)) if(MouseEventID(header.id)==MouseEventID::Wheel)
{
if(OnWheel (med->x,med->y) )return EventProcResult::Break;
}
else
{ {
case MouseEventID::Move: if(OnMove (med->x,med->y) )return EventProcResult::Break;break; x=med->x;y=med->y;
case MouseEventID::Pressed: pressed_statues[med->button]=true;
if(OnPressed (med->x,med->y,MouseButton(med->button)))return EventProcResult::Break;break; switch(MouseEventID(header.id))
case MouseEventID::Released: pressed_statues[med->button]=false; {
if(OnReleased (med->x,med->y,MouseButton(med->button)))return EventProcResult::Break;break; case MouseEventID::Move: if(OnMove (med->x,med->y) )return EventProcResult::Break;break;
case MouseEventID::DblClicked: if(OnDblClicked (med->x,med->y,MouseButton(med->button)))return EventProcResult::Break;break; case MouseEventID::Pressed: pressed_statues[med->button]=true;
if(OnPressed (med->x,med->y,MouseButton(med->button)))return EventProcResult::Break;break;
case MouseEventID::Released: pressed_statues[med->button]=false;
if(OnReleased (med->x,med->y,MouseButton(med->button)))return EventProcResult::Break;break;
case MouseEventID::DblClicked: if(OnDblClicked (med->x,med->y,MouseButton(med->button)))return EventProcResult::Break;break;
}
} }
} }
if(InputEvent::OnEvent(header,data)==EventProcResult::Break)
return EventProcResult::Break;
return EventProcResult::Continue; return EventProcResult::Continue;
} }

View File

@ -33,18 +33,21 @@ namespace hgl
public: public:
WindowEvent():InputEvent(InputEventSource::Window){} WindowEvent():InputEvent(InputEventSource::Window){wed=nullptr;}
virtual ~WindowEvent()=default; virtual ~WindowEvent()=default;
virtual EventProcResult OnEvent(const EventHeader &header,const uint64 data) override virtual EventProcResult OnEvent(const EventHeader &header,const uint64 data) override
{ {
wed=(WindowEventData *)&data; if(header.type==InputEventSource::Window)
switch(WindowEventID(header.id))
{ {
case WindowEventID::Active:OnActive (wed->active) ;break; wed=(WindowEventData *)&data;
case WindowEventID::Resize:OnResize (wed->width,wed->height);break;
case WindowEventID::Close: OnClose () ;break; switch(WindowEventID(header.id))
{
case WindowEventID::Active:OnActive (wed->active) ;break;
case WindowEventID::Resize:OnResize (wed->width,wed->height);break;
case WindowEventID::Close: OnClose () ;break;
}
} }
if(InputEvent::OnEvent(header,data)==EventProcResult::Break) if(InputEvent::OnEvent(header,data)==EventProcResult::Break)