[Orxonox-commit 1145] r5866 - in code/branches/core5/src: libraries/core modules/objects/eventsystem
landauf at orxonox.net
landauf at orxonox.net
Sat Oct 3 18:32:05 CEST 2009
Author: landauf
Date: 2009-10-03 18:32:05 +0200 (Sat, 03 Oct 2009)
New Revision: 5866
Modified:
code/branches/core5/src/libraries/core/BaseObject.cc
code/branches/core5/src/libraries/core/BaseObject.h
code/branches/core5/src/libraries/core/Event.cc
code/branches/core5/src/libraries/core/Event.h
code/branches/core5/src/libraries/core/EventIncludes.h
code/branches/core5/src/libraries/core/Identifier.h
code/branches/core5/src/modules/objects/eventsystem/EventListener.cc
code/branches/core5/src/modules/objects/eventsystem/EventListener.h
code/branches/core5/src/modules/objects/eventsystem/EventTarget.cc
code/branches/core5/src/modules/objects/eventsystem/EventTarget.h
Log:
some cleanup in the eventsystem. not sure if everything still works, but there are more changes to come.
Modified: code/branches/core5/src/libraries/core/BaseObject.cc
===================================================================
--- code/branches/core5/src/libraries/core/BaseObject.cc 2009-10-03 15:36:35 UTC (rev 5865)
+++ code/branches/core5/src/libraries/core/BaseObject.cc 2009-10-03 16:32:05 UTC (rev 5866)
@@ -93,11 +93,11 @@
{
if (this->isInitialized())
{
- for (std::list<BaseObject*>::const_iterator it = this->events_.begin(); it != this->events_.end(); ++it)
- (*it)->unregisterEventListener(this);
+ for (std::map<BaseObject*, std::string>::const_iterator it = this->eventSources_.begin(); it != this->eventSources_.end(); )
+ this->removeEventSource((it++)->first);
- for (std::map<BaseObject*, std::string>::const_iterator it = this->eventListeners_.begin(); it != this->eventListeners_.end(); ++it)
- it->first->removeEvent(this);
+ for (std::set<BaseObject*>::const_iterator it = this->eventListeners_.begin(); it != this->eventListeners_.end(); )
+ (*(it++))->removeEventSource(this);
for (std::map<std::string, EventContainer*>::const_iterator it = this->eventContainers_.begin(); it != this->eventContainers_.end(); ++it)
delete it->second;
@@ -144,9 +144,10 @@
for (std::list<std::string>::iterator it = eventnames.begin(); it != eventnames.end(); ++it)
{
std::string sectionname = (*it);
- ExecutorMember<BaseObject>* loadexecutor = createExecutor(createFunctor(&BaseObject::addEvent), std::string( "BaseObject" ) + "::" + "addEvent");
- ExecutorMember<BaseObject>* saveexecutor = createExecutor(createFunctor(&BaseObject::getEvent), std::string( "BaseObject" ) + "::" + "getEvent");
+ ExecutorMember<BaseObject>* loadexecutor = createExecutor(createFunctor(&BaseObject::addEventSource), std::string( "BaseObject" ) + "::" + "addEventSource");
+ ExecutorMember<BaseObject>* saveexecutor = createExecutor(createFunctor(&BaseObject::getEventSource), std::string( "BaseObject" ) + "::" + "getEventSource");
loadexecutor->setDefaultValue(1, sectionname);
+ saveexecutor->setDefaultValue(1, sectionname);
XMLPortClassObjectContainer<BaseObject, BaseObject>* container = 0;
container = static_cast<XMLPortClassObjectContainer<BaseObject, BaseObject>*>(this->getIdentifier()->getXMLPortEventContainer(sectionname));
@@ -223,24 +224,39 @@
return 0;
}
- void BaseObject::addEvent(BaseObject* event, const std::string& sectionname)
+ /**
+ @brief Adds a new event source for a specific state.
+ @param source The object which sends events to this object
+ @param state The state of this object which will be affected by the events
+ */
+ void BaseObject::addEventSource(BaseObject* source, const std::string& state)
{
- event->registerEventListener(this, sectionname);
- this->events_.push_back(event);
+ this->eventSources_[source] = state;
+ source->registerEventListener(this);
}
- void BaseObject::removeEvent(BaseObject* event)
+ /**
+ @brief Removes an eventsource (but doesn't unregister itself at the source).
+ */
+ void BaseObject::removeEventSource(BaseObject* source)
{
- this->events_.remove(event);
+ this->eventSources_.erase(source);
+ source->unregisterEventListener(this);
}
- BaseObject* BaseObject::getEvent(unsigned int index) const
+ /**
+ @brief Returns an eventsource with a given index.
+ */
+ BaseObject* BaseObject::getEventSource(unsigned int index, const std::string& state) const
{
unsigned int i = 0;
- for (std::list<BaseObject*>::const_iterator it = this->events_.begin(); it != this->events_.end(); ++it)
+ for (std::map<BaseObject*, std::string>::const_iterator it = this->eventSources_.begin(); it != this->eventSources_.end(); ++it)
{
+ if (it->second != state)
+ continue;
+
if (i == index)
- return (*it);
+ return it->first;
++i;
}
return 0;
@@ -267,32 +283,44 @@
return 0;
}
+ /**
+ @brief Fires an event (without a state).
+ */
void BaseObject::fireEvent()
{
this->fireEvent(true);
this->fireEvent(false);
}
+ /**
+ @brief Fires an event which activates or deactivates a state.
+ */
void BaseObject::fireEvent(bool activate)
{
this->fireEvent(activate, this);
}
+ /**
+ @brief Fires an event which activates or deactivates a state with agiven originator (the object which sends the event).
+ */
void BaseObject::fireEvent(bool activate, BaseObject* originator)
{
Event event(activate, originator);
- for (std::map<BaseObject*, std::string>::iterator it = this->eventListeners_.begin(); it != this->eventListeners_.end(); ++it)
+ for (std::set<BaseObject*>::iterator it = this->eventListeners_.begin(); it != this->eventListeners_.end(); ++it)
{
- event.sectionname_ = it->second;
- it->first->processEvent(event);
+ event.sectionname_ = (*it)->eventSources_[this];
+ (*it)->processEvent(event);
}
}
+ /**
+ @brief Fires an event, using the Event struct.
+ */
void BaseObject::fireEvent(Event& event)
{
- for (std::map<BaseObject*, std::string>::iterator it = this->eventListeners_.begin(); it != this->eventListeners_.end(); ++it)
- it->first->processEvent(event);
+ for (std::set<BaseObject*>::iterator it = this->eventListeners_.begin(); it != this->eventListeners_.end(); ++it)
+ (*it)->processEvent(event);
}
void BaseObject::processEvent(Event& event)
Modified: code/branches/core5/src/libraries/core/BaseObject.h
===================================================================
--- code/branches/core5/src/libraries/core/BaseObject.h 2009-10-03 15:36:35 UTC (rev 5865)
+++ code/branches/core5/src/libraries/core/BaseObject.h 2009-10-03 16:32:05 UTC (rev 5866)
@@ -151,6 +151,10 @@
inline Gametype* getOldGametype() const { return this->oldGametype_; }
virtual void changedGametype() {}
+ void addEventSource(BaseObject* source, const std::string& state);
+ void removeEventSource(BaseObject* source);
+ BaseObject* getEventSource(unsigned int index, const std::string& state) const;
+
void fireEvent();
void fireEvent(bool activate);
void fireEvent(bool activate, BaseObject* originator);
@@ -158,24 +162,22 @@
virtual void processEvent(Event& event);
- inline void registerEventListener(BaseObject* object, const std::string& sectionname)
- { this->eventListeners_[object] = sectionname; }
+ /** @brief Sets the indentation of the debug output in the Loader. @param indentation The indentation */
+ inline void setLoaderIndentation(const std::string& indentation) { this->loaderIndentation_ = indentation; }
+ /** @brief Returns the indentation of the debug output in the Loader. @return The indentation */
+ inline const std::string& getLoaderIndentation() const { return this->loaderIndentation_; }
+
+ protected:
+ /** @brief Adds an object which listens to the events of this object. */
+ inline void registerEventListener(BaseObject* object)
+ { this->eventListeners_.insert(object); }
+ /** @brief Removes an event listener from this object. */
inline void unregisterEventListener(BaseObject* object)
{ this->eventListeners_.erase(object); }
- void addEvent(BaseObject* event, const std::string& sectionname);
- void removeEvent(BaseObject* event);
- BaseObject* getEvent(unsigned int index) const;
-
void addEventContainer(const std::string& sectionname, EventContainer* container);
EventContainer* getEventContainer(const std::string& sectionname) const;
- /** @brief Sets the indentation of the debug output in the Loader. @param indentation The indentation */
- inline void setLoaderIndentation(const std::string& indentation) { this->loaderIndentation_ = indentation; }
- /** @brief Returns the indentation of the debug output in the Loader. @return The indentation */
- inline const std::string& getLoaderIndentation() const { return this->loaderIndentation_; }
-
- protected:
std::string name_; //!< The name of the object
std::string oldName_; //!< The old name of the object
mbool bActive_; //!< True = the object is active
@@ -196,13 +198,14 @@
Namespace* namespace_;
BaseObject* creator_;
SmartPtr<Scene> scene_;
+ uint32_t sceneID_;
SmartPtr<Gametype> gametype_;
Gametype* oldGametype_;
std::set<Template*> templates_;
- std::map<BaseObject*, std::string> eventListeners_;
- std::list<BaseObject*> events_;
- std::map<std::string, EventContainer*> eventContainers_;
- uint32_t sceneID_;
+
+ std::map<BaseObject*, std::string> eventSources_; //!< List of objects which send events to this object, mapped to the state which they affect
+ std::set<BaseObject*> eventListeners_; //!< List of objects which listen to the events of this object
+ std::map<std::string, EventContainer*> eventContainers_;
};
SUPER_FUNCTION(0, BaseObject, XMLPort, false);
Modified: code/branches/core5/src/libraries/core/Event.cc
===================================================================
--- code/branches/core5/src/libraries/core/Event.cc 2009-10-03 15:36:35 UTC (rev 5865)
+++ code/branches/core5/src/libraries/core/Event.cc 2009-10-03 16:32:05 UTC (rev 5866)
@@ -29,7 +29,6 @@
#include "Event.h"
#include "BaseObject.h"
-#include "Executor.h"
namespace orxonox
{
Modified: code/branches/core5/src/libraries/core/Event.h
===================================================================
--- code/branches/core5/src/libraries/core/Event.h 2009-10-03 15:36:35 UTC (rev 5865)
+++ code/branches/core5/src/libraries/core/Event.h 2009-10-03 16:32:05 UTC (rev 5866)
@@ -47,7 +47,7 @@
class _CoreExport EventContainer
{
public:
- EventContainer(const std::string& eventname, Executor* eventfunction, Identifier* subclass) : bActive_(false), eventname_(eventname), eventfunction_(eventfunction), subclass_(subclass), activeEvents_(0) {}
+ EventContainer(const std::string& eventname, Functor* eventfunction, Identifier* subclass) : bActive_(false), eventname_(eventname), eventfunction_(eventfunction), subclass_(subclass), activeEvents_(0) {}
virtual ~EventContainer();
void process(BaseObject* object, const Event& event);
@@ -55,7 +55,7 @@
private:
bool bActive_;
std::string eventname_;
- Executor* eventfunction_;
+ Functor* eventfunction_;
Identifier* subclass_;
int activeEvents_;
Modified: code/branches/core5/src/libraries/core/EventIncludes.h
===================================================================
--- code/branches/core5/src/libraries/core/EventIncludes.h 2009-10-03 15:36:35 UTC (rev 5865)
+++ code/branches/core5/src/libraries/core/EventIncludes.h 2009-10-03 16:32:05 UTC (rev 5866)
@@ -39,31 +39,31 @@
ORXONOX_SET_EVENT_GENERIC_TEMPLATE(eventcontainer##classname##functionname, classname, eventname, functionname, event, BaseObject, __VA_ARGS__)
#define ORXONOX_SET_SUBCLASS_EVENT(classname, eventname, functionname, event, subclassname) \
+ event.castedOriginator_ = orxonox::orxonox_cast<subclassname*>(event.originator_); \
ORXONOX_SET_EVENT_GENERIC(eventcontainer##classname##functionname, classname, eventname, functionname, event, subclassname)
#define ORXONOX_SET_SUBCLASS_EVENT_TEMPLATE(classname, eventname, functionname, event, subclassname, ...) \
+ event.castedOriginator_ = orxonox::orxonox_cast<subclassname*>(event.originator_); \
ORXONOX_SET_EVENT_GENERIC_TEMPLATE(eventcontainer##classname##functionname, classname, eventname, functionname, event, subclassname, __VA_ARGS__)
#define ORXONOX_SET_EVENT_GENERIC(containername, classname, eventname, functionname, event, subclassname) \
orxonox::EventContainer* containername = this->getEventContainer(eventname); \
if (!containername) \
{ \
- ExecutorMember<classname>* executor = orxonox::createExecutor(orxonox::createFunctor(&classname::functionname, this), std::string( #classname ) + "::" + #functionname); \
- containername = new orxonox::EventContainer(std::string(eventname), executor, orxonox::ClassIdentifier<subclassname>::getIdentifier()); \
+ Functor* functor = orxonox::createFunctor(&classname::functionname, this); \
+ containername = new orxonox::EventContainer(std::string(eventname), functor, orxonox::ClassIdentifier<subclassname>::getIdentifier()); \
this->addEventContainer(eventname, containername); \
} \
- event.castedOriginator_ = orxonox::orxonox_cast<subclassname*>(event.originator_); \
containername->process(this, event)
#define ORXONOX_SET_EVENT_GENERIC_TEMPLATE(containername, classname, eventname, functionname, event, subclassname, ...) \
orxonox::EventContainer* containername = this->getEventContainer(eventname); \
if (!containername) \
{ \
- ExecutorMember<classname>* executor = orxonox::createExecutor(orxonox::createFunctor<classname, __VA_ARGS__ >(&classname::functionname, this), std::string( #classname ) + "::" + #functionname); \
- containername = new orxonox::EventContainer(std::string(eventname), executor, orxonox::ClassIdentifier<subclassname>::getIdentifier()); \
+ Functor* functor = orxonox::createFunctor<classname, __VA_ARGS__ >(&classname::functionname, this); \
+ containername = new orxonox::EventContainer(std::string(eventname), functor, orxonox::ClassIdentifier<subclassname>::getIdentifier()); \
this->addEventContainer(eventname, containername); \
} \
- event.castedOriginator_ = orxonox::orxonox_cast<subclassname*>(event.originator_); \
containername->process(this, event)
#endif /* _EventIncludes_H__ */
Modified: code/branches/core5/src/libraries/core/Identifier.h
===================================================================
--- code/branches/core5/src/libraries/core/Identifier.h 2009-10-03 15:36:35 UTC (rev 5865)
+++ code/branches/core5/src/libraries/core/Identifier.h 2009-10-03 16:32:05 UTC (rev 5866)
@@ -260,6 +260,16 @@
/** @brief Returns a const_iterator to the end of the map that stores all XMLPort objects. @return The const_iterator */
inline std::map<std::string, XMLPortObjectContainer*>::const_iterator getXMLPortObjectMapEnd() const { return this->xmlportObjectContainers_.end(); }
+ void addXMLPortParamContainer(const std::string& paramname, XMLPortParamContainer* container);
+ XMLPortParamContainer* getXMLPortParamContainer(const std::string& paramname);
+
+ void addXMLPortObjectContainer(const std::string& sectionname, XMLPortObjectContainer* container);
+ XMLPortObjectContainer* getXMLPortObjectContainer(const std::string& sectionname);
+
+
+ //////////////////
+ ///// Events /////
+ //////////////////
/** @brief Returns the map that stores all XMLPort events. @return The const_iterator */
inline const std::map<std::string, XMLPortObjectContainer*>& getXMLPortEventMap() const { return this->xmlportEventContainers_; }
/** @brief Returns a const_iterator to the beginning of the map that stores all XMLPort events. @return The const_iterator */
@@ -267,12 +277,6 @@
/** @brief Returns a const_iterator to the end of the map that stores all XMLPort events. @return The const_iterator */
inline std::map<std::string, XMLPortObjectContainer*>::const_iterator getXMLPortEventMapEnd() const { return this->xmlportEventContainers_.end(); }
- void addXMLPortParamContainer(const std::string& paramname, XMLPortParamContainer* container);
- XMLPortParamContainer* getXMLPortParamContainer(const std::string& paramname);
-
- void addXMLPortObjectContainer(const std::string& sectionname, XMLPortObjectContainer* container);
- XMLPortObjectContainer* getXMLPortObjectContainer(const std::string& sectionname);
-
void addXMLPortEventContainer(const std::string& eventname, XMLPortObjectContainer* container);
XMLPortObjectContainer* getXMLPortEventContainer(const std::string& eventname);
Modified: code/branches/core5/src/modules/objects/eventsystem/EventListener.cc
===================================================================
--- code/branches/core5/src/modules/objects/eventsystem/EventListener.cc 2009-10-03 15:36:35 UTC (rev 5865)
+++ code/branches/core5/src/modules/objects/eventsystem/EventListener.cc 2009-10-03 16:32:05 UTC (rev 5866)
@@ -77,7 +77,7 @@
for (ObjectList<BaseObject>::iterator it = ObjectList<BaseObject>::begin(); it != ObjectList<BaseObject>::end(); ++it)
if (it->getName() == this->eventName_)
- this->registerAsListener(*it);
+ this->addEventSource(*it, "");
}
void EventListener::loadedNewXMLName(BaseObject* object)
@@ -86,11 +86,6 @@
return;
if (object->getName() == this->eventName_)
- this->registerAsListener(object);
+ this->addEventSource(object, "");
}
-
- void EventListener::registerAsListener(BaseObject* object)
- {
- object->registerEventListener(this, "");
- }
}
Modified: code/branches/core5/src/modules/objects/eventsystem/EventListener.h
===================================================================
--- code/branches/core5/src/modules/objects/eventsystem/EventListener.h 2009-10-03 15:36:35 UTC (rev 5865)
+++ code/branches/core5/src/modules/objects/eventsystem/EventListener.h 2009-10-03 16:32:05 UTC (rev 5866)
@@ -53,7 +53,6 @@
private:
virtual void loadedNewXMLName(BaseObject* object);
- void registerAsListener(BaseObject* object);
std::string eventName_;
bool bActive_;
Modified: code/branches/core5/src/modules/objects/eventsystem/EventTarget.cc
===================================================================
--- code/branches/core5/src/modules/objects/eventsystem/EventTarget.cc 2009-10-03 15:36:35 UTC (rev 5865)
+++ code/branches/core5/src/modules/objects/eventsystem/EventTarget.cc 2009-10-03 16:32:05 UTC (rev 5866)
@@ -48,7 +48,7 @@
for (ObjectList<BaseObject>::iterator it = ObjectList<BaseObject>::begin(); it != ObjectList<BaseObject>::end(); ++it)
if (it->getName() == this->getName())
- this->addAsEvent(*it);
+ this->addEventTarget(*it);
}
void EventTarget::loadedNewXMLName(BaseObject* object)
@@ -57,12 +57,12 @@
return;
if (object->getName() == this->getName())
- this->addAsEvent(object);
+ this->addEventTarget(object);
}
- void EventTarget::addAsEvent(BaseObject* object)
+ void EventTarget::addEventTarget(BaseObject* object)
{
if (object != static_cast<BaseObject*>(this))
- object->addEvent(this, "");
+ object->addEventSource(this, "");
}
}
Modified: code/branches/core5/src/modules/objects/eventsystem/EventTarget.h
===================================================================
--- code/branches/core5/src/modules/objects/eventsystem/EventTarget.h 2009-10-03 15:36:35 UTC (rev 5865)
+++ code/branches/core5/src/modules/objects/eventsystem/EventTarget.h 2009-10-03 16:32:05 UTC (rev 5866)
@@ -46,7 +46,7 @@
private:
virtual void loadedNewXMLName(BaseObject* object);
- void addAsEvent(BaseObject* object);
+ void addEventTarget(BaseObject* object);
};
}
More information about the Orxonox-commit
mailing list