Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Oct 3, 2009, 6:32:05 PM (15 years ago)
Author:
landauf
Message:

some cleanup in the eventsystem. not sure if everything still works, but there are more changes to come.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • code/branches/core5/src/libraries/core/BaseObject.cc

    r5858 r5866  
    9494        if (this->isInitialized())
    9595        {
    96             for (std::list<BaseObject*>::const_iterator it = this->events_.begin(); it != this->events_.end(); ++it)
    97                 (*it)->unregisterEventListener(this);
    98 
    99             for (std::map<BaseObject*, std::string>::const_iterator it = this->eventListeners_.begin(); it != this->eventListeners_.end(); ++it)
    100                 it->first->removeEvent(this);
     96            for (std::map<BaseObject*, std::string>::const_iterator it = this->eventSources_.begin(); it != this->eventSources_.end(); )
     97                this->removeEventSource((it++)->first);
     98
     99            for (std::set<BaseObject*>::const_iterator it = this->eventListeners_.begin(); it != this->eventListeners_.end(); )
     100                (*(it++))->removeEventSource(this);
    101101
    102102            for (std::map<std::string, EventContainer*>::const_iterator it = this->eventContainers_.begin(); it != this->eventContainers_.end(); ++it)
     
    145145            {
    146146                std::string sectionname = (*it);
    147                 ExecutorMember<BaseObject>* loadexecutor = createExecutor(createFunctor(&BaseObject::addEvent), std::string( "BaseObject" ) + "::" + "addEvent");
    148                 ExecutorMember<BaseObject>* saveexecutor = createExecutor(createFunctor(&BaseObject::getEvent), std::string( "BaseObject" ) + "::" + "getEvent");
     147                ExecutorMember<BaseObject>* loadexecutor = createExecutor(createFunctor(&BaseObject::addEventSource), std::string( "BaseObject" ) + "::" + "addEventSource");
     148                ExecutorMember<BaseObject>* saveexecutor = createExecutor(createFunctor(&BaseObject::getEventSource), std::string( "BaseObject" ) + "::" + "getEventSource");
    149149                loadexecutor->setDefaultValue(1, sectionname);
     150                saveexecutor->setDefaultValue(1, sectionname);
    150151
    151152                XMLPortClassObjectContainer<BaseObject, BaseObject>* container = 0;
     
    224225    }
    225226
    226     void BaseObject::addEvent(BaseObject* event, const std::string& sectionname)
    227     {
    228         event->registerEventListener(this, sectionname);
    229         this->events_.push_back(event);
    230     }
    231 
    232     void BaseObject::removeEvent(BaseObject* event)
    233     {
    234         this->events_.remove(event);
    235     }
    236 
    237     BaseObject* BaseObject::getEvent(unsigned int index) const
     227    /**
     228        @brief Adds a new event source for a specific state.
     229        @param source The object which sends events to this object
     230        @param state The state of this object which will be affected by the events
     231    */
     232    void BaseObject::addEventSource(BaseObject* source, const std::string& state)
     233    {
     234        this->eventSources_[source] = state;
     235        source->registerEventListener(this);
     236    }
     237
     238    /**
     239        @brief Removes an eventsource (but doesn't unregister itself at the source).
     240    */
     241    void BaseObject::removeEventSource(BaseObject* source)
     242    {
     243        this->eventSources_.erase(source);
     244        source->unregisterEventListener(this);
     245    }
     246
     247    /**
     248        @brief Returns an eventsource with a given index.
     249    */
     250    BaseObject* BaseObject::getEventSource(unsigned int index, const std::string& state) const
    238251    {
    239252        unsigned int i = 0;
    240         for (std::list<BaseObject*>::const_iterator it = this->events_.begin(); it != this->events_.end(); ++it)
    241         {
     253        for (std::map<BaseObject*, std::string>::const_iterator it = this->eventSources_.begin(); it != this->eventSources_.end(); ++it)
     254        {
     255            if (it->second != state)
     256                continue;
     257           
    242258            if (i == index)
    243                 return (*it);
     259                return it->first;
    244260            ++i;
    245261        }
     
    268284    }
    269285
     286    /**
     287        @brief Fires an event (without a state).
     288    */
    270289    void BaseObject::fireEvent()
    271290    {
     
    274293    }
    275294
     295    /**
     296        @brief Fires an event which activates or deactivates a state.
     297    */
    276298    void BaseObject::fireEvent(bool activate)
    277299    {
     
    279301    }
    280302
     303    /**
     304        @brief Fires an event which activates or deactivates a state with agiven originator (the object which sends the event).
     305    */
    281306    void BaseObject::fireEvent(bool activate, BaseObject* originator)
    282307    {
    283308        Event event(activate, originator);
    284309
    285         for (std::map<BaseObject*, std::string>::iterator it = this->eventListeners_.begin(); it != this->eventListeners_.end(); ++it)
    286         {
    287             event.sectionname_ = it->second;
    288             it->first->processEvent(event);
    289         }
    290     }
    291 
     310        for (std::set<BaseObject*>::iterator it = this->eventListeners_.begin(); it != this->eventListeners_.end(); ++it)
     311        {
     312            event.sectionname_ = (*it)->eventSources_[this];
     313            (*it)->processEvent(event);
     314        }
     315    }
     316
     317    /**
     318        @brief Fires an event, using the Event struct.
     319    */
    292320    void BaseObject::fireEvent(Event& event)
    293321    {
    294         for (std::map<BaseObject*, std::string>::iterator it = this->eventListeners_.begin(); it != this->eventListeners_.end(); ++it)
    295             it->first->processEvent(event);
     322        for (std::set<BaseObject*>::iterator it = this->eventListeners_.begin(); it != this->eventListeners_.end(); ++it)
     323            (*it)->processEvent(event);
    296324    }
    297325
Note: See TracChangeset for help on using the changeset viewer.