BufferViewOverlay::BufferViewOverlay(QObject *parent)
: QObject(parent),
_aboutToUpdate(false),
+ _uninitializedViewCount(0),
_addBuffersAutomatically(false),
_hideInactiveBuffers(false),
_allowedBufferTypes(0),
}
_bufferViewIds << viewId;
+ _uninitializedViewCount++;
if(config->isInitialized()) {
viewInitialized(config);
} else {
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) {
// check if the view was removed in the meantime...
if(_bufferViewIds.contains(config->bufferViewId()))
update();
+
+ _uninitializedViewCount--;
+ if(isInitialized())
+ emit initDone();
}
void BufferViewOverlay::viewInitialized() {
public:
BufferViewOverlay(QObject *parent = 0);
+ inline const QSet<int> &bufferViewIds() { return _bufferViewIds; }
bool allNetworks();
const QSet<NetworkId> &networkIds();
int allowedBufferTypes();
int minimumActivity();
+ inline bool isInitialized() { return _uninitializedViewCount == 0; }
+
public slots:
void addView(int viewId);
void removeView(int viewId);
signals:
void hasChanged();
+ void initDone();
protected:
virtual void customEvent(QEvent *event);
bool _aboutToUpdate;
QSet<int> _bufferViewIds;
+ int _uninitializedViewCount;
QSet<NetworkId> _networkIds;
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);
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);
// 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;
}
ClientBufferViewManager::ClientBufferViewManager(SignalProxy *proxy, QObject *parent)
: BufferViewManager(proxy, parent)
{
- connect(this, SIGNAL(initDone()), this, SLOT(waitForConfigInit()));
}
BufferViewConfig *ClientBufferViewManager::bufferViewConfigFactory(int bufferViewConfigId) {
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);
-}
protected:
virtual BufferViewConfig *bufferViewConfigFactory(int bufferViewConfigId);
-
-signals:
- void viewsInitialized();
-
-private slots:
- void waitForConfigInit();
- void configInitBarrier();
};
#endif //CLIENTBUFFERVIEWMANAGER_H