X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fclient%2Fmessagefilter.cpp;h=79d6e9ddcecd879ebba9798c3a7f0bf10ae946c2;hb=114f8a14b8bc82669ffda0599ce30fc299be9396;hp=3ef02ee5ea771874ae66f177b66a2f24b8c9513b;hpb=a3aaabf6254c8c5439af8982cc613c4ced3f50ed;p=quassel.git diff --git a/src/client/messagefilter.cpp b/src/client/messagefilter.cpp index 3ef02ee5..79d6e9dd 100644 --- a/src/client/messagefilter.cpp +++ b/src/client/messagefilter.cpp @@ -19,7 +19,11 @@ ***************************************************************************/ #include "messagefilter.h" + #include "buffersettings.h" +#include "client.h" +#include "messagemodel.h" +#include "networkmodel.h" MessageFilter::MessageFilter(QAbstractItemModel *source, QObject *parent) : QSortFilterProxyModel(parent), @@ -51,7 +55,7 @@ void MessageFilter::init() { void MessageFilter::messageTypeFilterChanged() { int newFilter; - BufferSettings defaultSettings(); + BufferSettings defaultSettings; newFilter = BufferSettings().messageFilter(); BufferSettings mySettings(idString()); @@ -60,6 +64,7 @@ void MessageFilter::messageTypeFilterChanged() { if(_messageTypeFilter != newFilter) { _messageTypeFilter = newFilter; + _filteredQuitMsgs.clear(); invalidateFilter(); } } @@ -80,8 +85,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 +99,36 @@ 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; + if(networkId() != Client::networkModel()->networkId(id)) + return false; + + uint messageTimestamp = sourceModel()->data(sourceIdx, MessageModel::TimestampRole).value().toTime_t(); + QString quiter = sourceModel()->data(sourceIdx, Qt::DisplayRole).toString().section(' ', 0, 0, QString::SectionSkipEmpty).toLower(); + if(quiter != bufferName().toLower()) + return false; + + if(_filteredQuitMsgs.contains(quiter, messageTimestamp)) + return false; + + MessageFilter *that = const_cast(this); + that->_filteredQuitMsgs.insert(quiter, messageTimestamp); + return true; + } +} + +void MessageFilter::requestBacklog() { + QSet::const_iterator bufferIdIter = _validBuffers.constBegin(); + while(bufferIdIter != _validBuffers.constEnd()) { + Client::messageModel()->requestBacklog(*bufferIdIter); + bufferIdIter++; + } }