#pragma once #include #include namespace hgl::io { struct EventHeader { InputEventSource type; ///<输入源类型 uint8 index; ///<输入源索引(比如同一设备有多个) uint16 id; ///<事件id }; constexpr size_t EventHeaderBytes=sizeof(EventHeader); /** * 事件处理结果 */ enum class EventProcResult { Continue, Break, }; class InputEvent { protected: InputEventSource source_type; InputEvent *parent_input_event; SortedSet sub_event_proc; void SetParent(InputEvent *ie){parent_input_event=ie;} public: const InputEventSource GetInputEventSource()const{return source_type;} virtual EventProcResult OnEvent(const EventHeader &header,const uint64 data) { if(!RangeCheck(header.type)) return(EventProcResult::Break); if(!sub_event_proc.IsEmpty()) { for(InputEvent *ie:sub_event_proc) if(ie->OnEvent(header,data)==EventProcResult::Break) return EventProcResult::Break; } return(EventProcResult::Continue); } public: InputEvent() { source_type=InputEventSource::Root; parent_input_event=nullptr; } InputEvent(InputEventSource ies) { source_type=ies; parent_input_event=nullptr; } virtual ~InputEvent() { if(parent_input_event) parent_input_event->Unjoin(this); } virtual bool Join(InputEvent *ie) { if(!ie) return(false); const InputEventSource ies=ie->GetInputEventSource(); if(!RangeCheck(ies)) return(false); ie->SetParent(this); return(sub_event_proc.Add(ie)!=-1); } bool Unjoin(InputEvent *ie) { if(!ie)return(false); const InputEventSource ies=ie->GetInputEventSource(); if(!RangeCheck(ies)) return(false); ie->SetParent(nullptr); return sub_event_proc.Delete(ie); } virtual bool Update(){return true;} };//class InputEvent }//namespace hgl::io