X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;f=src%2Fclient%2Fmessagefilter.cpp;h=238c7d57f1c5fdb5106b6f1d48b350e9ea595a5b;hb=0c4d5e393048c0f7487c9080d5f2625f016fb41c;hp=3ef02ee5ea771874ae66f177b66a2f24b8c9513b;hpb=a3aaabf6254c8c5439af8982cc613c4ced3f50ed;p=quassel.git diff --git a/src/client/messagefilter.cpp b/src/client/messagefilter.cpp index 3ef02ee5..238c7d57 100644 --- a/src/client/messagefilter.cpp +++ b/src/client/messagefilter.cpp @@ -19,11 +19,16 @@ ***************************************************************************/ #include "messagefilter.h" + #include "buffersettings.h" +#include "client.h" +#include "messagemodel.h" +#include "networkmodel.h" MessageFilter::MessageFilter(QAbstractItemModel *source, QObject *parent) : QSortFilterProxyModel(parent), - _messageTypeFilter(0) + _messageTypeFilter(0), + _bufferType(BufferInfo::InvalidBuffer) { init(); setSourceModel(source); @@ -32,7 +37,8 @@ MessageFilter::MessageFilter(QAbstractItemModel *source, QObject *parent) MessageFilter::MessageFilter(MessageModel *source, const QList &buffers, QObject *parent) : QSortFilterProxyModel(parent), _validBuffers(buffers.toSet()), - _messageTypeFilter(0) + _messageTypeFilter(0), + _bufferType(BufferInfo::InvalidBuffer) { init(); setSourceModel(source); @@ -51,7 +57,7 @@ void MessageFilter::init() { void MessageFilter::messageTypeFilterChanged() { int newFilter; - BufferSettings defaultSettings(); + BufferSettings defaultSettings; newFilter = BufferSettings().messageFilter(); BufferSettings mySettings(idString()); @@ -60,6 +66,7 @@ void MessageFilter::messageTypeFilterChanged() { if(_messageTypeFilter != newFilter) { _messageTypeFilter = newFilter; + _filteredQuitMsgs.clear(); invalidateFilter(); } } @@ -80,8 +87,11 @@ QString MessageFilter::idString() const { bool MessageFilter::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const { Q_UNUSED(sourceParent); - QModelIndex sourceIdx = sourceModel()->index(sourceRow, 0); - if(_messageTypeFilter & sourceModel()->data(sourceIdx, MessageModel::TypeRole).toInt()) + QModelIndex sourceIdx = sourceModel()->index(sourceRow, 2); + Message::Type messageType = (Message::Type)sourceModel()->data(sourceIdx, MessageModel::TypeRole).toInt(); + + // apply message type filter + if(_messageTypeFilter & messageType) return false; if(_validBuffers.isEmpty()) @@ -91,5 +101,53 @@ bool MessageFilter::filterAcceptsRow(int sourceRow, const QModelIndex &sourcePar if(!id.isValid()) { return true; } - return _validBuffers.contains(id); + + if(_validBuffers.contains(id)) { + return true; + } else { + // show Quit messages in Query buffers: + if(bufferType() != BufferInfo::QueryBuffer) + return false; + if(!(messageType & Message::Quit)) + return false; + + uint messageTimestamp = sourceModel()->data(sourceIdx, MessageModel::TimestampRole).value().toTime_t(); + if(_filteredQuitMsgs.contains(messageTimestamp)) + return false; + + QString quiter = sourceModel()->data(sourceIdx, Qt::DisplayRole).toString().section(' ', 0, 0, QString::SectionSkipEmpty); + if(quiter.toLower() == bufferName().toLower()) { + MessageFilter *that = const_cast(this); + that->_filteredQuitMsgs << messageTimestamp; + return true; + } else { + return false; + } + } +} + +void MessageFilter::requestBacklog() { + QSet::const_iterator bufferIdIter = _validBuffers.constBegin(); + while(bufferIdIter != _validBuffers.constEnd()) { + Client::messageModel()->requestBacklog(*bufferIdIter); + bufferIdIter++; + } +} + +const QString &MessageFilter::bufferName() const { + if(_bufferName.isEmpty()) { + MessageFilter *that = const_cast(this); + that->_bufferName = Client::networkModel()->bufferName(singleBufferId()); + return that->_bufferName; + } + return _bufferName; +} + +BufferInfo::Type MessageFilter::bufferType() const { + if(_bufferType == BufferInfo::InvalidBuffer) { + MessageFilter *that = const_cast(this); + that->_bufferType = Client::networkModel()->bufferType(singleBufferId()); + return that->_bufferType; + } + return _bufferType; }