void Object::UnsubscribeFromEventReceiver(Object* receiver) { EventHandler* handler = eventHandlers_.First(); EventHandler* previous = 0; while (handler) { if (handler->GetReceiver() == receiver) { if (handler->GetSender()) context_->RemoveEventReceiver(this, handler->GetSender(), handler->GetEventType()); else context_->RemoveEventReceiver(this, handler->GetEventType()); EventHandler* next = eventHandlers_.Next(handler); eventHandlers_.Erase(handler, previous); handler = next; } else { previous = handler; handler = eventHandlers_.Next(handler); } } }
void Object::UnsubscribeFromAllEvents() { for (;;) { EventHandler* handler = eventHandlers_.First(); if (handler) { if (handler->GetSender()) context_->RemoveEventReceiver(this, handler->GetSender(), handler->GetEventType()); else context_->RemoveEventReceiver(this, handler->GetEventType()); eventHandlers_.Erase(handler); } else break; } }
void Object::UnsubscribeFromEvent(StringHash eventType) { for (;;) { EventHandler* previous; EventHandler* handler = FindEventHandler(eventType, &previous); if (handler) { if (handler->GetSender()) context_->RemoveEventReceiver(this, handler->GetSender(), eventType); else context_->RemoveEventReceiver(this, eventType); eventHandlers_.Erase(handler, previous); } else break; } }
void Object::OnEvent(Object* sender, StringHash eventType, VariantMap& eventData) { // Make a copy of the context pointer in case the object is destroyed during event handler invocation Context* context = context_; EventHandler* specific = 0; EventHandler* nonSpecific = 0; EventHandler* handler = eventHandlers_.First(); while (handler) { if (handler->GetEventType() == eventType) { if (!handler->GetSender()) nonSpecific = handler; else if (handler->GetSender() == sender) { specific = handler; break; } } handler = eventHandlers_.Next(handler); } // Specific event handlers have priority, so if found, invoke first if (specific) { context->SetEventHandler(specific); specific->Invoke(eventData); context->SetEventHandler(0); return; } if (nonSpecific) { context->SetEventHandler(nonSpecific); nonSpecific->Invoke(eventData); context->SetEventHandler(0); } }
void Object::UnsubscribeFromEvent(Object* sender, StringHash eventType) { if (!sender) return; EventHandler* previous; EventHandler* handler = FindSpecificEventHandler(sender, eventType, &previous); if (handler) { context_->RemoveEventReceiver(this, handler->GetSender(), eventType); eventHandlers_.Erase(handler, previous); } }
void Object::UnsubscribeFromAllEventsExcept(const PODVector<StringHash>& exceptions, bool onlyUserData) { EventHandler* handler = eventHandlers_.First(); EventHandler* previous = 0; while (handler) { EventHandler* next = eventHandlers_.Next(handler); if ((!onlyUserData || handler->GetUserData()) && !exceptions.Contains(handler->GetEventType())) { if (handler->GetSender()) context_->RemoveEventReceiver(this, handler->GetSender(), handler->GetEventType()); else context_->RemoveEventReceiver(this, handler->GetEventType()); eventHandlers_.Erase(handler, previous); } else previous = handler; handler = next; } }
EventHandler* Object::FindSpecificEventHandler(Object* sender, StringHash eventType, EventHandler** previous) const { EventHandler* handler = eventHandlers_.First(); if (previous) *previous = 0; while (handler) { if (handler->GetSender() == sender && handler->GetEventType() == eventType) return handler; if (previous) *previous = handler; handler = eventHandlers_.Next(handler); } return 0; }
void Object::UnsubscribeFromEvents(Object* sender) { if (!sender) return; for (;;) { EventHandler* previous; EventHandler* handler = FindSpecificEventHandler(sender, &previous); if (handler) { context_->RemoveEventReceiver(this, handler->GetSender(), handler->GetEventType()); eventHandlers_.Erase(handler, previous); } else break; } }
void Object::RemoveEventSender(Object* sender) { EventHandler* handler = eventHandlers_.First(); EventHandler* previous = 0; while (handler) { if (handler->GetSender() == sender) { EventHandler* next = eventHandlers_.Next(handler); eventHandlers_.Erase(handler, previous); handler = next; } else { previous = handler; handler = eventHandlers_.Next(handler); } } }