X-Git-Url: https://vaikene.ee/gitweb/gitweb.cgi?p=evaf;a=blobdiff_plain;f=src%2Flibs%2FCommon%2Feventqueue.cpp;fp=src%2Flibs%2FCommon%2Feventqueue.cpp;h=647d892368ecbcdc13302da68086861ab795805b;hp=795224c8fbc42022801da892670789897e54b59f;hb=a81a943bee20df3c7eb34bafb3e3fe878facfe4e;hpb=51afea61c3cf72248b2998f6874a354b49ed12ca diff --git a/src/libs/Common/eventqueue.cpp b/src/libs/Common/eventqueue.cpp index 795224c..647d892 100644 --- a/src/libs/Common/eventqueue.cpp +++ b/src/libs/Common/eventqueue.cpp @@ -62,26 +62,20 @@ bool EventQueue::event(QEvent * e) uint id = event->id(); // Verify that this event is registered - QHash::const_iterator eventsIt = mEvents.constFind(id); + Events::const_iterator eventsIt = mEvents.constFind(id); if (eventsIt == mEvents.constEnd()) { return true; // We don't know it, but it is an eVaf event and we should handle it } // Send the event to all the subscribers - QHash > >::const_iterator subscribersIt = mSubscribers.constFind(id); + Subscribers::const_iterator subscribersIt = mSubscribers.constFind(id); if (subscribersIt != mSubscribers.constEnd()) { - QVector > subscribers = *subscribersIt; - int sz = subscribers.size(); + QVector subscribers = *subscribersIt; + int const sz = subscribers.size(); for (int i = 0; i < sz; ++i) { - // Get the subscriber object and make sure that it is still alive - QWeakPointer obj = subscribers.at(i); - if (obj.isNull()) { - continue; - } - // Notify the subscriber - bool rval = QCoreApplication::sendEvent(obj.data(), e); + bool const rval = QCoreApplication::sendEvent(subscribers.at(i), e); if (rval) { // The event was consumed and should be sent to any other subscribers @@ -133,7 +127,9 @@ uint EventQueue::subscribeEvent(uint id, QObject * obj) if (mSubscribers[id].indexOf(obj) != -1) return id; + // Add to the list of subscribers and connect to the destroyed() signal mSubscribers[id].append(obj); + connect(obj, SIGNAL(destroyed(QObject *)), this, SLOT(subscriberDestroyed(QObject *))); return id; } @@ -148,13 +144,16 @@ void EventQueue::unsubscribeEvent(uint id, QObject * obj) return; // Remove from the list of subscribers - QVector >::iterator it = mSubscribers[id].begin(); - QVector >::iterator e = mSubscribers[id].end(); + QVector::iterator it = mSubscribers[id].begin(); + QVector::const_iterator e = mSubscribers[id].end(); while (it != e) { - if (!it->isNull() && it->data() == obj) + if (*it == obj) { it = mSubscribers[id].erase(it); - else + disconnect(*it, SIGNAL(destroyed(QObject *)), this, SLOT(subscriberDestroyed(QObject*))); + } + else { ++it; + } } } @@ -162,3 +161,16 @@ void EventQueue::broadcastEvent(Event * event) { QCoreApplication::postEvent(this, event); } + +void EventQueue::subscriberDestroyed(QObject * obj) +{ + // Remove the subscriber from all the subscriber lists + Subscribers::iterator it = mSubscribers.begin(); + Subscribers::const_iterator e = mSubscribers.end(); + for (; it != e; ++it) { + int const idx = it->indexOf(obj); + if (idx != -1) { + it->remove(idx); + } + } +}