X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fclient%2Fbufferviewoverlay.cpp;h=20d33f852b8dcd02f74e5b3fd86c3709c4a6c47c;hp=f07c4a3afe54142155769a6f85fd639f8d9ecfaa;hb=158443f71d48215eea8b47b836b61afd77654b78;hpb=f48d855945219c3a1897a17bf15830dfee104f0b diff --git a/src/client/bufferviewoverlay.cpp b/src/client/bufferviewoverlay.cpp index f07c4a3a..20d33f85 100644 --- a/src/client/bufferviewoverlay.cpp +++ b/src/client/bufferviewoverlay.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-08 by the Quassel Project * + * Copyright (C) 2005-2018 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -15,130 +15,320 @@ * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #include "bufferviewoverlay.h" #include -#include "client.h" #include "bufferviewconfig.h" +#include "client.h" +#include "clientbacklogmanager.h" #include "clientbufferviewmanager.h" +#include "networkmodel.h" const int BufferViewOverlay::_updateEventId = QEvent::registerEventType(); BufferViewOverlay::BufferViewOverlay(QObject *parent) - : QObject(parent), - _aboutToUpdate(false), - _addBuffersAutomatically(false), - _hideInactiveBuffers(false), - _allowedBufferTypes(0), - _minimumActivity(0) + : QObject(parent) +{ +} + + +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::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; - } +void BufferViewOverlay::restore() +{ + QSet currentIds = _bufferViewIds; + reset(); + currentIds += CoreAccountSettings().bufferViewOverlay(); + + QSet::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, nullptr, this, nullptr); + + // update initialized State: + bool wasInitialized = isInitialized(); + _uninitializedViewCount = 0; + QSet::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; + } + } - _bufferViewIds << viewId; - if(config->isInitialized()) { update(); - } else { + if (!wasInitialized && isInitialized()) + emit initDone(); + save(); +} + + +void BufferViewOverlay::viewInitialized(BufferViewConfig *config) +{ + if (!config) { + qWarning() << "BufferViewOverlay::viewInitialized() received invalid view!"; + return; + } disconnect(config, SIGNAL(initDone()), this, SLOT(viewInitialized())); - connect(config, SIGNAL(initDone()), this, SLOT(viewInitialized())); - } + + connect(config, SIGNAL(configChanged()), 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::removeView(int viewId) { - if(!_bufferViewIds.contains(viewId)) - return; - _bufferViewIds.remove(viewId); - update(); +void BufferViewOverlay::viewInitialized() +{ + BufferViewConfig *config = qobject_cast(sender()); + Q_ASSERT(config); + + viewInitialized(config); } -void BufferViewOverlay::viewInitialized() { - BufferViewConfig *config = qobject_cast(sender()); - Q_ASSERT(config); - disconnect(config, SIGNAL(initDone()), this, SLOT(viewInitialized())); +void BufferViewOverlay::update() +{ + if (_aboutToUpdate) { + return; + } + _aboutToUpdate = true; + QCoreApplication::postEvent(this, new QEvent((QEvent::Type)_updateEventId)); +} - // check if the view was removed in the meantime... - if(_bufferViewIds.contains(config->bufferViewId())) - update(); + +void BufferViewOverlay::updateHelper() +{ + if (!_aboutToUpdate) + return; + + bool changed = false; + + int allowedBufferTypes = 0; + int minimumActivity = -1; + QSet networkIds; + QSet buffers; + QSet removedBuffers; + QSet tempRemovedBuffers; + + if (Client::bufferViewManager()) { + BufferViewConfig *config = nullptr; + QSet::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 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 BufferViewOverlay::filterBuffersByConfig(const QList &buffers, const BufferViewConfig *config) +{ + Q_ASSERT(config); + + QSet 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::update() { - if(_aboutToUpdate) { - return; - } - _aboutToUpdate = true; -} - -void BufferViewOverlay::updateHelper() { - bool changed = false; - - bool addBuffersAutomatically = false; - bool hideInactiveBuffers = true; - int allowedBufferTypes = 0; - int minimumActivity = -1; - QSet networkIds; - QSet buffers; - QSet removedBuffers; - QSet tempRemovedBuffers; - - BufferViewConfig *config = 0; - QSet::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(); - } - - changed |= (addBuffersAutomatically != _addBuffersAutomatically); - changed |= (hideInactiveBuffers != _hideInactiveBuffers); - changed |= (allowedBufferTypes != _allowedBufferTypes); - changed |= (minimumActivity != _minimumActivity); - changed |= (networkIds != _networkIds); - changed |= (buffers != _buffers); - changed |= (removedBuffers != _removedBuffers); - changed |= (tempRemovedBuffers != _tempRemovedBuffers); - - _addBuffersAutomatically = addBuffersAutomatically; - _hideInactiveBuffers = hideInactiveBuffers; - _allowedBufferTypes = allowedBufferTypes; - _minimumActivity = minimumActivity; - _networkIds = networkIds; - _buffers = buffers; - _removedBuffers = removedBuffers; - _tempRemovedBuffers = tempRemovedBuffers; - - if(changed) - emit hasChanged(); -} - -void BufferViewOverlay::customEvent(QEvent *event) { - if(event->type() == _updateEventId) { + +void BufferViewOverlay::customEvent(QEvent *event) +{ + if (event->type() == _updateEventId) { + updateHelper(); + } +} + + +bool BufferViewOverlay::allNetworks() +{ updateHelper(); - _aboutToUpdate = false; - } + return _networkIds.contains(NetworkId()); +} + + +const QSet &BufferViewOverlay::networkIds() +{ + updateHelper(); + return _networkIds; +} + + +const QSet &BufferViewOverlay::bufferIds() +{ + updateHelper(); + return _buffers; +} + + +const QSet &BufferViewOverlay::removedBufferIds() +{ + updateHelper(); + return _removedBuffers; +} + + +const QSet &BufferViewOverlay::tempRemovedBufferIds() +{ + updateHelper(); + return _tempRemovedBuffers; +} + + +int BufferViewOverlay::allowedBufferTypes() +{ + updateHelper(); + return _allowedBufferTypes; +} + + +int BufferViewOverlay::minimumActivity() +{ + updateHelper(); + return _minimumActivity; }