Add Core::CancellableEventBase
- Added Core::CancellableEventBase - Updated Core::EventManager to immediately stop event dispatch if one of listeners set it as cancelled
This commit is contained in:
parent
4087241cdc
commit
92061c2fa8
@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
namespace Core
|
namespace Core
|
||||||
{
|
{
|
||||||
|
class CancellableEventBase;
|
||||||
|
|
||||||
template<typename EventT, typename = void>
|
template<typename EventT, typename = void>
|
||||||
struct EventHasInit : std::false_type {};
|
struct EventHasInit : std::false_type {};
|
||||||
|
|
||||||
@ -20,10 +22,32 @@ namespace Core
|
|||||||
template<typename EventT>
|
template<typename EventT>
|
||||||
static constexpr bool EventHasDeinit_v = EventHasDeinit<EventT>::value;
|
static constexpr bool EventHasDeinit_v = EventHasDeinit<EventT>::value;
|
||||||
|
|
||||||
|
template<typename EventT>
|
||||||
|
using EventIsCancellable = std::is_base_of<CancellableEventBase, EventT>;
|
||||||
|
|
||||||
|
template<typename EventT>
|
||||||
|
constexpr bool EventIsCancellable_v = EventIsCancellable<EventT>::value;
|
||||||
|
|
||||||
|
// Base class for all events. Not to be used directly.
|
||||||
class EventBase
|
class EventBase
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
EventBase() = default;
|
EventBase() = default;
|
||||||
virtual ~EventBase() = default;
|
virtual ~EventBase() = default;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Base class for events that can be cancelled. Not to be used directly.
|
||||||
|
class CancellableEventBase : public EventBase
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
CancellableEventBase() = default;
|
||||||
|
virtual ~CancellableEventBase() = default;
|
||||||
|
|
||||||
|
public:
|
||||||
|
virtual void Cancel() final { m_cancelled = true; }
|
||||||
|
virtual bool IsCancelled() const final { return m_cancelled; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool m_cancelled = false;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@ -42,6 +42,10 @@ namespace Core {
|
|||||||
for (auto& wrapper : m_listeners) {
|
for (auto& wrapper : m_listeners) {
|
||||||
wrapper.listener(event);
|
wrapper.listener(event);
|
||||||
|
|
||||||
|
if constexpr (EventIsCancellable_v<EventT>) {
|
||||||
|
if (event.IsCancelled()) break;
|
||||||
|
}
|
||||||
|
|
||||||
if (wrapper.isToBeRemoved) {
|
if (wrapper.isToBeRemoved) {
|
||||||
spdlog::debug("EventManager: Skipping listener id {} marked for removal for event type: {}", wrapper.id, typeid(EventT).name());
|
spdlog::debug("EventManager: Skipping listener id {} marked for removal for event type: {}", wrapper.id, typeid(EventT).name());
|
||||||
continue;
|
continue;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user