[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