X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fuisupport%2Fbufferviewfilter.cpp;h=12109ba4be1fbad4ff606bdd40a5c9456532b7eb;hp=6bd65653e5f5757d2d15fd9cec1a3c8ef60bb238;hb=617a3966941742a4e235af440d3665d0274354a8;hpb=b7c4bc3c2d51d3a48e86963d61b36960b5f5de21;ds=sidebyside diff --git a/src/uisupport/bufferviewfilter.cpp b/src/uisupport/bufferviewfilter.cpp index 6bd65653..12109ba4 100644 --- a/src/uisupport/bufferviewfilter.cpp +++ b/src/uisupport/bufferviewfilter.cpp @@ -46,6 +46,7 @@ public: BufferViewFilter::BufferViewFilter(QAbstractItemModel *model, BufferViewConfig *config) : QSortFilterProxyModel(model), _config(0), + _tmpConfig(0), _sortOrder(Qt::AscendingOrder), _showServerQueries(false), _editMode(false), @@ -56,8 +57,8 @@ BufferViewFilter::BufferViewFilter(QAbstractItemModel *model, BufferViewConfig * setDynamicSortFilter(true); - connect(this, SIGNAL(_dataChanged(const QModelIndex &, const QModelIndex &)), - this, SLOT(_q_sourceDataChanged(QModelIndex,QModelIndex))); + connect(this, SIGNAL(_dataChanged(QModelIndex,QModelIndex)), + this, SLOT(_q_sourceDataChanged(QModelIndex,QModelIndex))); _enableEditMode.setCheckable(true); _enableEditMode.setChecked(_editMode); @@ -72,51 +73,45 @@ void BufferViewFilter::setConfig(BufferViewConfig *config) { if(_config == config) return; - if(_config) { - disconnect(_config, 0, this, 0); - } +#if QT_VERSION >= 0x040600 + beginResetModel(); +#endif - _config = config; - - if(!config) { - invalidate(); - setObjectName(""); - return; - } + _tmpConfig = config; // don't invalidate the old config before we're initialized - if(config->isInitialized()) { + if(!config || config->isInitialized()) { configInitialized(); } 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, SIGNAL(initDone()), this, SLOT(configInitialized()), Qt::QueuedConnection); - invalidate(); + //invalidate(); // not needed as we still have the old config and will reset once init is done } } void BufferViewFilter::configInitialized() { - if(!config()) - return; - -// connect(config(), SIGNAL(bufferViewNameSet(const QString &)), this, SLOT(invalidate())); - connect(config(), SIGNAL(configChanged()), this, SLOT(invalidate())); -// connect(config(), SIGNAL(networkIdSet(const NetworkId &)), this, SLOT(invalidate())); -// connect(config(), SIGNAL(addNewBuffersAutomaticallySet(bool)), this, SLOT(invalidate())); -// connect(config(), SIGNAL(sortAlphabeticallySet(bool)), this, SLOT(invalidate())); -// connect(config(), SIGNAL(hideInactiveBuffersSet(bool)), this, SLOT(invalidate())); -// connect(config(), SIGNAL(allowedBufferTypesSet(int)), this, SLOT(invalidate())); -// connect(config(), SIGNAL(minimumActivitySet(int)), this, SLOT(invalidate())); -// connect(config(), SIGNAL(bufferListSet()), this, SLOT(invalidate())); -// connect(config(), SIGNAL(bufferAdded(const BufferId &, int)), this, SLOT(invalidate())); -// connect(config(), SIGNAL(bufferMoved(const BufferId &, int)), this, SLOT(invalidate())); -// connect(config(), SIGNAL(bufferRemoved(const BufferId &)), this, SLOT(invalidate())); -// connect(config(), SIGNAL(bufferPermanentlyRemoved(const BufferId &)), this, SLOT(invalidate())); + if(_config) { + disconnect(_config, 0, this, 0); + } - disconnect(config(), SIGNAL(initDone()), this, SLOT(configInitialized())); + _config = _tmpConfig; + _tmpConfig = 0; - setObjectName(config()->bufferViewName()); + if(config()) { + connect(config(), SIGNAL(configChanged()), this, SLOT(invalidate())); + disconnect(config(), SIGNAL(initDone()), this, SLOT(configInitialized())); + setObjectName(config()->bufferViewName()); + } else { + setObjectName(""); + } - invalidate(); + // not resetting the model can trigger bug #663 for some reason I haven't understood yet + // we get invalid model indexes in attached views even if no source model has been set yet... wtf? +#if QT_VERSION >= 0x040600 + endResetModel(); +#else + reset(); +#endif emit configChanged(); } @@ -151,12 +146,12 @@ void BufferViewFilter::enableEditMode(bool enable) { QSet::const_iterator iter; for(iter = _toTempRemove.constBegin(); iter != _toTempRemove.constEnd(); iter++) { if(config()->temporarilyRemovedBuffers().contains(*iter)) - continue; + continue; config()->requestRemoveBuffer(*iter); } for(iter = _toRemove.constBegin(); iter != _toRemove.constEnd(); iter++) { if(config()->removedBuffers().contains(*iter)) - continue; + continue; config()->requestRemoveBufferPermanently(*iter); } } @@ -185,7 +180,7 @@ Qt::ItemFlags BufferViewFilter::flags(const QModelIndex &index) const { if(bufferType != BufferInfo::QueryBuffer) { ClientBufferViewConfig *clientConf = qobject_cast(config()); if(clientConf && clientConf->isLocked()) { - flags &= ~(Qt::ItemIsDropEnabled | Qt::ItemIsDragEnabled); + flags &= ~(Qt::ItemIsDropEnabled | Qt::ItemIsDragEnabled); } } } @@ -210,29 +205,29 @@ bool BufferViewFilter::dropMimeData(const QMimeData *data, Qt::DropAction action bufferId = bufferList[i].second; if(droppedNetworkId == networkId) { if(row < 0) - row = 0; + row = 0; if(row < rowCount(parent)) { - QModelIndex source_child = mapToSource(index(row, 0, parent)); - BufferId beforeBufferId = sourceModel()->data(source_child, NetworkModel::BufferIdRole).value(); - pos = config()->bufferList().indexOf(beforeBufferId); - if(_sortOrder == Qt::DescendingOrder) - pos++; + QModelIndex source_child = mapToSource(index(row, 0, parent)); + BufferId beforeBufferId = sourceModel()->data(source_child, NetworkModel::BufferIdRole).value(); + pos = config()->bufferList().indexOf(beforeBufferId); + if(_sortOrder == Qt::DescendingOrder) + pos++; } else { - if(_sortOrder == Qt::AscendingOrder) - pos = config()->bufferList().count(); - else - pos = 0; + if(_sortOrder == Qt::AscendingOrder) + pos = config()->bufferList().count(); + else + pos = 0; } if(config()->bufferList().contains(bufferId) && !config()->sortAlphabetically()) { - if(config()->bufferList().indexOf(bufferId) < pos) - pos--; - ClientBufferViewConfig *clientConf = qobject_cast(config()); - if(!clientConf || !clientConf->isLocked()) - config()->requestMoveBuffer(bufferId, pos); + if(config()->bufferList().indexOf(bufferId) < pos) + pos--; + ClientBufferViewConfig *clientConf = qobject_cast(config()); + if(!clientConf || !clientConf->isLocked()) + config()->requestMoveBuffer(bufferId, pos); } else { - config()->requestAddBuffer(bufferId, pos); + config()->requestAddBuffer(bufferId, pos); } } else { @@ -280,14 +275,14 @@ void BufferViewFilter::addBuffers(const QList &bufferIds) const { bool lt; for(int i = 0; i < bufferList.count(); i++) { if(config() && config()->sortAlphabetically()) - lt = bufferIdLessThan(bufferId, bufferList[i]); + lt = bufferIdLessThan(bufferId, bufferList[i]); else - lt = bufferId < config()->bufferList()[i]; + lt = bufferId < config()->bufferList()[i]; if(lt) { - pos = i; - bufferList.insert(pos, bufferId); - break; + pos = i; + bufferList.insert(pos, bufferId); + break; } } config()->requestAddBuffer(bufferId, pos); @@ -309,7 +304,7 @@ bool BufferViewFilter::filterAcceptBuffer(const QModelIndex &source_bufferIndex) if(config()->isInitialized() && !config()->removedBuffers().contains(bufferId) // it hasn't been manually removed and either && ((config()->addNewBuffersAutomatically() && !config()->temporarilyRemovedBuffers().contains(bufferId)) // is totally unknown to us (a new buffer)... - || (config()->temporarilyRemovedBuffers().contains(bufferId) && activityLevel > BufferInfo::OtherActivity))) { // or was just temporarily hidden and has a new message waiting for us. + || (config()->temporarilyRemovedBuffers().contains(bufferId) && activityLevel > BufferInfo::OtherActivity))) { // or was just temporarily hidden and has a new message waiting for us. addBuffer(bufferId); } // note: adding the buffer to the valid list does not temper with the following filters ("show only channels" and stuff)