+void BufferViewOverlay::reset()
+{
+ _aboutToUpdate = false;
+
+ _bufferViewIds.clear();
+ _uninitializedViewCount = 0;
+
+ _networkIds.clear();
+ _allowedBufferTypes = 0;
+ _minimumActivity = 0;
+
+ _buffers.clear();
+ _removedBuffers.clear();
+ _tempRemovedBuffers.clear();
+}
+
+
+void BufferViewOverlay::save()
+{
+ CoreAccountSettings().setBufferViewOverlay(_bufferViewIds);
+}
+
+
+void BufferViewOverlay::restore()
+{
+ QSet<int> currentIds = _bufferViewIds;
+ reset();
+ currentIds += CoreAccountSettings().bufferViewOverlay();
+
+ QSet<int>::const_iterator iter;
+ for (iter = currentIds.constBegin(); iter != currentIds.constEnd(); ++iter) {
+ addView(*iter);
+ }
+}
+
+
+void BufferViewOverlay::addView(int viewId)
+{
+ if (_bufferViewIds.contains(viewId))
+ return;
+
+ BufferViewConfig *config = Client::bufferViewManager()->bufferViewConfig(viewId);
+ if (!config) {
+ qDebug() << "BufferViewOverlay::addView(): no such buffer view:" << viewId;
+ return;
+ }
+
+ _bufferViewIds << viewId;
+ bool wasInitialized = isInitialized();
+ _uninitializedViewCount++;
+
+ if (config->isInitialized()) {
+ viewInitialized(config);
+
+ if (wasInitialized) {
+ BufferIdList buffers;
+ if (config->networkId().isValid()) {
+ foreach(BufferId bufferId, config->bufferList()) {
+ if (Client::networkModel()->networkId(bufferId) == config->networkId())
+ buffers << bufferId;
+ }
+ foreach(BufferId bufferId, config->temporarilyRemovedBuffers().toList()) {
+ if (Client::networkModel()->networkId(bufferId) == config->networkId())
+ buffers << bufferId;
+ }
+ }
+ else {
+ buffers = BufferIdList::fromSet(config->bufferList().toSet() + config->temporarilyRemovedBuffers());
+ }
+ Client::backlogManager()->checkForBacklog(buffers);
+ }
+ }
+ else {
+ disconnect(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);
+ }
+ save();
+}
+
+
+void BufferViewOverlay::removeView(int viewId)
+{
+ if (!_bufferViewIds.contains(viewId))
+ 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;
+ }
+ }