+
+void BufferViewOverlay::updateHelper()
+{
+ if (!_aboutToUpdate)
+ return;
+
+ bool changed = false;
+
+ int allowedBufferTypes = 0;
+ int minimumActivity = -1;
+ QSet<NetworkId> networkIds;
+ QSet<BufferId> buffers;
+ QSet<BufferId> removedBuffers;
+ QSet<BufferId> tempRemovedBuffers;
+
+ if (Client::bufferViewManager()) {
+ BufferViewConfig *config = nullptr;
+ QSet<int>::const_iterator viewIter;
+ for (viewIter = _bufferViewIds.constBegin(); viewIter != _bufferViewIds.constEnd(); ++viewIter) {
+ config = Client::bufferViewManager()->bufferViewConfig(*viewIter);
+ if (!config)
+ continue;
+
+ allowedBufferTypes |= config->allowedBufferTypes();
+ if (minimumActivity == -1 || config->minimumActivity() < minimumActivity)
+ minimumActivity = config->minimumActivity();
+
+ networkIds << config->networkId();
+
+ // we have to apply several filters before we can add a buffer to a category (visible, removed, ...)
+ buffers += filterBuffersByConfig(config->bufferList(), config);
+ tempRemovedBuffers += filterBuffersByConfig(config->temporarilyRemovedBuffers().toList(), config);
+ removedBuffers += config->removedBuffers();
+ }
+
+ // prune the sets from overlap
+ QSet<BufferId> availableBuffers = Client::networkModel()->allBufferIds().toSet();
+
+ buffers.intersect(availableBuffers);
+
+ tempRemovedBuffers.intersect(availableBuffers);
+ tempRemovedBuffers.subtract(buffers);
+
+ removedBuffers.intersect(availableBuffers);
+ removedBuffers.subtract(tempRemovedBuffers);
+ removedBuffers.subtract(buffers);
+ }
+
+ changed |= (allowedBufferTypes != _allowedBufferTypes);
+ changed |= (minimumActivity != _minimumActivity);
+ changed |= (networkIds != _networkIds);
+ changed |= (buffers != _buffers);
+ changed |= (removedBuffers != _removedBuffers);
+ changed |= (tempRemovedBuffers != _tempRemovedBuffers);
+
+ _allowedBufferTypes = allowedBufferTypes;
+ _minimumActivity = minimumActivity;
+ _networkIds = networkIds;
+ _buffers = buffers;
+ _removedBuffers = removedBuffers;
+ _tempRemovedBuffers = tempRemovedBuffers;
+
+ _aboutToUpdate = false;
+
+ if (changed)
+ emit hasChanged();
+}
+
+
+QSet<BufferId> BufferViewOverlay::filterBuffersByConfig(const QList<BufferId> &buffers, const BufferViewConfig *config)
+{
+ Q_ASSERT(config);
+
+ QSet<BufferId> bufferIds;
+ BufferInfo bufferInfo;
+ foreach(BufferId bufferId, buffers) {
+ bufferInfo = Client::networkModel()->bufferInfo(bufferId);
+ if (!(bufferInfo.type() & config->allowedBufferTypes()))
+ continue;
+ if (config->networkId().isValid() && bufferInfo.networkId() != config->networkId())
+ continue;
+ bufferIds << bufferId;
+ }
+
+ return bufferIds;
+}
+
+
+void BufferViewOverlay::customEvent(QEvent *event)
+{
+ if (event->type() == _updateEventId) {
+ updateHelper();
+ }
+}
+
+
+bool BufferViewOverlay::allNetworks()
+{
+ updateHelper();
+ return _networkIds.contains(NetworkId());