From 713921985587dde43b11d1e0d3d2defc6c35d541 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Thu, 17 Jul 2025 02:22:39 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=96=B0=E5=91=BD=E5=90=8DEventDispat?= =?UTF-8?q?cher=E7=9A=84=E6=B7=BB=E5=8A=A0/=E8=A7=A3=E5=86=B3=E5=87=BD?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- inc/hgl/io/event/EventDispatcher.h | 41 +++++--------------- inc/hgl/io/event/MouseEvent.h | 61 ++++++------------------------ src/CMakeLists.txt | 8 ++-- src/IO/Event/EventDispatcher.cpp | 33 ++++++++++++++++ src/IO/Event/MouseEvent.cpp | 37 ++++++++++++++++++ 5 files changed, 96 insertions(+), 84 deletions(-) create mode 100644 src/IO/Event/EventDispatcher.cpp create mode 100644 src/IO/Event/MouseEvent.cpp diff --git a/inc/hgl/io/event/EventDispatcher.h b/inc/hgl/io/event/EventDispatcher.h index 8caa33c..ee88266 100644 --- a/inc/hgl/io/event/EventDispatcher.h +++ b/inc/hgl/io/event/EventDispatcher.h @@ -30,6 +30,9 @@ namespace hgl::io Break, }; + /** + * 事件分发器 + */ class EventDispatcher { protected: @@ -38,7 +41,7 @@ namespace hgl::io EventDispatcher * parent_input_event; - SortedSet event_subscribers; + SortedSet child_dispatchers; protected: @@ -53,9 +56,9 @@ namespace hgl::io if(!RangeCheck(header.type)) return(EventProcResult::Break); - if(!event_subscribers.IsEmpty()) + if(!child_dispatchers.IsEmpty()) { - for(EventDispatcher *ie:event_subscribers) + for(EventDispatcher *ie:child_dispatchers) if(ie->OnEvent(header,data)==EventProcResult::Break) return EventProcResult::Break; } @@ -80,37 +83,11 @@ namespace hgl::io virtual ~EventDispatcher() { if(parent_input_event) - parent_input_event->UnsubscribeEventDispatcher(this); + parent_input_event->RemoveChildDispatcher(this); } - virtual bool SubscribeEventDispatcher(EventDispatcher *ie) - { - if(!ie) - return(false); - - const InputEventSource ies=ie->GetInputEventSource(); - - if(!RangeCheck(ies)) - return(false); - - ie->SetParent(this); - - return(event_subscribers.Add(ie)!=-1); - } - - bool UnsubscribeEventDispatcher(EventDispatcher *ie) - { - if(!ie)return(false); - - const InputEventSource ies=ie->GetInputEventSource(); - - if(!RangeCheck(ies)) - return(false); - - ie->SetParent(nullptr); - - return event_subscribers.Delete(ie); - } + virtual bool AddChildDispatcher(EventDispatcher *ie); + virtual bool RemoveChildDispatcher(EventDispatcher *ie); virtual bool Update(){return true;} };//class EventDispatcher diff --git a/inc/hgl/io/event/MouseEvent.h b/inc/hgl/io/event/MouseEvent.h index ac65a35..704f9b0 100644 --- a/inc/hgl/io/event/MouseEvent.h +++ b/inc/hgl/io/event/MouseEvent.h @@ -44,66 +44,29 @@ namespace hgl::io class MouseEvent:public EventDispatcher { - MouseEventData *med; + MouseEventData *med=nullptr; - Vector2i position; + Vector2i position{}; - bool pressed_statues[size_t(MouseButton::RANGE_SIZE)]; + bool pressed_statues[size_t(MouseButton::RANGE_SIZE)]{}; public: - MouseEvent():EventDispatcher(InputEventSource::Mouse) - { - med=nullptr; - position.x=0; - position.y=0;; - hgl_zero(pressed_statues); - } + MouseEvent():EventDispatcher(InputEventSource::Mouse){} virtual ~MouseEvent()=default; - - EventProcResult OnEvent(const EventHeader &header,const uint64 data) override - { - if(header.type==InputEventSource::Mouse) - { - med=(MouseEventData *)&data; - if(MouseEventID(header.id)==MouseEventID::Wheel) - { - if(OnWheel (med->x,med->y) )return EventProcResult::Break; - } - else - { - position.x=med->x; - position.y=med->y; + virtual EventProcResult OnEvent (const EventHeader &header,const uint64 data) override; - switch(MouseEventID(header.id)) - { - case MouseEventID::Move: if(OnMove (med->x,med->y) )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; - } - } - } + virtual bool OnMove (int,int){return false;} + virtual bool OnWheel (int,int){return false;} - if(EventDispatcher::OnEvent(header,data)==EventProcResult::Break) - return EventProcResult::Break; - - return EventProcResult::Continue; - } - - virtual bool OnMove (int,int){return false;} - virtual bool OnWheel (int,int){return false;} - - virtual bool OnPressed (int,int,MouseButton){return false;} - virtual bool OnReleased (int,int,MouseButton){return false;} - virtual bool OnDblClicked(int,int,MouseButton){return false;} + virtual bool OnPressed (int,int,MouseButton){return false;} + virtual bool OnReleased (int,int,MouseButton){return false;} + virtual bool OnDblClicked(int,int,MouseButton){return false;} /** - * 某按键是否按下 - */ + * 某按键是否按下 + */ const bool HasPressed(const MouseButton &mb)const { if(!RangeCheck(mb))return(false); diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d5b0efb..18d282d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -195,6 +195,8 @@ SET(INPUT_EVENT_FILES ${IO_INCLUDE_PATH}/event/KeyboardEvent.h ${IO_INCLUDE_PATH}/event/JoystickEvent.h ${IO_INCLUDE_PATH}/event/EventDispatcher.h ${IO_INCLUDE_PATH}/event/InputMapping.h + IO/Event/MouseEvent.cpp + IO/Event/EventDispatcher.cpp ) SOURCE_GROUP("IO\\Event" FILES ${INPUT_EVENT_FILES}) @@ -247,10 +249,10 @@ SOURCE_GROUP("Thread" FILES ${BASE_THREAD_HEADER_FILES} ${BASE_THREAD_SOURCE_FILES}) FILE(GLOB BASE_EVENT_HEADER_FILES ${CMCORE_ROOT_INCLUDE_PATH}/hgl/event/*.*) -FILE(GLOB BASE_EVENT_SOURCE_FILES Event/*.*) +#FILE(GLOB BASE_EVENT_SOURCE_FILES Event/*.*) -SOURCE_GROUP("Event" FILES ${BASE_EVENT_HEADER_FILES} - ${BASE_EVENT_SOURCE_FILES}) +SOURCE_GROUP("Event" FILES ${BASE_EVENT_HEADER_FILES}) + #${BASE_EVENT_SOURCE_FILES}) file(GLOB BASE_PLUG_IN_HEADER ${CMCORE_ROOT_INCLUDE_PATH}/hgl/plugin/*.h) file(GLOB BASE_PLUG_IN_SOURCE PlugIn/*.cpp) diff --git a/src/IO/Event/EventDispatcher.cpp b/src/IO/Event/EventDispatcher.cpp new file mode 100644 index 0000000..69539ab --- /dev/null +++ b/src/IO/Event/EventDispatcher.cpp @@ -0,0 +1,33 @@ +#include + +namespace hgl::io +{ + bool EventDispatcher::AddChildDispatcher(EventDispatcher *ie) + { + if(!ie) + return(false); + + const InputEventSource ies=ie->GetInputEventSource(); + + if(!RangeCheck(ies)) + return(false); + + ie->SetParent(this); + + return(child_dispatchers.Add(ie)!=-1); + } + + bool EventDispatcher::RemoveChildDispatcher(EventDispatcher *ie) + { + if(!ie)return(false); + + const InputEventSource ies=ie->GetInputEventSource(); + + if(!RangeCheck(ies)) + return(false); + + ie->SetParent(nullptr); + + return child_dispatchers.Delete(ie); + } +}//namespace hgl::io diff --git a/src/IO/Event/MouseEvent.cpp b/src/IO/Event/MouseEvent.cpp new file mode 100644 index 0000000..1217b19 --- /dev/null +++ b/src/IO/Event/MouseEvent.cpp @@ -0,0 +1,37 @@ +#include + +namespace hgl::io +{ + EventProcResult MouseEvent::OnEvent(const EventHeader &header,const uint64 data) + { + if(header.type==InputEventSource::Mouse) + { + med=(MouseEventData *)&data; + + if(MouseEventID(header.id)==MouseEventID::Wheel) + { + if(OnWheel (med->x,med->y) )return EventProcResult::Break; + } + else + { + position.x=med->x; + position.y=med->y; + + switch(MouseEventID(header.id)) + { + case MouseEventID::Move: if(OnMove (med->x,med->y) )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(EventDispatcher::OnEvent(header,data)==EventProcResult::Break) + return EventProcResult::Break; + + return EventProcResult::Continue; + } +}//namespace hgl::io