mvp events

This commit is contained in:
Ben
2021-08-18 17:55:54 +01:00
parent 55a3a9e4e4
commit fde9c91c9d
3 changed files with 57 additions and 15 deletions

View File

@@ -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 )

View File

@@ -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;
};

View File

@@ -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;
}