mvp events
This commit is contained in:
@@ -19,7 +19,8 @@ EventListener::~EventListener()
|
||||
|
||||
void EventListener::RegisterAsSink( std::string system, int layer )
|
||||
{
|
||||
|
||||
mListenerID = EventManager::GetInstance().RegisterSink( this, system );
|
||||
AEON_ASSERT( mListenerID != -1, "Cannot register event sink" );
|
||||
}
|
||||
|
||||
void EventListener::DeRegisterAsSink( std::string system )
|
||||
@@ -50,7 +51,7 @@ EventDispatcher::~EventDispatcher()
|
||||
|
||||
void EventDispatcher::RegisterAsSource( std::string system )
|
||||
{
|
||||
mDispatcherID = EventManager::GetInstance().RegisterSource(*this, system);
|
||||
mDispatcherID = EventManager::GetInstance().RegisterSource( this, system );
|
||||
AEON_ASSERT( mDispatcherID != -1, "Cannot register event source" );
|
||||
}
|
||||
|
||||
@@ -61,12 +62,14 @@ void EventDispatcher::DeRegisterAsSource( std::string system )
|
||||
|
||||
void EventDispatcher::Dispatch( GenericEvent e )
|
||||
{
|
||||
|
||||
EventManager::GetInstance().Dispatch( mDispatcherID, e );
|
||||
}
|
||||
|
||||
void EventDispatcher::Dispatch( std::string data )
|
||||
{
|
||||
|
||||
GenericEvent e;
|
||||
e.Data = data;
|
||||
EventManager::GetInstance().Dispatch( mDispatcherID, e );
|
||||
}
|
||||
|
||||
|
||||
@@ -80,18 +83,31 @@ EventManager::~EventManager()
|
||||
|
||||
}
|
||||
|
||||
int EventManager::RegisterSource( EventDispatcher& source, std::string system )
|
||||
int EventManager::RegisterSource( EventDispatcher* source, std::string system )
|
||||
{
|
||||
int id = mNextHeighest;
|
||||
mSources[id] = system;
|
||||
|
||||
mNextHeighest++;
|
||||
return id;
|
||||
}
|
||||
|
||||
int EventManager::RegisterSink( EventListener& source, std::string system )
|
||||
int EventManager::RegisterSink( EventListener* sink, std::string system )
|
||||
{
|
||||
return -1;
|
||||
int id = mNextHeighest;
|
||||
mListeners[id] = sink;
|
||||
|
||||
// if there is no sinks for the system, make sure there is one
|
||||
if ( !mSinks.count( system ) )
|
||||
{
|
||||
std::vector<std::tuple<EventListener*, int>> v;
|
||||
mSinks.insert( { system, v } );
|
||||
}
|
||||
|
||||
auto& sinkVector = mSinks[system];
|
||||
sinkVector.push_back( { sink, id } );
|
||||
|
||||
mNextHeighest++;
|
||||
return id;
|
||||
}
|
||||
|
||||
void EventManager::RemoveSource( int dispatcherID, std::string system )
|
||||
@@ -111,7 +127,8 @@ void EventManager::Dispatch( int dispatcherID, GenericEvent e )
|
||||
|
||||
for ( auto& listenerPair : sinks )
|
||||
{
|
||||
int handled = std::get<0>(listenerPair).EventRecieved(e);
|
||||
EventListener* listener = std::get<0>( listenerPair );
|
||||
bool handled = listener->EventRecieved(e);
|
||||
if ( handled ) e.Handled = handled;
|
||||
|
||||
if ( e.Handled )
|
||||
|
||||
@@ -89,8 +89,8 @@ public:
|
||||
EventManager();
|
||||
~EventManager();
|
||||
|
||||
int RegisterSource( EventDispatcher& source, std::string system );
|
||||
int RegisterSink( EventListener& sink, std::string system );
|
||||
int RegisterSource( EventDispatcher* source, std::string system );
|
||||
int RegisterSink( EventListener* sink, std::string system );
|
||||
|
||||
void RemoveSource( int dispatcherID, std::string system );
|
||||
void RemoveSink( int listenerID, std::string system );
|
||||
@@ -99,12 +99,12 @@ public:
|
||||
private:
|
||||
|
||||
// indexed by listener ID
|
||||
std::map<int, EventListener&> mListeners;
|
||||
std::map<int, const EventListener*> mListeners;
|
||||
// indexed by dispatcher ID
|
||||
std::map<int, std::string> mSources;
|
||||
// indexed by (sink) system ID
|
||||
// their position in the vector is their layer
|
||||
std::map<std::string, std::vector<std::tuple<EventListener&, int>>> mSinks;
|
||||
std::map<std::string, std::vector<std::tuple<EventListener*, int>>> mSinks;
|
||||
|
||||
int mNextHeighest = 0;
|
||||
};
|
||||
|
||||
@@ -26,6 +26,7 @@ public:
|
||||
|
||||
class SomeSystem : public Aeon::Core::EventListener
|
||||
{
|
||||
public:
|
||||
SomeSystem()
|
||||
{
|
||||
RegisterAsSink( "System1", 0 );
|
||||
@@ -39,7 +40,28 @@ class SomeSystem : public Aeon::Core::EventListener
|
||||
bool EventRecieved( Aeon::Core::GenericEvent& e ) override
|
||||
{
|
||||
std::cout << e.Source << ":" << e.Type << ":" << e.Sink << ":" << e.Data << std::endl;
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
class SomeOtherSystem : public Aeon::Core::EventListener
|
||||
{
|
||||
public:
|
||||
SomeOtherSystem()
|
||||
{
|
||||
RegisterAsSink( "System1", 0 );
|
||||
}
|
||||
|
||||
~SomeOtherSystem() override
|
||||
{
|
||||
DeRegisterAsSink( "System1" );
|
||||
}
|
||||
|
||||
bool EventRecieved( Aeon::Core::GenericEvent& e ) override
|
||||
{
|
||||
std::cout << e.Source << ":" << e.Type << ":" << e.Sink << ":" << e.Data << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
};
|
||||
@@ -48,9 +70,12 @@ int main( int argc, char** argv )
|
||||
{
|
||||
ExampleGame game;
|
||||
|
||||
SomeSystem system1;
|
||||
SomeOtherSystem system2;
|
||||
|
||||
Aeon::Core::EventDispatcher eventDispatcher;
|
||||
eventDispatcher.RegisterAsSource( "System1" );
|
||||
eventDispatcher.Dispatch( Aeon::Core::KeyboardEvent( 12, 1 ) );
|
||||
eventDispatcher.Dispatch( "bro" );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user