update EventListener

This commit is contained in:
Nomango 2020-10-10 15:34:00 +08:00
parent 8f6fd5d1f6
commit f19d52b662
6 changed files with 133 additions and 152 deletions

1
.gitignore vendored
View File

@ -13,6 +13,7 @@ Release/
# Application folders # Application folders
.vs .vs
.idea .idea
._Kiwano.sln
# vs2010 # vs2010
ipch/ ipch/

View File

@ -34,7 +34,7 @@ bool EventDispatcher::DispatchEvent(Event* evt)
next = listener->GetNext(); next = listener->GetNext();
if (listener->IsRunning()) if (listener->IsRunning())
listener->Receive(evt); listener->Handle(evt);
if (listener->IsRemoveable()) if (listener->IsRemoveable())
listeners_.Remove(listener); listeners_.Remove(listener);
@ -58,13 +58,13 @@ EventListener* EventDispatcher::AddListener(EventListenerPtr listener)
EventListener* EventDispatcher::AddListener(const String& name, EventType type, EventListener::Callback callback) EventListener* EventDispatcher::AddListener(const String& name, EventType type, EventListener::Callback callback)
{ {
auto lis = MakePtr<EventListener>(name, type, callback); auto lis = EventListener::Create(name, type, callback);
return AddListener(lis); return AddListener(lis);
} }
EventListener* EventDispatcher::AddListener(EventType type, EventListener::Callback callback) EventListener* EventDispatcher::AddListener(EventType type, EventListener::Callback callback)
{ {
auto lis = MakePtr<EventListener>(type, callback); auto lis = EventListener::Create(type, callback);
return AddListener(lis); return AddListener(lis);
} }
@ -101,39 +101,6 @@ void EventDispatcher::RemoveListeners(const String& name)
} }
} }
void EventDispatcher::StartListeners(const EventType& type)
{
for (auto& listener : listeners_)
{
if (listener->GetEventType() == type)
{
listener->Start();
}
}
}
void EventDispatcher::StopListeners(const EventType& type)
{
for (auto& listener : listeners_)
{
if (listener->GetEventType() == type)
{
listener->Stop();
}
}
}
void EventDispatcher::RemoveListeners(const EventType& type)
{
for (auto& listener : listeners_)
{
if (listener->GetEventType() == type)
{
listener->Remove();
}
}
}
void EventDispatcher::StartAllListeners() void EventDispatcher::StartAllListeners()
{ {
for (auto& listener : listeners_) for (auto& listener : listeners_)

View File

@ -90,21 +90,6 @@ public:
/// @param name 监听器名称 /// @param name 监听器名称
void RemoveListeners(const String& name); void RemoveListeners(const String& name);
/// \~chinese
/// @brief 启动监听器
/// @param type 监听的事件类型
void StartListeners(const EventType& type);
/// \~chinese
/// @brief 停止监听器
/// @param type 监听的事件类型
void StopListeners(const EventType& type);
/// \~chinese
/// @brief 移除监听器
/// @param type 监听的事件类型
void RemoveListeners(const EventType& type);
/// \~chinese /// \~chinese
/// @brief 启动所有监听器 /// @brief 启动所有监听器
void StartAllListeners(); void StartAllListeners();

View File

@ -25,35 +25,63 @@ namespace kiwano
{ {
EventListener::EventListener() EventListener::EventListener()
: type_() : running_(true)
, callback_()
, running_(true)
, removeable_(false) , removeable_(false)
, swallow_(false) , swallow_(false)
{ {
} }
EventListener::EventListener(EventType type, const Callback& callback)
: EventListener()
{
this->SetEventType(type);
this->SetCallback(callback);
}
EventListener::EventListener(const String& name, EventType type, const Callback& callback)
: EventListener(type, callback)
{
this->SetName(name);
}
EventListener::~EventListener() {} EventListener::~EventListener() {}
void EventListener::Receive(Event* evt) class CallbackEventListener : public EventListener
{ {
if (ShouldHandle(evt) && callback_) public:
CallbackEventListener(EventType type, const Callback& cb)
: type_(type)
, cb_(cb)
{ {
callback_(evt);
} }
void Handle(Event* evt) override
{
if (type_.IsNull() || type_ == evt->GetType())
{
if (cb_)
{
cb_(evt);
}
}
}
private:
EventType type_;
Callback cb_;
};
EventListenerPtr EventListener::Create(const Callback& callback)
{
EventListenerPtr ptr = new CallbackEventListener(EventType(), callback);
return ptr;
}
EventListenerPtr EventListener::Create(const String& name, const Callback& callback)
{
EventListenerPtr ptr = new CallbackEventListener(EventType(), callback);
ptr->SetName(name);
return ptr;
}
EventListenerPtr EventListener::Create(EventType type, const Callback& callback)
{
EventListenerPtr ptr = new CallbackEventListener(type, callback);
return ptr;
}
EventListenerPtr EventListener::Create(const String& name, EventType type, const Callback& callback)
{
EventListenerPtr ptr = new CallbackEventListener(type, callback);
ptr->SetName(name);
return ptr;
} }
} // namespace kiwano } // namespace kiwano

View File

@ -48,20 +48,32 @@ public:
EventListener(); EventListener();
virtual ~EventListener();
/// \~chinese /// \~chinese
/// @brief 创建监听器 /// @brief 创建监听器
/// @param type 监听的事件类型
/// @param callback 回调函数 /// @param callback 回调函数
EventListener(EventType type, const Callback& callback); static EventListenerPtr Create(const Callback& callback);
/// \~chinese /// \~chinese
/// @brief 创建监听器 /// @brief 创建监听器
/// @param name 监听器名称 /// @param name 监听器名称
/// @param type 监听的事件类型 /// @param type 监听的事件类型
/// @param callback 回调函数 /// @param callback 回调函数
EventListener(const String& name, EventType type, const Callback& callback); static EventListenerPtr Create(const String& name, const Callback& callback);
virtual ~EventListener(); /// \~chinese
/// @brief 创建监听器
/// @param type 监听的事件类型
/// @param callback 回调函数
static EventListenerPtr Create(EventType type, const Callback& callback);
/// \~chinese
/// @brief 创建监听器
/// @param name 监听器名称
/// @param type 监听的事件类型
/// @param callback 回调函数
static EventListenerPtr Create(const String& name, EventType type, const Callback& callback);
/// \~chinese /// \~chinese
/// @brief 启动监听器 /// @brief 启动监听器
@ -93,45 +105,13 @@ public:
void SetSwallowEnabled(bool enabled); void SetSwallowEnabled(bool enabled);
/// \~chinese /// \~chinese
/// @brief 获取回调函数 /// @brief 处理消息
const Callback& GetCallback() const; virtual void Handle(Event* evt) = 0;
/// \~chinese
/// @brief 设置回调函数
void SetCallback(const Callback& cb);
/// \~chinese
/// @brief 获取监听的事件类型
EventType GetEventType() const;
/// \~chinese
/// @brief 设置监听的事件类型
void SetEventType(const EventType& type);
/// \~chinese
/// @brief 判断是否处理事件
virtual bool ShouldHandle(Event* evt) const;
/// \~chinese
/// @brief 设置监听的事件类型
/// @tparam _EventTy 事件类型
template <typename _EventTy>
inline void SetEventType()
{
static_assert(std::is_base_of<Event, _EventTy>::value, "_EventTy is not an event type.");
SetEventType(KGE_EVENT(_EventTy));
}
/// \~chinese
/// @brief 接收消息
void Receive(Event* evt);
private: private:
bool running_; bool running_;
bool removeable_; bool removeable_;
bool swallow_; bool swallow_;
EventType type_;
Callback callback_;
}; };
inline void EventListener::Start() inline void EventListener::Start()
@ -169,33 +149,4 @@ inline void EventListener::SetSwallowEnabled(bool enabled)
swallow_ = enabled; swallow_ = enabled;
} }
inline const EventListener::Callback& EventListener::GetCallback() const
{
return callback_;
}
inline void EventListener::SetCallback(const Callback& cb)
{
callback_ = cb;
}
inline EventType EventListener::GetEventType() const
{
return type_;
}
inline void EventListener::SetEventType(const EventType& type)
{
type_ = type;
}
inline bool EventListener::ShouldHandle(Event* evt) const
{
if (evt)
{
return evt->GetType() == type_;
}
return false;
}
} // namespace kiwano } // namespace kiwano

View File

@ -32,24 +32,28 @@ namespace kiwano
/// \~chinese /// \~chinese
/// @brief 事件类型 /// @brief 事件类型
class EventType : public std::type_index class EventType
{ {
class Dummy
{
};
public: public:
/// \~chinese
/// @brief 构建事件类型
EventType(); EventType();
using std::type_index::type_index; EventType(const std::type_index& type);
using std::type_index::operator==;
using std::type_index::operator!=; /// \~chinese
using std::type_index::operator<; /// @brief ÊÇ·ñÊÇ¿ÕÀàÐÍ
using std::type_index::operator>=; bool IsNull() const;
using std::type_index::operator>;
using std::type_index::operator<=; const std::type_index& GetType() const;
bool operator==(const EventType& rhs) const;
bool operator!=(const EventType& rhs) const;
bool operator<(const EventType& rhs) const;
bool operator<=(const EventType& rhs) const;
bool operator>(const EventType& rhs) const;
bool operator>=(const EventType& rhs) const;
private:
std::type_index type_;
}; };
/** @} */ /** @} */
@ -57,8 +61,53 @@ public:
#define KGE_EVENT(EVENT_TYPE) ::kiwano::EventType(typeid(EVENT_TYPE)) #define KGE_EVENT(EVENT_TYPE) ::kiwano::EventType(typeid(EVENT_TYPE))
inline EventType::EventType() inline EventType::EventType()
: std::type_index(typeid(EventType::Dummy)) : type_(typeid(void))
{ {
} }
inline EventType::EventType(const std::type_index& type)
: type_(type)
{
}
inline bool EventType::IsNull() const
{
return type_ == typeid(void);
}
inline const std::type_index& EventType::GetType() const
{
return type_;
}
inline bool EventType::operator==(const EventType& rhs) const
{
return type_ == rhs.type_;
}
inline bool EventType::operator!=(const EventType& rhs) const
{
return type_ != rhs.type_;
}
inline bool EventType::operator<(const EventType& rhs) const
{
return type_ < rhs.type_;
}
inline bool EventType::operator<=(const EventType& rhs) const
{
return type_ <= rhs.type_;
}
inline bool EventType::operator>(const EventType& rhs) const
{
return type_ > rhs.type_;
}
inline bool EventType::operator>=(const EventType& rhs) const
{
return type_ >= rhs.type_;
}
} // namespace kiwano } // namespace kiwano