00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef __EVENTMANAGER_H__
00017 #define __EVENTMANAGER_H__
00018
00019
00020 #include "../dependencies.h"
00021 #include "ReferenceCounted.h"
00022
00023
00024 typedef sigslot::signal1<void*> EventSlot;
00025
00026
00027
00029 class EventManager : public IEventReceiver, public ReferenceCounted
00030 {
00031 public:
00032
00033
00035 EventManager();
00037 ~EventManager();
00038
00040 void init();
00042 void clear();
00043
00044
00047 void grab();
00050 void drop();
00051
00052
00056 bool createEventGroup(const std::string &groupName);
00061 bool createEventSlot(const std::string &groupName, const std::string &slotName);
00062
00069 template<typename T>
00070 bool connectEventSignal(const std::string &groupName, const std::string &slotName,
00071 T *t, void (T::*m)(void*))
00072 {
00073
00074 std::map<std::string, std::map<std::string, EventSlot> >::iterator itGroups;
00075 itGroups = mEvents.find(groupName);
00076
00077 if(itGroups == mEvents.end())
00078 return false;
00079
00080 std::map<std::string, EventSlot> &group = itGroups->second;
00081
00082
00083 std::map<std::string, EventSlot>::iterator itSlots = group.find(slotName);
00084
00085 if(itSlots == group.end())
00086 return false;
00087
00088 cout << "Success!\n";
00089 EventSlot &signal = itSlots->second;
00090
00091
00092 signal.connect(t, m);
00093 return true;
00094 };
00095
00101 template<typename T>
00102 bool disconnectEventSignal(const std::string &groupName, const std::string &slotName, T *t)
00103 {
00104
00105 std::map<std::string, std::map<std::string, EventSlot> >::iterator itGroups;
00106 itGroups = mEvents.find(groupName);
00107
00108 if(itGroups == mEvents.end())
00109 return false;
00110
00111 std::map<std::string, EventSlot> &group = itGroups->second;
00112
00113
00114 std::map<std::string, EventSlot>::iterator itSlots = group.find(slotName);
00115
00116 if(itSlots == group.end())
00117 return false;
00118
00119 EventSlot &signal = itSlots->second;
00120
00121
00122 signal.disconnect(t);
00123 return true;
00124 };
00125
00130 bool emitEvent(const std::string &groupName, const std::string &slotName, void* p = 0);
00131
00133 bool getIsKeyDown(EKEY_CODE keyCode) const;
00135 bool getIsKeyUp(EKEY_CODE keyCode) const;
00136
00138 s32 getMouseX() const;
00140 s32 getMouseY() const;
00142 const vector2di& getMousePos() const;
00144 f32 getMouseWheel() const;
00145
00147 void removeEventGroups();
00151 bool removeEventSlots(const std::string &groupName);
00155 bool removeEventGroup(const std::string &groupName);
00160 bool removeEventSlot(const std::string &groupName, const std::string &slotName);
00161
00164 virtual bool OnEvent(const SEvent &event);
00165
00166 private:
00167
00168
00169 void generateKeyMap();
00170
00171
00172 std::map<std::string, std::map<std::string, EventSlot> > mEvents;
00173
00174 bool mKeyState[KEY_KEY_CODES_COUNT];
00175 std::map<EKEY_CODE, std::string> mKeyMap;
00176
00177 vector2di mMousePos;
00178 f32 mMouseWheel;
00179
00180 };
00181
00182 #endif