minor refactoring on how backlog requests are triggered
authorMarcus Eggenberger <egs@quassel-irc.org>
Fri, 10 Apr 2009 23:01:46 +0000 (01:01 +0200)
committerMarcus Eggenberger <egs@quassel-irc.org>
Thu, 21 May 2009 20:01:11 +0000 (22:01 +0200)
src/client/bufferviewoverlay.cpp
src/client/bufferviewoverlay.h
src/client/client.cpp
src/client/clientbufferviewmanager.cpp
src/client/clientbufferviewmanager.h

index cba8035..3b49ff9 100644 (file)
@@ -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<BufferViewConfig *>(sender());
+  BufferViewConfig *config = Client::bufferViewManager()->bufferViewConfig(viewId);
   if(config)
     disconnect(config, 0, this, 0);
+
+  // update initialized State:
+  bool wasInitialized = isInitialized();
+  _uninitializedViewCount = 0;
+  QSet<int>::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() {
index 70fb927..96f6323 100644 (file)
@@ -34,6 +34,7 @@ class BufferViewOverlay : public QObject {
 public:
   BufferViewOverlay(QObject *parent = 0);
 
+  inline const QSet<int> &bufferViewIds() { return _bufferViewIds; }
   bool allNetworks();
 
   const QSet<NetworkId> &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<int> _bufferViewIds;
+  int _uninitializedViewCount;
 
   QSet<NetworkId> _networkIds;
 
index 741388c..733ba54 100644 (file)
@@ -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;
   }
index 315c2a8..b31f69e 100644 (file)
@@ -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<ClientBufferViewConfig *> ClientBufferViewManager::clientBufferViewConfigs
 ClientBufferViewConfig *ClientBufferViewManager::clientBufferViewConfig(int bufferViewId) const {
   return static_cast<ClientBufferViewConfig *>(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<BufferViewConfig *>(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);
-}
index 0963908..f190362 100644 (file)
@@ -37,13 +37,6 @@ public:
 
 protected:
   virtual BufferViewConfig *bufferViewConfigFactory(int bufferViewConfigId);
-
-signals:
-  void viewsInitialized();
-
-private slots:
-  void waitForConfigInit();
-  void configInitBarrier();
 };
 
 #endif //CLIENTBUFFERVIEWMANAGER_H