1 #ifndef UGDK_SYSTEM_EVENTHANDLER_H_
2 #define UGDK_SYSTEM_EVENTHANDLER_H_
9 #include <forward_list>
11 #include <unordered_map>
20 template <
class Event>
23 virtual void Handle(
const Event& ev) = 0;
26 template <
class Event>
29 template<
typename Handler>
32 void Handle(
const Event& ev)
override {
37 std::function<void (const Event&)> handler_;
47 template<
class Event,
class Handler>
58 event_handlers_[type].push_front(listener);
59 return listener.get();
69 object_listeners_.push_front(listener);
75 auto handlers = event_handlers_.find(type);
76 if(handlers == event_handlers_.end())
return;
78 handlers->second.remove_if([listener](
const std::shared_ptr<IListener>& val) {
79 return val.get() == listener;
89 object_listeners_.remove(listener);
94 dispatch_as_global_ = flag;
101 template<
class Event>
103 static bool processing_global_event =
false;
104 if (processing_global_event)
return;
106 processing_global_event =
true;
109 processing_global_event =
false;
113 template<
class Event>
115 if (dispatch_as_global_)
118 auto handlers = event_handlers_.find(
typeid(Event));
119 if (handlers != event_handlers_.end())
120 for (
const auto& listener : handlers->second) {
122 assert(specific_listener);
123 specific_listener->
Handle(ev);
126 for (
IListener* listener : object_listeners_) {
128 specific_listener->Handle(ev);
134 typedef std::forward_list< std::shared_ptr<IListener> > ListenerVector;
136 std::unordered_map<std::type_index, ListenerVector> event_handlers_;
137 std::forward_list<IListener*> object_listeners_;
138 bool dispatch_as_global_;
144 #endif // UGDK_SYSTEM_EVENTHANDLER_H_
virtual ~IListener()
Definition: eventhandler.h:18
IListener * AddListener(void(*handler)(const Event &))
Definition: eventhandler.h:53
void RemoveObjectListener(IListener *listener)
Definition: eventhandler.h:88
IListener * AddListener(Handler handler)
Definition: eventhandler.h:48
void RaiseEvent(const Event &ev) const
Definition: eventhandler.h:114
EventHandler & GetCurrentSceneEventHandler()
Returns the EventHandler for the current scene.
void RemoveListener(const std::type_index &type, IListener *listener)
Definition: eventhandler.h:74
void RemoveListener(IListener *listener)
Definition: eventhandler.h:84
static void RaiseGlobalEvent(const Event &ev)
Dispatches a global event.
Definition: eventhandler.h:102
Definition: animation.h:11
void Handle(const Event &ev) override
Definition: eventhandler.h:32
EventHandler()
Definition: eventhandler.h:42
Definition: eventhandler.h:40
void AddObjectListener(IListener *listener)
Definition: eventhandler.h:68
void set_dispatch_as_global(bool flag)
If true, events raised on this handler will be raised as global events.
Definition: eventhandler.h:93
Definition: eventhandler.h:21
FunctionListener(Handler handler)
Definition: eventhandler.h:30
IListener * AddRawListener(const std::type_index &type, const std::shared_ptr< IListener > &listener)
Definition: eventhandler.h:57
Definition: eventhandler.h:18
EventHandler & GlobalEventHandler()
Returns the global EventHandler.
virtual void Handle(const Event &ev)=0
~EventHandler()
Definition: eventhandler.h:43
Definition: eventhandler.h:27