Update EventListener & EventDispatcher
This commit is contained in:
parent
11c43a0731
commit
bd20606041
|
|
@ -58,12 +58,12 @@ namespace kiwano
|
|||
return action;
|
||||
}
|
||||
|
||||
Action* ActionManager::GetAction(String const & name)
|
||||
ActionPtr ActionManager::GetAction(String const & name)
|
||||
{
|
||||
if (actions_.empty())
|
||||
return nullptr;
|
||||
|
||||
for (auto action = actions_.first_item().get(); action; action = action->next_item().get())
|
||||
for (auto& action : actions_)
|
||||
if (action->IsName(name))
|
||||
return action;
|
||||
|
||||
|
|
@ -75,7 +75,7 @@ namespace kiwano
|
|||
if (actions_.empty())
|
||||
return;
|
||||
|
||||
for (auto action = actions_.first_item().get(); action; action = action->next_item().get())
|
||||
for (auto& action : actions_)
|
||||
{
|
||||
action->Resume();
|
||||
}
|
||||
|
|
@ -86,7 +86,7 @@ namespace kiwano
|
|||
if (actions_.empty())
|
||||
return;
|
||||
|
||||
for (auto action = actions_.first_item().get(); action; action = action->next_item().get())
|
||||
for (auto& action : actions_)
|
||||
{
|
||||
action->Pause();
|
||||
}
|
||||
|
|
@ -97,7 +97,7 @@ namespace kiwano
|
|||
if (actions_.empty())
|
||||
return;
|
||||
|
||||
for (auto action = actions_.first_item().get(); action; action = action->next_item().get())
|
||||
for (auto& action : actions_)
|
||||
{
|
||||
action->Stop();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -48,7 +48,7 @@ namespace kiwano
|
|||
/// \~chinese
|
||||
/// @brief 获取指定名称的动画
|
||||
/// @param name 动画名称
|
||||
Action* GetAction(String const& name);
|
||||
ActionPtr GetAction(String const& name);
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 继续所有暂停动画
|
||||
|
|
|
|||
|
|
@ -37,6 +37,11 @@ namespace kiwano
|
|||
{
|
||||
listener->callback_(evt);
|
||||
}
|
||||
|
||||
if (listener->IsRemoveable())
|
||||
{
|
||||
listeners_.remove(listener);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -70,7 +75,7 @@ namespace kiwano
|
|||
|
||||
void EventDispatcher::StartListeners(String const & listener_name)
|
||||
{
|
||||
for (auto listener = listeners_.first_item(); listener; listener = listener->next_item())
|
||||
for (auto& listener : listeners_)
|
||||
{
|
||||
if (listener->IsName(listener_name))
|
||||
{
|
||||
|
|
@ -81,7 +86,7 @@ namespace kiwano
|
|||
|
||||
void EventDispatcher::StopListeners(String const & listener_name)
|
||||
{
|
||||
for (auto listener = listeners_.first_item(); listener; listener = listener->next_item())
|
||||
for (auto& listener : listeners_)
|
||||
{
|
||||
if (listener->IsName(listener_name))
|
||||
{
|
||||
|
|
@ -92,21 +97,18 @@ namespace kiwano
|
|||
|
||||
void EventDispatcher::RemoveListeners(String const & listener_name)
|
||||
{
|
||||
EventListenerPtr next;
|
||||
for (auto listener = listeners_.first_item(); listener; listener = next)
|
||||
for (auto& listener : listeners_)
|
||||
{
|
||||
next = listener->next_item();
|
||||
|
||||
if (listener->IsName(listener_name))
|
||||
{
|
||||
listeners_.remove(listener);
|
||||
listener->Remove();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void EventDispatcher::StartListeners(const EventType& type)
|
||||
{
|
||||
for (auto listener = listeners_.first_item(); listener; listener = listener->next_item())
|
||||
for (auto& listener : listeners_)
|
||||
{
|
||||
if (listener->type_ == type)
|
||||
{
|
||||
|
|
@ -117,7 +119,7 @@ namespace kiwano
|
|||
|
||||
void EventDispatcher::StopListeners(const EventType& type)
|
||||
{
|
||||
for (auto listener = listeners_.first_item(); listener; listener = listener->next_item())
|
||||
for (auto& listener : listeners_)
|
||||
{
|
||||
if (listener->type_ == type)
|
||||
{
|
||||
|
|
@ -128,16 +130,42 @@ namespace kiwano
|
|||
|
||||
void EventDispatcher::RemoveListeners(const EventType& type)
|
||||
{
|
||||
EventListenerPtr next;
|
||||
for (auto listener = listeners_.first_item(); listener; listener = next)
|
||||
for (auto& listener : listeners_)
|
||||
{
|
||||
next = listener->next_item();
|
||||
|
||||
if (listener->type_ == type)
|
||||
{
|
||||
listeners_.remove(listener);
|
||||
listener->Remove();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void EventDispatcher::StartAllListeners()
|
||||
{
|
||||
for (auto& listener : listeners_)
|
||||
{
|
||||
listener->Start();
|
||||
}
|
||||
}
|
||||
|
||||
void EventDispatcher::StopAllListeners()
|
||||
{
|
||||
for (auto& listener : listeners_)
|
||||
{
|
||||
listener->Stop();
|
||||
}
|
||||
}
|
||||
|
||||
void EventDispatcher::RemoveAllListeners()
|
||||
{
|
||||
for (auto& listener : listeners_)
|
||||
{
|
||||
listener->Remove();
|
||||
}
|
||||
}
|
||||
|
||||
const EventDispatcher::Listeners& EventDispatcher::GetAllListeners() const
|
||||
{
|
||||
return listeners_;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -23,34 +23,40 @@
|
|||
|
||||
namespace kiwano
|
||||
{
|
||||
/**
|
||||
* \~chinese
|
||||
* @brief 事件分发系统
|
||||
*/
|
||||
class KGE_API EventDispatcher
|
||||
{
|
||||
public:
|
||||
using Listeners = IntrusiveList<EventListenerPtr>;
|
||||
|
||||
public:
|
||||
// 添加监听器
|
||||
EventListener* AddListener(
|
||||
EventListenerPtr listener
|
||||
);
|
||||
/// \~chinese
|
||||
/// @brief 添加监听器
|
||||
EventListener* AddListener(EventListenerPtr listener);
|
||||
|
||||
// 添加监听器
|
||||
EventListener* AddListener(
|
||||
EventListener* listener
|
||||
);
|
||||
/// \~chinese
|
||||
/// @brief 添加监听器
|
||||
EventListener* AddListener(EventListener* listener);
|
||||
|
||||
// 添加监听器
|
||||
EventListener* AddListener(
|
||||
EventType type,
|
||||
EventListener::Callback callback
|
||||
);
|
||||
/// \~chinese
|
||||
/// @brief 添加监听器
|
||||
/// @param type 监听的事件类型
|
||||
/// @param callback 回调函数
|
||||
EventListener* AddListener(EventType type, EventListener::Callback callback);
|
||||
|
||||
// 添加监听器
|
||||
EventListener* AddListener(
|
||||
String const& name,
|
||||
EventType type,
|
||||
EventListener::Callback callback
|
||||
);
|
||||
/// \~chinese
|
||||
/// @brief 添加监听器
|
||||
/// @param name 监听器名称
|
||||
/// @param type 监听的事件类型
|
||||
/// @param callback 回调函数
|
||||
EventListener* AddListener(String const& name, EventType type, EventListener::Callback callback);
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 添加监听器
|
||||
/// @tparam _EventTy 事件类型
|
||||
/// @param callback 回调函数
|
||||
template <
|
||||
typename _EventTy,
|
||||
typename = typename std::enable_if<IsEvent<_EventTy>::value, int>::type
|
||||
|
|
@ -60,6 +66,11 @@ namespace kiwano
|
|||
return AddListener(KGE_EVENT(_EventTy), callback);
|
||||
}
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 添加监听器
|
||||
/// @tparam _EventTy 事件类型
|
||||
/// @param name 监听器名称
|
||||
/// @param callback 回调函数
|
||||
template <
|
||||
typename _EventTy,
|
||||
typename = typename std::enable_if<IsEvent<_EventTy>::value, int>
|
||||
|
|
@ -69,36 +80,55 @@ namespace kiwano
|
|||
return AddListener(name, KGE_EVENT(_EventTy), callback);
|
||||
}
|
||||
|
||||
// 启动监听器
|
||||
void StartListeners(
|
||||
String const& listener_name
|
||||
);
|
||||
/// \~chinese
|
||||
/// @brief 启动监听器
|
||||
/// @param name 监听器名称
|
||||
void StartListeners(String const& name);
|
||||
|
||||
// 停止监听器
|
||||
void StopListeners(
|
||||
String const& listener_name
|
||||
);
|
||||
/// \~chinese
|
||||
/// @brief 停止监听器
|
||||
/// @param name 监听器名称
|
||||
void StopListeners(String const& name);
|
||||
|
||||
// 移除监听器
|
||||
void RemoveListeners(
|
||||
String const& listener_name
|
||||
);
|
||||
/// \~chinese
|
||||
/// @brief 移除监听器
|
||||
/// @param name 监听器名称
|
||||
void RemoveListeners(String const& name);
|
||||
|
||||
// 启动监听器
|
||||
void StartListeners(
|
||||
const EventType& type
|
||||
);
|
||||
/// \~chinese
|
||||
/// @brief 启动监听器
|
||||
/// @param type 监听的事件类型
|
||||
void StartListeners(const EventType& type);
|
||||
|
||||
// 停止监听器
|
||||
void StopListeners(
|
||||
const EventType& type
|
||||
);
|
||||
/// \~chinese
|
||||
/// @brief 停止监听器
|
||||
/// @param type 监听的事件类型
|
||||
void StopListeners(const EventType& type);
|
||||
|
||||
// 移除监听器
|
||||
void RemoveListeners(
|
||||
const EventType& type
|
||||
);
|
||||
/// \~chinese
|
||||
/// @brief 移除监听器
|
||||
/// @param type 监听的事件类型
|
||||
void RemoveListeners(const EventType& type);
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 启动所有监听器
|
||||
void StartAllListeners();
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 停止所有监听器
|
||||
void StopAllListeners();
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 移除所有监听器
|
||||
void RemoveAllListeners();
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 获取所有监听器
|
||||
const Listeners& GetAllListeners() const;
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 分发事件
|
||||
/// @param evt 事件
|
||||
virtual void Dispatch(Event& evt);
|
||||
|
||||
private:
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@ namespace kiwano
|
|||
: type_()
|
||||
, callback_()
|
||||
, running_(true)
|
||||
, removeable_(false)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -30,7 +30,10 @@ namespace kiwano
|
|||
|
||||
KGE_DECLARE_SMART_PTR(EventListener);
|
||||
|
||||
// ʼþ¼àÌýÆ÷
|
||||
/**
|
||||
* \~chinese
|
||||
* @brief 事件监听器
|
||||
*/
|
||||
class KGE_API EventListener
|
||||
: public ObjectBase
|
||||
, protected IntrusiveListItem<EventListenerPtr>
|
||||
|
|
@ -39,57 +42,107 @@ namespace kiwano
|
|||
friend IntrusiveList<EventListenerPtr>;
|
||||
|
||||
public:
|
||||
/// \~chinese
|
||||
/// @brief 监听器回调函数
|
||||
using Callback = Function<void(Event&)>;
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 构造空监听器
|
||||
EventListener();
|
||||
|
||||
EventListener(
|
||||
EventType type,
|
||||
Callback const& callback
|
||||
);
|
||||
/// \~chinese
|
||||
/// @brief 构造监听器
|
||||
/// @param type 监听的事件类型
|
||||
/// @param callback 回调函数
|
||||
EventListener(EventType type, Callback const& callback);
|
||||
|
||||
EventListener(
|
||||
String const& name,
|
||||
EventType type,
|
||||
Callback const& callback
|
||||
);
|
||||
/// \~chinese
|
||||
/// @brief 构造监听器
|
||||
/// @param name 监听器名称
|
||||
/// @param type 监听的事件类型
|
||||
/// @param callback 回调函数
|
||||
EventListener(String const& name, EventType type, Callback const& callback);
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 构造监听器
|
||||
/// @tparam _EventTy 事件类型
|
||||
/// @param callback 回调函数
|
||||
template <
|
||||
typename _EventTy,
|
||||
typename = typename std::enable_if<IsEvent<_EventTy>::value, int>::type
|
||||
>
|
||||
EventListener(Callback const& callback)
|
||||
inline EventListener(Callback const& callback)
|
||||
: EventListener(KGE_EVENT(_EventTy), callback)
|
||||
{
|
||||
}
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 构造监听器
|
||||
/// @tparam _EventTy 事件类型
|
||||
/// @param name 监听器名称
|
||||
/// @param callback 回调函数
|
||||
template <
|
||||
typename _EventTy,
|
||||
typename = typename std::enable_if<IsEvent<_EventTy>::value, int>::type
|
||||
>
|
||||
EventListener(String const& name, Callback const& callback)
|
||||
inline EventListener(String const& name, Callback const& callback)
|
||||
: EventListener(name, KGE_EVENT(_EventTy), callback)
|
||||
{
|
||||
}
|
||||
|
||||
virtual ~EventListener();
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 启动监听器
|
||||
void Start();
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 停止监听器
|
||||
void Stop();
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 移除监听器
|
||||
void Remove();
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 是否正在运行
|
||||
bool IsRunning() const;
|
||||
|
||||
Callback GetCallback() const;
|
||||
/// \~chinese
|
||||
/// @brief 是否可移除
|
||||
bool IsRemoveable() const;
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 获取回调函数
|
||||
const Callback& GetCallback() const;
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 设置回调函数
|
||||
void SetCallback(Callback const& cb);
|
||||
|
||||
EventType const& GetEventType() const;
|
||||
/// \~chinese
|
||||
/// @brief 获取监听的事件类型
|
||||
EventType GetEventType() const;
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 设置监听的事件类型
|
||||
void SetEventType(EventType const& type);
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 设置监听的事件类型
|
||||
/// @tparam _EventTy 事件类型
|
||||
template <
|
||||
typename _EventTy,
|
||||
typename = typename std::enable_if<IsEvent<_EventTy>::value, int>::type
|
||||
>
|
||||
inline void SetEventType()
|
||||
{
|
||||
SetEventType(KGE_EVENT(_EventTy));
|
||||
}
|
||||
|
||||
private:
|
||||
bool running_;
|
||||
bool removeable_;
|
||||
EventType type_;
|
||||
Callback callback_;
|
||||
};
|
||||
|
|
@ -105,12 +158,22 @@ namespace kiwano
|
|||
running_ = false;
|
||||
}
|
||||
|
||||
inline void EventListener::Remove()
|
||||
{
|
||||
removeable_ = true;
|
||||
}
|
||||
|
||||
inline bool EventListener::IsRunning() const
|
||||
{
|
||||
return running_;
|
||||
}
|
||||
|
||||
inline EventListener::Callback EventListener::GetCallback() const
|
||||
inline bool EventListener::IsRemoveable() const
|
||||
{
|
||||
return removeable_;
|
||||
}
|
||||
|
||||
inline const EventListener::Callback& EventListener::GetCallback() const
|
||||
{
|
||||
return callback_;
|
||||
}
|
||||
|
|
@ -120,7 +183,7 @@ namespace kiwano
|
|||
callback_ = cb;
|
||||
}
|
||||
|
||||
inline EventType const& EventListener::GetEventType() const
|
||||
inline EventType EventListener::GetEventType() const
|
||||
{
|
||||
return type_;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,22 +24,45 @@
|
|||
|
||||
namespace kiwano
|
||||
{
|
||||
// DLL ¿â
|
||||
/**
|
||||
* \~chinese
|
||||
* @brief DLL库
|
||||
*/
|
||||
class KGE_API Library
|
||||
{
|
||||
public:
|
||||
/// \~chinese
|
||||
/// @brief 构造DLL库
|
||||
Library();
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 构造DLL库
|
||||
/// @param lib DLL文件路径
|
||||
Library(String const& lib);
|
||||
|
||||
virtual ~Library();
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 加载DLL
|
||||
/// @param lib DLL文件路径
|
||||
bool Load(String const& lib);
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 是否有效
|
||||
bool IsValid() const;
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 释放DLL
|
||||
void Free();
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 检索指定的DLL中的输出库函数地址
|
||||
/// @param proc_name 函数名
|
||||
FARPROC GetProcess(String const& proc_name);
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 检索指定的DLL中的输出库函数地址
|
||||
/// @param proc_name 函数名
|
||||
template <typename _Proc>
|
||||
inline _Proc GetProcess(String const& proc_name)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -72,14 +72,24 @@ namespace kiwano
|
|||
String DumpObject();
|
||||
|
||||
public:
|
||||
/// \~chinese
|
||||
/// @brief 是否启用了内存泄漏追踪
|
||||
static bool IsTracingLeaks();
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 开始追踪内存泄漏
|
||||
static void StartTracingLeaks();
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 停止追踪内存泄漏
|
||||
static void StopTracingLeaks();
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 打印所有追踪中的对象信息
|
||||
static void DumpTracingObjects();
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 获取所有追踪中的对象
|
||||
static Vector<ObjectBase*>& GetTracingObjects();
|
||||
|
||||
private:
|
||||
|
|
|
|||
|
|
@ -69,7 +69,7 @@ namespace kiwano
|
|||
if (timers_.empty())
|
||||
return;
|
||||
|
||||
for (auto timer = timers_.first_item().get(); timer; timer = timer->next_item().get())
|
||||
for (auto& timer : timers_)
|
||||
{
|
||||
if (timer->IsName(name))
|
||||
{
|
||||
|
|
@ -83,7 +83,7 @@ namespace kiwano
|
|||
if (timers_.empty())
|
||||
return;
|
||||
|
||||
for (auto timer = timers_.first_item().get(); timer; timer = timer->next_item().get())
|
||||
for (auto& timer : timers_)
|
||||
{
|
||||
if (timer->IsName(name))
|
||||
{
|
||||
|
|
@ -97,10 +97,8 @@ namespace kiwano
|
|||
if (timers_.empty())
|
||||
return;
|
||||
|
||||
TimerPtr next;
|
||||
for (auto timer = timers_.first_item(); timer; timer = next)
|
||||
for (auto& timer : timers_)
|
||||
{
|
||||
next = timer->next_item();
|
||||
if (timer->IsName(name))
|
||||
{
|
||||
timer->Remove();
|
||||
|
|
@ -113,7 +111,7 @@ namespace kiwano
|
|||
if (timers_.empty())
|
||||
return;
|
||||
|
||||
for (auto timer = timers_.first_item().get(); timer; timer = timer->next_item().get())
|
||||
for (auto& timer : timers_)
|
||||
{
|
||||
timer->Stop();
|
||||
}
|
||||
|
|
@ -124,7 +122,7 @@ namespace kiwano
|
|||
if (timers_.empty())
|
||||
return;
|
||||
|
||||
for (auto timer = timers_.first_item().get(); timer; timer = timer->next_item().get())
|
||||
for (auto& timer : timers_)
|
||||
{
|
||||
timer->Start();
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue