Fixing a bug where the unread messages backlog requester wouldn't
[quassel.git] / src / client / bufferviewoverlay.cpp
index 66dec13..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() {
@@ -108,6 +132,9 @@ void BufferViewOverlay::update() {
 }
 
 void BufferViewOverlay::updateHelper() {
+  if(!_aboutToUpdate)
+    return;
+
   bool changed = false;
 
   bool addBuffersAutomatically = false;
@@ -162,6 +189,9 @@ void BufferViewOverlay::updateHelper() {
       if(minimumActivity == -1 || config->minimumActivity() < minimumActivity)
         minimumActivity = config->minimumActivity();
     }
+    QSet<BufferId> availableBuffers = Client::networkModel()->allBufferIds().toSet();
+    buffers.intersect(availableBuffers);
+    tempRemovedBuffers.intersect(availableBuffers);
   }
 
   changed |= (addBuffersAutomatically != _addBuffersAutomatically);
@@ -182,6 +212,8 @@ void BufferViewOverlay::updateHelper() {
   _removedBuffers = removedBuffers;
   _tempRemovedBuffers = tempRemovedBuffers;
 
+  _aboutToUpdate = false;
+
   if(changed)
     emit hasChanged();
 }
@@ -189,6 +221,50 @@ void BufferViewOverlay::updateHelper() {
 void BufferViewOverlay::customEvent(QEvent *event) {
   if(event->type() == _updateEventId) {
     updateHelper();
-    _aboutToUpdate = false;
   }
 }
+
+bool BufferViewOverlay::allNetworks() {
+  updateHelper();
+  return _networkIds.contains(NetworkId());
+}
+
+const QSet<NetworkId> &BufferViewOverlay::networkIds() {
+  updateHelper();
+  return _networkIds;
+}
+
+const QSet<BufferId> &BufferViewOverlay::bufferIds() {
+  updateHelper();
+  return _buffers;
+}
+
+const QSet<BufferId> &BufferViewOverlay::removedBufferIds() {
+  updateHelper();
+  return _removedBuffers;
+}
+
+const QSet<BufferId> &BufferViewOverlay::tempRemovedBufferIds() {
+  updateHelper();
+  return _tempRemovedBuffers;
+}
+
+bool BufferViewOverlay::addBuffersAutomatically() {
+  updateHelper();
+  return _addBuffersAutomatically;
+}
+
+bool BufferViewOverlay::hideInactiveBuffers() {
+  updateHelper();
+  return _hideInactiveBuffers;
+}
+
+int BufferViewOverlay::allowedBufferTypes() {
+  updateHelper();
+  return _allowedBufferTypes;
+}
+
+int BufferViewOverlay::minimumActivity() {
+  updateHelper();
+  return _minimumActivity;
+}