X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fclient%2Fbufferviewoverlay.cpp;h=455f27350660b496747f3961b2bc4cd436266205;hp=ee5fab0b87972e5cff38bf2e60f8553287d4c7aa;hb=52209badc8e769e50aa3019b63689dda0e79e9d0;hpb=b83a4e42913fe10343be6e6c05a45916e6304ffc diff --git a/src/client/bufferviewoverlay.cpp b/src/client/bufferviewoverlay.cpp index ee5fab0b..455f2735 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-2019 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -15,7 +15,7 @@ * 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" @@ -27,276 +27,287 @@ #include "clientbacklogmanager.h" #include "clientbufferviewmanager.h" #include "networkmodel.h" +#include "util.h" const int BufferViewOverlay::_updateEventId = QEvent::registerEventType(); -BufferViewOverlay::BufferViewOverlay(QObject *parent) - : QObject(parent), - _aboutToUpdate(false), - _uninitializedViewCount(0), - _allowedBufferTypes(0), - _minimumActivity(0) -{ -} +BufferViewOverlay::BufferViewOverlay(QObject* parent) + : QObject(parent) +{} -void BufferViewOverlay::reset() { - _aboutToUpdate = false; +void BufferViewOverlay::reset() +{ + _aboutToUpdate = false; - _bufferViewIds.clear(); - _uninitializedViewCount = 0; + _bufferViewIds.clear(); + _uninitializedViewCount = 0; - _networkIds.clear(); - _allowedBufferTypes = 0; - _minimumActivity = 0; + _networkIds.clear(); + _allowedBufferTypes = 0; + _minimumActivity = 0; - _buffers.clear(); - _removedBuffers.clear(); - _tempRemovedBuffers.clear(); + _buffers.clear(); + _removedBuffers.clear(); + _tempRemovedBuffers.clear(); } -void BufferViewOverlay::save() { - CoreAccountSettings().setBufferViewOverlay(_bufferViewIds); +void BufferViewOverlay::save() +{ + CoreAccountSettings().setBufferViewOverlay(_bufferViewIds); } -void BufferViewOverlay::restore() { - QSet currentIds = _bufferViewIds; - reset(); - currentIds += CoreAccountSettings().bufferViewOverlay(); +void BufferViewOverlay::restore() +{ + QSet currentIds = _bufferViewIds; + reset(); + currentIds += CoreAccountSettings().bufferViewOverlay(); - QSet::const_iterator iter; - for(iter = currentIds.constBegin(); iter != currentIds.constEnd(); iter++) { - addView(*iter); - } + 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++; +void BufferViewOverlay::addView(int viewId) +{ + if (_bufferViewIds.contains(viewId)) + return; - if(config->isInitialized()) { - viewInitialized(config); + BufferViewConfig* config = Client::bufferViewManager()->bufferViewConfig(viewId); + if (!config) { + qDebug() << "BufferViewOverlay::addView(): no such buffer view:" << viewId; + return; + } - if(wasInitialized) { - BufferIdList buffers; - if(config->networkId().isValid()) { - foreach(BufferId bufferId, config->bufferList()) { - if(Client::networkModel()->networkId(bufferId) == config->networkId()) - buffers << bufferId; + _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; + } + for (BufferId bufferId : config->temporarilyRemovedBuffers()) { + if (Client::networkModel()->networkId(bufferId) == config->networkId()) + buffers << bufferId; + } + } + else { + buffers = (toQSet(config->bufferList()) + config->temporarilyRemovedBuffers()).values(); + } + Client::backlogManager()->checkForBacklog(buffers); } - 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(); + else { + // 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, &BufferViewConfig::initDone, this, selectOverload<>(&BufferViewOverlay::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::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++; +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; + } } - } - update(); - if(!wasInitialized && isInitialized()) - emit initDone(); - save(); + update(); + 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())); +void BufferViewOverlay::viewInitialized(BufferViewConfig* config) +{ + if (!config) { + qWarning() << "BufferViewOverlay::viewInitialized() received invalid view!"; + return; + } + connect(config, &BufferViewConfig::configChanged, this, &BufferViewOverlay::update); - connect(config, SIGNAL(configChanged()), this, SLOT(update())); + // check if the view was removed in the meantime... + if (_bufferViewIds.contains(config->bufferViewId())) + update(); - // check if the view was removed in the meantime... - if(_bufferViewIds.contains(config->bufferViewId())) - update(); - - _uninitializedViewCount--; - if(isInitialized()) - emit initDone(); + _uninitializedViewCount--; + if (isInitialized()) + emit initDone(); } -void BufferViewOverlay::viewInitialized() { - BufferViewConfig *config = qobject_cast(sender()); - Q_ASSERT(config); +void BufferViewOverlay::viewInitialized() +{ + auto* config = qobject_cast(sender()); + Q_ASSERT(config); - viewInitialized(config); + viewInitialized(config); } -void BufferViewOverlay::update() { - if(_aboutToUpdate) { - return; - } - _aboutToUpdate = true; - QCoreApplication::postEvent(this, new QEvent((QEvent::Type)_updateEventId)); +void BufferViewOverlay::update() +{ + if (_aboutToUpdate) { + return; + } + _aboutToUpdate = true; + QCoreApplication::postEvent(this, new QEvent((QEvent::Type)_updateEventId)); } -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 = 0; - QSet::const_iterator viewIter; - for(viewIter = _bufferViewIds.constBegin(); viewIter != _bufferViewIds.constEnd(); viewIter++) { - config = Client::bufferViewManager()->bufferViewConfig(*viewIter); - if(!config) - continue; +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().values(), config); + removedBuffers += config->removedBuffers(); + } - allowedBufferTypes |= config->allowedBufferTypes(); - if(minimumActivity == -1 || config->minimumActivity() < minimumActivity) - minimumActivity = config->minimumActivity(); + // prune the sets from overlap + QSet availableBuffers = toQSet(Client::networkModel()->allBufferIds()); - networkIds << config->networkId(); + buffers.intersect(availableBuffers); + tempRemovedBuffers.intersect(availableBuffers); + tempRemovedBuffers.subtract(buffers); - // 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(); + removedBuffers.intersect(availableBuffers); + removedBuffers.subtract(tempRemovedBuffers); + removedBuffers.subtract(buffers); } - // prune the sets from overlap - QSet availableBuffers = Client::networkModel()->allBufferIds().toSet(); + changed |= (allowedBufferTypes != _allowedBufferTypes); + changed |= (minimumActivity != _minimumActivity); + changed |= (networkIds != _networkIds); + changed |= (buffers != _buffers); + changed |= (removedBuffers != _removedBuffers); + changed |= (tempRemovedBuffers != _tempRemovedBuffers); - buffers.intersect(availableBuffers); + _allowedBufferTypes = allowedBufferTypes; + _minimumActivity = minimumActivity; + _networkIds = networkIds; + _buffers = buffers; + _removedBuffers = removedBuffers; + _tempRemovedBuffers = tempRemovedBuffers; - tempRemovedBuffers.intersect(availableBuffers); - tempRemovedBuffers.subtract(buffers); + _aboutToUpdate = false; - 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; + if (changed) + emit hasChanged(); +} - _aboutToUpdate = false; +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; + } - if(changed) - emit hasChanged(); + return bufferIds; } -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::customEvent(QEvent* event) +{ + if (event->type() == _updateEventId) { + updateHelper(); + } } - -void BufferViewOverlay::customEvent(QEvent *event) { - if(event->type() == _updateEventId) { +bool BufferViewOverlay::allNetworks() +{ updateHelper(); - } + return _networkIds.contains(NetworkId()); } -bool BufferViewOverlay::allNetworks() { - updateHelper(); - return _networkIds.contains(NetworkId()); -} - -const QSet &BufferViewOverlay::networkIds() { - updateHelper(); - return _networkIds; +const QSet& BufferViewOverlay::networkIds() +{ + updateHelper(); + return _networkIds; } -const QSet &BufferViewOverlay::bufferIds() { - updateHelper(); - return _buffers; +const QSet& BufferViewOverlay::bufferIds() +{ + updateHelper(); + return _buffers; } -const QSet &BufferViewOverlay::removedBufferIds() { - updateHelper(); - return _removedBuffers; +const QSet& BufferViewOverlay::removedBufferIds() +{ + updateHelper(); + return _removedBuffers; } -const QSet &BufferViewOverlay::tempRemovedBufferIds() { - updateHelper(); - return _tempRemovedBuffers; +const QSet& BufferViewOverlay::tempRemovedBufferIds() +{ + updateHelper(); + return _tempRemovedBuffers; } -int BufferViewOverlay::allowedBufferTypes() { - updateHelper(); - return _allowedBufferTypes; +int BufferViewOverlay::allowedBufferTypes() +{ + updateHelper(); + return _allowedBufferTypes; } -int BufferViewOverlay::minimumActivity() { - updateHelper(); - return _minimumActivity; +int BufferViewOverlay::minimumActivity() +{ + updateHelper(); + return _minimumActivity; }