Fixing BR #170 - show quit messages in query buffers
authorMarcus Eggenberger <egs@quassel-irc.org>
Fri, 31 Oct 2008 15:27:27 +0000 (16:27 +0100)
committerMarcus Eggenberger <egs@quassel-irc.org>
Fri, 31 Oct 2008 15:27:27 +0000 (16:27 +0100)
src/client/messagefilter.cpp
src/client/messagefilter.h

index 65d898f..238c7d5 100644 (file)
 #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<BufferId> &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<QDateTime>().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<MessageFilter *>(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<MessageFilter *>(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<MessageFilter *>(this);
+    that->_bufferType = Client::networkModel()->bufferType(singleBufferId());
+    return that->_bufferType;
+  }
+  return _bufferType;
+}
index d2ce699..9d17ddb 100644 (file)
@@ -23,6 +23,7 @@
 
 #include <QSortFilterProxyModel>
 
+#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<BufferId> _validBuffers;
+  QSet<uint> _filteredQuitMsgs;
   int _messageTypeFilter;
+
+  QString _bufferName;
+  BufferInfo::Type _bufferType;
 };
 
 #endif