#include <QEvent>
-#include "client.h"
#include "bufferviewconfig.h"
+#include "client.h"
#include "clientbufferviewmanager.h"
+#include "networkmodel.h"
const int BufferViewOverlay::_updateEventId = QEvent::registerEventType();
BufferViewOverlay::BufferViewOverlay(QObject *parent)
: QObject(parent),
_aboutToUpdate(false),
+ _uninitializedViewCount(0),
_addBuffersAutomatically(false),
_hideInactiveBuffers(false),
_allowedBufferTypes(0),
}
_bufferViewIds << viewId;
+ _uninitializedViewCount++;
if(config->isInitialized()) {
- update();
+ viewInitialized(config);
} else {
disconnect(config, SIGNAL(initDone()), this, SLOT(viewInitialized()));
- connect(config, SIGNAL(initDone()), this, SLOT(viewInitialized()));
+ // we use a queued connection here since manipulating the connection list of a sending object
+ // doesn't seem to be such a good idea while executing a connected slots.
+ connect(config, SIGNAL(initDone()), this, SLOT(viewInitialized()), Qt::QueuedConnection);
}
}
return;
_bufferViewIds.remove(viewId);
+ 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 = qobject_cast<BufferViewConfig *>(sender());
- Q_ASSERT(config);
-
+void BufferViewOverlay::viewInitialized(BufferViewConfig *config) {
+ if(!config) {
+ qWarning() << "BufferViewOverlay::viewInitialized() received invalid view!";
+ return;
+ }
disconnect(config, SIGNAL(initDone()), this, SLOT(viewInitialized()));
+ connect(config, SIGNAL(configChanged()), this, SLOT(update()));
+// connect(config, SIGNAL(networkIdSet(const NetworkId &)), this, SLOT(update()));
+// connect(config, SIGNAL(addNewBuffersAutomaticallySet(bool)), this, SLOT(update()));
+// connect(config, SIGNAL(sortAlphabeticallySet(bool)), this, SLOT(update()));
+// connect(config, SIGNAL(hideInactiveBuffersSet(bool)), this, SLOT(update()));
+// connect(config, SIGNAL(allowedBufferTypesSet(int)), this, SLOT(update()));
+// connect(config, SIGNAL(minimumActivitySet(int)), this, SLOT(update()));
+// connect(config, SIGNAL(bufferListSet()), this, SLOT(update()));
+// connect(config, SIGNAL(bufferAdded(const BufferId &, int)), this, SLOT(update()));
+// connect(config, SIGNAL(bufferRemoved(const BufferId &)), this, SLOT(update()));
+// connect(config, SIGNAL(bufferPermanentlyRemoved(const BufferId &)), this, SLOT(update()));
+
// check if the view was removed in the meantime...
if(_bufferViewIds.contains(config->bufferViewId()))
update();
+
+ _uninitializedViewCount--;
+ if(isInitialized())
+ emit initDone();
+}
+
+void BufferViewOverlay::viewInitialized() {
+ BufferViewConfig *config = qobject_cast<BufferViewConfig *>(sender());
+ Q_ASSERT(config);
+
+ viewInitialized(config);
}
void BufferViewOverlay::update() {
return;
}
_aboutToUpdate = true;
+ QCoreApplication::postEvent(this, new QEvent((QEvent::Type)_updateEventId));
}
void BufferViewOverlay::updateHelper() {
+ if(!_aboutToUpdate)
+ return;
+
bool changed = false;
bool addBuffersAutomatically = false;
QSet<BufferId> buffers;
QSet<BufferId> removedBuffers;
QSet<BufferId> tempRemovedBuffers;
-
- BufferViewConfig *config = 0;
- QSet<int>::const_iterator viewIter;
- for(viewIter = _bufferViewIds.constBegin(); viewIter != _bufferViewIds.constEnd(); viewIter++) {
- config = Client::bufferViewManager()->bufferViewConfig(*viewIter);
- if(!config)
- continue;
-
- networkIds << config->networkId();
- buffers += config->bufferList().toSet();
- removedBuffers += config->removedBuffers();
- tempRemovedBuffers += config->temporarilyRemovedBuffers();
-
- addBuffersAutomatically |= config->addNewBuffersAutomatically();
- hideInactiveBuffers &= config->hideInactiveBuffers();
- allowedBufferTypes |= config->allowedBufferTypes();
- if(minimumActivity == -1 || config->minimumActivity() < minimumActivity)
- minimumActivity = config->minimumActivity();
+
+ if(Client::bufferViewManager()) {
+ BufferViewConfig *config = 0;
+ QSet<int>::const_iterator viewIter;
+ for(viewIter = _bufferViewIds.constBegin(); viewIter != _bufferViewIds.constEnd(); viewIter++) {
+ config = Client::bufferViewManager()->bufferViewConfig(*viewIter);
+ if(!config)
+ continue;
+
+ networkIds << config->networkId();
+ 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())
+ removedBuffers = config->removedBuffers();
+ else
+ removedBuffers.intersect(config->removedBuffers());
+
+
+ addBuffersAutomatically |= config->addNewBuffersAutomatically();
+ hideInactiveBuffers &= config->hideInactiveBuffers();
+ allowedBufferTypes |= config->allowedBufferTypes();
+ 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);
_buffers = buffers;
_removedBuffers = removedBuffers;
_tempRemovedBuffers = tempRemovedBuffers;
-
+
+ _aboutToUpdate = false;
+
if(changed)
emit hasChanged();
}
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;
+}