From: Marcus Eggenberger Date: Fri, 31 Oct 2008 15:27:27 +0000 (+0100) Subject: Fixing BR #170 - show quit messages in query buffers X-Git-Tag: 0.3.1~97 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=402f690fb8ca07adc2c063ba550d7e8fc0159ada Fixing BR #170 - show quit messages in query buffers --- diff --git a/src/client/messagefilter.cpp b/src/client/messagefilter.cpp index 65d898f4..238c7d57 100644 --- a/src/client/messagefilter.cpp +++ b/src/client/messagefilter.cpp @@ -23,10 +23,12 @@ #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); @@ -35,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); @@ -63,6 +66,7 @@ void MessageFilter::messageTypeFilterChanged() { if(_messageTypeFilter != newFilter) { _messageTypeFilter = newFilter; + _filteredQuitMsgs.clear(); invalidateFilter(); } } @@ -83,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()) @@ -94,7 +101,29 @@ 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() { @@ -104,3 +133,21 @@ void MessageFilter::requestBacklog() { 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; +} diff --git a/src/client/messagefilter.h b/src/client/messagefilter.h index d2ce6996..9d17ddb1 100644 --- a/src/client/messagefilter.h +++ b/src/client/messagefilter.h @@ -23,6 +23,7 @@ #include +#include "bufferinfo.h" #include "messagemodel.h" #include "types.h" @@ -38,17 +39,26 @@ public: virtual bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const; virtual QString idString() const; inline bool isSingleBufferFilter() const { return _validBuffers.count() == 1; } + BufferId singleBufferId() const { return *(_validBuffers.constBegin()); } inline bool containsBuffer(const BufferId &id) const { return _validBuffers.contains(id); } public slots: void messageTypeFilterChanged(); void requestBacklog(); +protected: + const QString &bufferName() const; + BufferInfo::Type bufferType() const; + private: void init(); QSet _validBuffers; + QSet _filteredQuitMsgs; int _messageTypeFilter; + + QString _bufferName; + BufferInfo::Type _bufferType; }; #endif