X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fuisupport%2Fbufferviewfilter.cpp;h=12109ba4be1fbad4ff606bdd40a5c9456532b7eb;hp=57a6661b65ed4241c19b4b3a8e0184b2c4f04e61;hb=617a3966941742a4e235af440d3665d0274354a8;hpb=57e1cccf5a990b83bc8bde7959e85dec99db50a7 diff --git a/src/uisupport/bufferviewfilter.cpp b/src/uisupport/bufferviewfilter.cpp index 57a6661b..12109ba4 100644 --- a/src/uisupport/bufferviewfilter.cpp +++ b/src/uisupport/bufferviewfilter.cpp @@ -46,75 +46,85 @@ public: BufferViewFilter::BufferViewFilter(QAbstractItemModel *model, BufferViewConfig *config) : QSortFilterProxyModel(model), _config(0), + _tmpConfig(0), _sortOrder(Qt::AscendingOrder), + _showServerQueries(false), _editMode(false), - _enableEditMode(tr("Show / Hide buffers"), this) + _enableEditMode(tr("Show / Hide Chats"), this) { setConfig(config); setSourceModel(model); 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); connect(&_enableEditMode, SIGNAL(toggled(bool)), this, SLOT(enableEditMode(bool))); + BufferSettings defaultSettings; + defaultSettings.notify("ServerNoticesTarget", this, SLOT(showServerQueriesChanged())); + showServerQueriesChanged(); } void BufferViewFilter::setConfig(BufferViewConfig *config) { if(_config == config) return; - if(_config) { - disconnect(_config, 0, this, 0); - } - - _config = config; +#if QT_VERSION >= 0x040600 + beginResetModel(); +#endif - 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(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(); } +void BufferViewFilter::showServerQueriesChanged() { + BufferSettings bufferSettings; + + bool showQueries = (bufferSettings.serverNoticesTarget() & BufferSettings::DefaultBuffer); + if(_showServerQueries != showQueries) { + _showServerQueries = showQueries; + invalidate(); + } +} + QList BufferViewFilter::actions(const QModelIndex &index) { Q_UNUSED(index) QList actionList; @@ -136,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); } } @@ -170,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); } } } @@ -195,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 { @@ -265,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); @@ -294,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) @@ -307,9 +317,14 @@ bool BufferViewFilter::filterAcceptBuffer(const QModelIndex &source_bufferIndex) int allowedBufferTypes = config()->allowedBufferTypes(); if(!config()->networkId().isValid()) allowedBufferTypes &= ~BufferInfo::StatusBuffer; - if(!(allowedBufferTypes & sourceModel()->data(source_bufferIndex, NetworkModel::BufferTypeRole).toInt())) + int bufferType = sourceModel()->data(source_bufferIndex, NetworkModel::BufferTypeRole).toInt(); + if(!(allowedBufferTypes & bufferType)) return false; + if(bufferType & BufferInfo::QueryBuffer && !_showServerQueries && sourceModel()->data(source_bufferIndex, Qt::DisplayRole).toString().contains('.')) { + return false; + } + // the following dynamic filters may not trigger if the buffer is currently selected. QModelIndex currentIndex = Client::bufferModel()->standardSelectionModel()->currentIndex(); if(bufferId == Client::bufferModel()->data(currentIndex, NetworkModel::BufferIdRole).value()) @@ -510,3 +525,4 @@ bool BufferViewFilter::bufferIdLessThan(const BufferId &left, const BufferId &ri return QString::compare(Client::networkModel()->data(leftIndex, Qt::DisplayRole).toString(), Client::networkModel()->data(rightIndex, Qt::DisplayRole).toString(), Qt::CaseInsensitive) < 0; } +