Impelementing proper message redirection.
authorMarcus Eggenberger <egs@quassel-irc.org>
Thu, 13 Nov 2008 23:56:20 +0000 (00:56 +0100)
committerMarcus Eggenberger <egs@quassel-irc.org>
Thu, 13 Nov 2008 23:56:20 +0000 (00:56 +0100)
you can now individualy specify if user notices, server notices or errors
should be displayed in their original target, the status buffer or the currently
selected buffer.

src/client/messagefilter.cpp
src/client/messagefilter.h
src/client/messagemodel.cpp
src/client/messagemodel.h
src/common/message.h
src/qtui/chatlinemodelitem.h
src/qtui/settingspages/generalsettingspage.cpp

index 79d6e9d..e39b796 100644 (file)
@@ -22,6 +22,7 @@
 
 #include "buffersettings.h"
 #include "client.h"
 
 #include "buffersettings.h"
 #include "client.h"
+#include "buffermodel.h"
 #include "messagemodel.h"
 #include "networkmodel.h"
 
 #include "messagemodel.h"
 #include "networkmodel.h"
 
@@ -46,6 +47,18 @@ void MessageFilter::init() {
   BufferSettings defaultSettings;
   _messageTypeFilter = defaultSettings.messageFilter();
   defaultSettings.notify("MessageTypeFilter", this, SLOT(messageTypeFilterChanged()));
   BufferSettings defaultSettings;
   _messageTypeFilter = defaultSettings.messageFilter();
   defaultSettings.notify("MessageTypeFilter", this, SLOT(messageTypeFilterChanged()));
+  defaultSettings.notify("UserNoticesInDefaultBuffer", this, SLOT(messageRedirectionChanged()));
+  defaultSettings.notify("UserNoticesInStatusBuffer", this, SLOT(messageRedirectionChanged()));
+  defaultSettings.notify("UserNoticesInCurrentBuffer", this, SLOT(messageRedirectionChanged()));
+
+  defaultSettings.notify("serverNoticesInDefaultBuffer", this, SLOT(messageRedirectionChanged()));
+  defaultSettings.notify("serverNoticesInStatusBuffer", this, SLOT(messageRedirectionChanged()));
+  defaultSettings.notify("serverNoticesInCurrentBuffer", this, SLOT(messageRedirectionChanged()));
+
+  defaultSettings.notify("ErrorMsgsInDefaultBuffer", this, SLOT(messageRedirectionChanged()));
+  defaultSettings.notify("ErrorMsgsInStatusBuffer", this, SLOT(messageRedirectionChanged()));
+  defaultSettings.notify("ErrorMsgsInCurrentBuffer", this, SLOT(messageRedirectionChanged()));
+  messageRedirectionChanged();
 
   BufferSettings mySettings(idString());
   if(mySettings.hasFilter())
 
   BufferSettings mySettings(idString());
   if(mySettings.hasFilter())
@@ -69,13 +82,30 @@ void MessageFilter::messageTypeFilterChanged() {
   }
 }
 
   }
 }
 
+void MessageFilter::messageRedirectionChanged() {
+  BufferSettings bufferSettings;
+  _userNoticesInDefaultBuffer = bufferSettings.value("UserNoticesInDefaultBuffer", QVariant(true)).toBool();
+  _userNoticesInStatusBuffer = bufferSettings.value("UserNoticesInStatusBuffer", QVariant(false)).toBool();
+  _userNoticesInCurrentBuffer = bufferSettings.value("UserNoticesInCurrentBuffer", QVariant(false)).toBool();
+
+  _serverNoticesInDefaultBuffer = bufferSettings.value("ServerNoticesInDefaultBuffer", QVariant(false)).toBool();
+  _serverNoticesInStatusBuffer = bufferSettings.value("ServerNoticesInStatusBuffer", QVariant(true)).toBool();
+  _serverNoticesInCurrentBuffer = bufferSettings.value("ServerNoticesInCurrentBuffer", QVariant(false)).toBool();
+
+  _errorMsgsInDefaultBuffer = bufferSettings.value("ErrorMsgsInDefaultBuffer", QVariant(true)).toBool();
+  _errorMsgsInStatusBuffer = bufferSettings.value("ErrorMsgsInStatusBuffer", QVariant(false)).toBool();
+  _errorMsgsInCurrentBuffer = bufferSettings.value("ErrorMsgsInCurrentBuffer", QVariant(false)).toBool();
+
+  invalidateFilter();
+}
+
 QString MessageFilter::idString() const {
   if(_validBuffers.isEmpty())
     return "*";
 
   QList<BufferId> bufferIds = _validBuffers.toList();;
   qSort(bufferIds);
 QString MessageFilter::idString() const {
   if(_validBuffers.isEmpty())
     return "*";
 
   QList<BufferId> bufferIds = _validBuffers.toList();;
   qSort(bufferIds);
-  
+
   QStringList bufferIdStrings;
   foreach(BufferId id, bufferIds)
     bufferIdStrings << QString::number(id.toInt());
   QStringList bufferIdStrings;
   foreach(BufferId id, bufferIds)
     bufferIdStrings << QString::number(id.toInt());
@@ -95,12 +125,80 @@ bool MessageFilter::filterAcceptsRow(int sourceRow, const QModelIndex &sourcePar
   if(_validBuffers.isEmpty())
     return true;
 
   if(_validBuffers.isEmpty())
     return true;
 
-  BufferId id = sourceModel()->data(sourceIdx, MessageModel::BufferIdRole).value<BufferId>();
-  if(!id.isValid()) {
+  BufferId bufferId = sourceModel()->data(sourceIdx, MessageModel::BufferIdRole).value<BufferId>();
+  if(!bufferId.isValid()) {
     return true;
   }
 
     return true;
   }
 
-  if(_validBuffers.contains(id)) {
+  MsgId msgId = sourceModel()->data(sourceIdx, MessageModel::MsgIdRole).value<MsgId>();
+  Message::Flags flags = (Message::Flags)sourceModel()->data(sourceIdx, MessageModel::FlagsRole).toInt();
+
+  NetworkId myNetworkId = networkId();
+  NetworkId msgNetworkId = Client::networkModel()->networkId(bufferId);
+  if(myNetworkId != msgNetworkId)
+    return false;
+
+  bool redirect = false;
+  bool inDefaultBuffer;
+  bool inStatusBuffer;
+  bool inCurrentBuffer;
+
+  switch(messageType) {
+  case Message::Notice:
+    if(Client::networkModel()->bufferType(bufferId) != BufferInfo::ChannelBuffer) {
+      redirect = true;
+      if(flags & Message::ServerMsg) {
+       // server notice
+       inDefaultBuffer = _serverNoticesInDefaultBuffer;
+       inStatusBuffer = _serverNoticesInStatusBuffer;
+       inCurrentBuffer = _serverNoticesInCurrentBuffer;
+      } else {
+       inDefaultBuffer = _userNoticesInDefaultBuffer;
+       inStatusBuffer = _userNoticesInStatusBuffer;
+       inCurrentBuffer = _userNoticesInCurrentBuffer;
+      }
+    }
+    break;
+  case Message::Error:
+    redirect = true;
+    inDefaultBuffer = _errorMsgsInDefaultBuffer;
+    inStatusBuffer = _errorMsgsInStatusBuffer;
+    inCurrentBuffer = _errorMsgsInCurrentBuffer;
+    break;
+  default:
+    break;
+  }
+
+  if(redirect) {
+    if(_redirectedMsgs.contains(msgId))
+      return true;
+
+    if(inDefaultBuffer && _validBuffers.contains(bufferId))
+      return true;
+
+    if(inCurrentBuffer && !(flags & Message::Backlog) && _validBuffers.contains(Client::bufferModel()->currentIndex().data(NetworkModel::BufferIdRole).value<BufferId>())) {
+      BufferId redirectedTo = sourceModel()->data(sourceIdx, MessageModel::RedirectedToRole).value<BufferId>();
+      if(!redirectedTo.isValid()) {
+       sourceModel()->setData(sourceIdx, QVariant::fromValue<BufferId>(singleBufferId()), MessageModel::RedirectedToRole);
+       _redirectedMsgs << msgId;
+       return true;
+      } else if(_validBuffers.contains(redirectedTo)) {
+       return true;
+      }
+    }
+
+    QSet<BufferId>::const_iterator idIter = _validBuffers.constBegin();
+    while(idIter != _validBuffers.constEnd()) {
+      if(inStatusBuffer && Client::networkModel()->bufferType(*idIter) == BufferInfo::StatusBuffer)
+       return true;
+      idIter++;
+    }
+
+    return false;
+  }
+
+
+  if(_validBuffers.contains(bufferId)) {
     return true;
   } else {
     // show Quit messages in Query buffers:
     return true;
   } else {
     // show Quit messages in Query buffers:
@@ -108,7 +206,8 @@ bool MessageFilter::filterAcceptsRow(int sourceRow, const QModelIndex &sourcePar
       return false;
     if(!(messageType & Message::Quit))
       return false;
       return false;
     if(!(messageType & Message::Quit))
       return false;
-    if(networkId() != Client::networkModel()->networkId(id))
+
+    if(myNetworkId != msgNetworkId)
       return false;
 
     uint messageTimestamp = sourceModel()->data(sourceIdx, MessageModel::TimestampRole).value<QDateTime>().toTime_t();
       return false;
 
     uint messageTimestamp = sourceModel()->data(sourceIdx, MessageModel::TimestampRole).value<QDateTime>().toTime_t();
index 342fb86..c173a8c 100644 (file)
@@ -46,6 +46,7 @@ public:
 
 public slots:
   void messageTypeFilterChanged();
 
 public slots:
   void messageTypeFilterChanged();
+  void messageRedirectionChanged();
   void requestBacklog();
 
 protected:
   void requestBacklog();
 
 protected:
@@ -57,8 +58,21 @@ private:
   void init();
 
   QSet<BufferId> _validBuffers;
   void init();
 
   QSet<BufferId> _validBuffers;
+  mutable QSet<MsgId> _redirectedMsgs;
   QMultiHash<QString, uint> _filteredQuitMsgs;
   int _messageTypeFilter;
   QMultiHash<QString, uint> _filteredQuitMsgs;
   int _messageTypeFilter;
+
+  bool _userNoticesInDefaultBuffer;
+  bool _userNoticesInStatusBuffer;
+  bool _userNoticesInCurrentBuffer;
+
+  bool _serverNoticesInDefaultBuffer;
+  bool _serverNoticesInStatusBuffer;
+  bool _serverNoticesInCurrentBuffer;
+
+  bool _errorMsgsInDefaultBuffer;
+  bool _errorMsgsInStatusBuffer;
+  bool _errorMsgsInCurrentBuffer;
 };
 
 #endif
 };
 
 #endif
index 13e6900..8dfaf01 100644 (file)
@@ -395,6 +395,8 @@ MessageModelItem::MessageModelItem(const Message &msg) :
   _type(msg.type()),
   _flags(msg.flags())
 {
   _type(msg.type()),
   _flags(msg.flags())
 {
+  if(!msg.sender().contains('!'))
+    _flags |= Message::ServerMsg;
 }
 
 QVariant MessageModelItem::data(int column, int role) const {
 }
 
 QVariant MessageModelItem::data(int column, int role) const {
@@ -407,10 +409,23 @@ QVariant MessageModelItem::data(int column, int role) const {
   case MessageModel::TypeRole: return _type;
   case MessageModel::FlagsRole: return (int)_flags;
   case MessageModel::TimestampRole: return _timestamp;
   case MessageModel::TypeRole: return _type;
   case MessageModel::FlagsRole: return (int)_flags;
   case MessageModel::TimestampRole: return _timestamp;
+  case MessageModel::RedirectedToRole: return qVariantFromValue<BufferId>(_redirectedTo);
   default: return QVariant();
   }
 }
 
   default: return QVariant();
   }
 }
 
+bool MessageModelItem::setData(int column, const QVariant &value, int role) {
+  Q_UNUSED(column);
+
+  switch(role) {
+  case MessageModel::RedirectedToRole:
+    _redirectedTo = value.value<BufferId>();
+    return true;
+  default:
+    return false;
+  }
+}
+
 
 // Stuff for later
 bool MessageModelItem::lessThan(const MessageModelItem *m1, const MessageModelItem *m2){
 
 // Stuff for later
 bool MessageModelItem::lessThan(const MessageModelItem *m1, const MessageModelItem *m2){
index 0f25fa8..c7c975d 100644 (file)
@@ -44,6 +44,7 @@ public:
     TimestampRole,
     FormatRole,
     ColumnTypeRole,
     TimestampRole,
     FormatRole,
     ColumnTypeRole,
+    RedirectedToRole,
     UserRole
   };
 
     UserRole
   };
 
@@ -105,7 +106,7 @@ public:
   inline virtual ~MessageModelItem() {}
 
   virtual QVariant data(int column, int role) const;
   inline virtual ~MessageModelItem() {}
 
   virtual QVariant data(int column, int role) const;
-  virtual bool setData(int column, const QVariant &value, int role) = 0;
+  virtual bool setData(int column, const QVariant &value, int role);
 
   inline const QDateTime &timeStamp() const { return _timestamp; }
   inline MsgId msgId() const { return _msgId; }
 
   inline const QDateTime &timeStamp() const { return _timestamp; }
   inline MsgId msgId() const { return _msgId; }
@@ -123,6 +124,7 @@ private:
   QDateTime _timestamp;
   MsgId _msgId;
   BufferId _bufferId;
   QDateTime _timestamp;
   MsgId _msgId;
   BufferId _bufferId;
+  BufferId _redirectedTo;
   Message::Type _type;
   Message::Flags _flags;
 };
   Message::Type _type;
   Message::Flags _flags;
 };
index 4d283ad..1d366a2 100644 (file)
@@ -55,6 +55,7 @@ public:
     Self = 0x01,
     Highlight = 0x02,
     Redirected = 0x04,
     Self = 0x01,
     Highlight = 0x02,
     Redirected = 0x04,
+    ServerMsg = 0x08,
     Backlog = 0x80
   };
   Q_DECLARE_FLAGS(Flags, Flag)
     Backlog = 0x80
   };
   Q_DECLARE_FLAGS(Flags, Flag)
index 922e183..864c1d5 100644 (file)
@@ -33,7 +33,6 @@ public:
   ChatLineModelItem(const Message &);
   ~ChatLineModelItem();
   virtual QVariant data(int column, int role) const;
   ChatLineModelItem(const Message &);
   ~ChatLineModelItem();
   virtual QVariant data(int column, int role) const;
-  virtual inline bool setData(int column, const QVariant &value, int role) { Q_UNUSED(column); Q_UNUSED(value); Q_UNUSED(role); return false; }
 
 private:
   ChatLineModelItemPrivate *_data;
 
 private:
   ChatLineModelItemPrivate *_data;
index f7c55e3..9b232bd 100644 (file)
@@ -116,9 +116,9 @@ void GeneralSettingsPage::load() {
   SettingsPage::load(ui.userNoticesInStatusBuffer, bufferSettings.value("UserNoticesInStatusBuffer", QVariant(false)).toBool());
   SettingsPage::load(ui.userNoticesInCurrentBuffer, bufferSettings.value("UserNoticesInCurrentBuffer", QVariant(false)).toBool());
 
   SettingsPage::load(ui.userNoticesInStatusBuffer, bufferSettings.value("UserNoticesInStatusBuffer", QVariant(false)).toBool());
   SettingsPage::load(ui.userNoticesInCurrentBuffer, bufferSettings.value("UserNoticesInCurrentBuffer", QVariant(false)).toBool());
 
-  SettingsPage::load(ui.serverNoticesInDefaultBuffer, bufferSettings.value("serverNoticesInDefaultBuffer", QVariant(false)).toBool());
-  SettingsPage::load(ui.serverNoticesInStatusBuffer, bufferSettings.value("serverNoticesInStatusBuffer", QVariant(true)).toBool());
-  SettingsPage::load(ui.serverNoticesInCurrentBuffer, bufferSettings.value("serverNoticesInCurrentBuffer", QVariant(false)).toBool());
+  SettingsPage::load(ui.serverNoticesInDefaultBuffer, bufferSettings.value("ServerNoticesInDefaultBuffer", QVariant(false)).toBool());
+  SettingsPage::load(ui.serverNoticesInStatusBuffer, bufferSettings.value("ServerNoticesInStatusBuffer", QVariant(true)).toBool());
+  SettingsPage::load(ui.serverNoticesInCurrentBuffer, bufferSettings.value("ServerNoticesInCurrentBuffer", QVariant(false)).toBool());
 
   SettingsPage::load(ui.errorMsgsInDefaultBuffer, bufferSettings.value("ErrorMsgsInDefaultBuffer", QVariant(true)).toBool());
   SettingsPage::load(ui.errorMsgsInStatusBuffer, bufferSettings.value("ErrorMsgsInStatusBuffer", QVariant(false)).toBool());
 
   SettingsPage::load(ui.errorMsgsInDefaultBuffer, bufferSettings.value("ErrorMsgsInDefaultBuffer", QVariant(true)).toBool());
   SettingsPage::load(ui.errorMsgsInStatusBuffer, bufferSettings.value("ErrorMsgsInStatusBuffer", QVariant(false)).toBool());