Make behavior of input line history a bit more intuitive
[quassel.git] / src / client / bufferviewoverlay.cpp
index 4ec4123..cba8035 100644 (file)
 
 #include <QEvent>
 
-#include "client.h"
 #include "bufferviewconfig.h"
+#include "client.h"
 #include "clientbufferviewmanager.h"
+#include "networkmodel.h"
 
 const int BufferViewOverlay::_updateEventId = QEvent::registerEventType();
 
@@ -107,6 +108,9 @@ void BufferViewOverlay::update() {
 }
 
 void BufferViewOverlay::updateHelper() {
+  if(!_aboutToUpdate)
+    return;
+
   bool changed = false;
 
   bool addBuffersAutomatically = false;
@@ -125,9 +129,28 @@ void BufferViewOverlay::updateHelper() {
       config = Client::bufferViewManager()->bufferViewConfig(*viewIter);
       if(!config)
         continue;
+
       networkIds << config->networkId();
-      buffers += config->bufferList().toSet();
-      tempRemovedBuffers += config->temporarilyRemovedBuffers();
+      if(config->networkId().isValid()) {
+        NetworkId networkId = config->networkId();
+        // we have to filter out all the buffers that don't belong to this net... :/
+        QSet<BufferId> bufferIds;
+        foreach(BufferId bufferId, config->bufferList()) {
+          if(Client::networkModel()->networkId(bufferId) == networkId)
+            bufferIds << bufferId;
+        }
+        buffers += bufferIds;
+
+        bufferIds.clear();
+        foreach(BufferId bufferId, config->temporarilyRemovedBuffers()) {
+          if(Client::networkModel()->networkId(bufferId) == networkId)
+            bufferIds << bufferId;
+        }
+        tempRemovedBuffers += bufferIds;
+      } else {
+        buffers += config->bufferList().toSet();
+        tempRemovedBuffers += config->temporarilyRemovedBuffers();
+      }
 
       // in the overlay a buffer is removed it is removed from all views
       if(removedBuffers.isEmpty())
@@ -142,6 +165,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);
@@ -162,6 +188,8 @@ void BufferViewOverlay::updateHelper() {
   _removedBuffers = removedBuffers;
   _tempRemovedBuffers = tempRemovedBuffers;
 
+  _aboutToUpdate = false;
+
   if(changed)
     emit hasChanged();
 }
@@ -169,6 +197,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;
+}