From e2667bcfa59d0a3b7843235dd6235d912cc0c992 Mon Sep 17 00:00:00 2001 From: Marcus Eggenberger Date: Sat, 11 Apr 2009 01:01:46 +0200 Subject: [PATCH] minor refactoring on how backlog requests are triggered --- src/client/bufferviewoverlay.cpp | 26 +++++++++++++++++++++++++- src/client/bufferviewoverlay.h | 5 +++++ src/client/client.cpp | 6 ++++-- src/client/clientbufferviewmanager.cpp | 26 -------------------------- src/client/clientbufferviewmanager.h | 7 ------- 5 files changed, 34 insertions(+), 36 deletions(-) diff --git a/src/client/bufferviewoverlay.cpp b/src/client/bufferviewoverlay.cpp index cba8035a..3b49ff91 100644 --- a/src/client/bufferviewoverlay.cpp +++ b/src/client/bufferviewoverlay.cpp @@ -32,6 +32,7 @@ const int BufferViewOverlay::_updateEventId = QEvent::registerEventType(); BufferViewOverlay::BufferViewOverlay(QObject *parent) : QObject(parent), _aboutToUpdate(false), + _uninitializedViewCount(0), _addBuffersAutomatically(false), _hideInactiveBuffers(false), _allowedBufferTypes(0), @@ -50,6 +51,7 @@ void BufferViewOverlay::addView(int viewId) { } _bufferViewIds << viewId; + _uninitializedViewCount++; if(config->isInitialized()) { viewInitialized(config); } else { @@ -63,10 +65,28 @@ void BufferViewOverlay::removeView(int viewId) { return; _bufferViewIds.remove(viewId); - BufferViewConfig *config = qobject_cast(sender()); + BufferViewConfig *config = Client::bufferViewManager()->bufferViewConfig(viewId); if(config) disconnect(config, 0, this, 0); + + // update initialized State: + bool wasInitialized = isInitialized(); + _uninitializedViewCount = 0; + QSet::iterator viewIter = _bufferViewIds.begin(); + while(viewIter != _bufferViewIds.end()) { + config = Client::bufferViewManager()->bufferViewConfig(*viewIter); + if(!config) { + viewIter = _bufferViewIds.erase(viewIter); + } else { + if(!config->isInitialized()) + _uninitializedViewCount++; + viewIter++; + } + } + update(); + if(!wasInitialized && isInitialized()) + emit initDone(); } void BufferViewOverlay::viewInitialized(BufferViewConfig *config) { @@ -90,6 +110,10 @@ void BufferViewOverlay::viewInitialized(BufferViewConfig *config) { // check if the view was removed in the meantime... if(_bufferViewIds.contains(config->bufferViewId())) update(); + + _uninitializedViewCount--; + if(isInitialized()) + emit initDone(); } void BufferViewOverlay::viewInitialized() { diff --git a/src/client/bufferviewoverlay.h b/src/client/bufferviewoverlay.h index 70fb9276..96f63238 100644 --- a/src/client/bufferviewoverlay.h +++ b/src/client/bufferviewoverlay.h @@ -34,6 +34,7 @@ class BufferViewOverlay : public QObject { public: BufferViewOverlay(QObject *parent = 0); + inline const QSet &bufferViewIds() { return _bufferViewIds; } bool allNetworks(); const QSet &networkIds(); @@ -46,6 +47,8 @@ public: int allowedBufferTypes(); int minimumActivity(); + inline bool isInitialized() { return _uninitializedViewCount == 0; } + public slots: void addView(int viewId); void removeView(int viewId); @@ -55,6 +58,7 @@ public slots: signals: void hasChanged(); + void initDone(); protected: virtual void customEvent(QEvent *event); @@ -68,6 +72,7 @@ private: bool _aboutToUpdate; QSet _bufferViewIds; + int _uninitializedViewCount; QSet _networkIds; diff --git a/src/client/client.cpp b/src/client/client.cpp index 741388c1..733ba543 100644 --- a/src/client/client.cpp +++ b/src/client/client.cpp @@ -322,7 +322,6 @@ void Client::setSyncedToCore() { Q_ASSERT(!_bufferViewManager); _bufferViewManager = new ClientBufferViewManager(signalProxy(), this); connect(bufferViewManager(), SIGNAL(initDone()), this, SLOT(createDefaultBufferView())); - connect(bufferViewManager(), SIGNAL(viewsInitialized()), this, SLOT(requestInitialBacklog())); // create AliasManager Q_ASSERT(!_aliasManager); @@ -330,6 +329,9 @@ void Client::setSyncedToCore() { connect(aliasManager(), SIGNAL(initDone()), SLOT(sendBufferedUserInput())); signalProxy()->synchronize(aliasManager()); + // trigger backlog request once all active bufferviews are initialized + connect(bufferViewOverlay(), SIGNAL(initDone()), this, SLOT(requestInitialBacklog())); + _syncedToCore = true; emit connected(); emit coreConnectionStateChanged(true); @@ -340,7 +342,7 @@ void Client::requestInitialBacklog() { // triggers this slot. But we have to make sure that we know all buffers yet. // so we check the BufferSyncer and in case it wasn't initialized we wait for that instead if(!bufferSyncer()->isInitialized()) { - disconnect(bufferViewManager(), SIGNAL(viewsInitialized()), this, SLOT(requestInitialBacklog())); + connect(bufferViewOverlay(), SIGNAL(initDone()), this, SLOT(requestInitialBacklog())); connect(bufferSyncer(), SIGNAL(initDone()), this, SLOT(requestInitialBacklog())); return; } diff --git a/src/client/clientbufferviewmanager.cpp b/src/client/clientbufferviewmanager.cpp index 315c2a8e..b31f69e2 100644 --- a/src/client/clientbufferviewmanager.cpp +++ b/src/client/clientbufferviewmanager.cpp @@ -25,7 +25,6 @@ ClientBufferViewManager::ClientBufferViewManager(SignalProxy *proxy, QObject *parent) : BufferViewManager(proxy, parent) { - connect(this, SIGNAL(initDone()), this, SLOT(waitForConfigInit())); } BufferViewConfig *ClientBufferViewManager::bufferViewConfigFactory(int bufferViewConfigId) { @@ -43,28 +42,3 @@ QList ClientBufferViewManager::clientBufferViewConfigs ClientBufferViewConfig *ClientBufferViewManager::clientBufferViewConfig(int bufferViewId) const { return static_cast(bufferViewConfig(bufferViewId)); } - -void ClientBufferViewManager::waitForConfigInit() { - bool initialized = true; - foreach(BufferViewConfig *config, bufferViewConfigs()) { - initialized &= config->isInitialized(); - if(config->isInitialized()) - continue; - connect(config, SIGNAL(initDone()), this, SLOT(configInitBarrier())); - } - if(initialized) - QMetaObject::invokeMethod(this, "viewsInitialized", Qt::QueuedConnection); -} - -void ClientBufferViewManager::configInitBarrier() { - BufferViewConfig *config = qobject_cast(sender()); - Q_ASSERT(config); - disconnect(config, SIGNAL(initDone()), this, SLOT(configInitBarrier())); - - bool initialized = true; - foreach(BufferViewConfig *config, bufferViewConfigs()) { - initialized &= config->isInitialized(); - } - if(initialized) - QMetaObject::invokeMethod(this, "viewsInitialized", Qt::QueuedConnection); -} diff --git a/src/client/clientbufferviewmanager.h b/src/client/clientbufferviewmanager.h index 09639089..f190362b 100644 --- a/src/client/clientbufferviewmanager.h +++ b/src/client/clientbufferviewmanager.h @@ -37,13 +37,6 @@ public: protected: virtual BufferViewConfig *bufferViewConfigFactory(int bufferViewConfigId); - -signals: - void viewsInitialized(); - -private slots: - void waitForConfigInit(); - void configInitBarrier(); }; #endif //CLIENTBUFFERVIEWMANAGER_H -- 2.20.1