X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fclient%2Fmessagefilter.cpp;h=79d6e9ddcecd879ebba9798c3a7f0bf10ae946c2;hp=65d898f4a33a4dd7de0f5b9fc761b727e56c3c8d;hb=114f8a14b8bc82669ffda0599ce30fc299be9396;hpb=e0bd6c474dfdd885a839172a6165ff22b83590a5 diff --git a/src/client/messagefilter.cpp b/src/client/messagefilter.cpp index 65d898f4..79d6e9dd 100644 --- a/src/client/messagefilter.cpp +++ b/src/client/messagefilter.cpp @@ -23,6 +23,7 @@ #include "buffersettings.h" #include "client.h" #include "messagemodel.h" +#include "networkmodel.h" MessageFilter::MessageFilter(QAbstractItemModel *source, QObject *parent) : QSortFilterProxyModel(parent), @@ -63,6 +64,7 @@ void MessageFilter::messageTypeFilterChanged() { if(_messageTypeFilter != newFilter) { _messageTypeFilter = newFilter; + _filteredQuitMsgs.clear(); invalidateFilter(); } } @@ -83,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()) @@ -94,7 +99,30 @@ 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() {