activity updates respect now the redirection settings
authorMarcus Eggenberger <egs@quassel-irc.org>
Mon, 9 Feb 2009 23:37:40 +0000 (00:37 +0100)
committerMarcus Eggenberger <egs@quassel-irc.org>
Mon, 9 Feb 2009 23:37:40 +0000 (00:37 +0100)
src/client/abstractmessageprocessor.h
src/client/messagefilter.cpp
src/client/networkmodel.cpp
src/client/networkmodel.h
src/qtui/qtuimessageprocessor.cpp

index ff9daad..b38138e 100644 (file)
@@ -37,7 +37,10 @@ public slots:
   virtual void process(QList<Message> &msgs) = 0;
 
 protected:
-  inline void postProcess(Message &msg) { Client::networkModel()->updateBufferActivity(msg); }
+  // updateBufferActivity also sets the Message::Redirected flag which is later used
+  // to determine where a message should be displayed. therefore it's crucial that it
+  // is called before inserting the message into the model
+  inline void preProcess(Message &msg) { Client::networkModel()->updateBufferActivity(msg); }
 };
 
 #endif
index c9c44d1..323405e 100644 (file)
@@ -140,29 +140,26 @@ bool MessageFilter::filterAcceptsRow(int sourceRow, const QModelIndex &sourcePar
   if(myNetworkId != msgNetworkId)
     return false;
 
-  bool redirect = false;
-  int redirectionTarget = 0;
-  switch(messageType) {
-  case Message::Notice:
-    if(Client::networkModel()->bufferType(bufferId) != BufferInfo::ChannelBuffer) {
-      redirect = true;
-      if(flags & Message::ServerMsg) {
-       // server notice
-       redirectionTarget = _serverNoticesTarget;
-      } else {
-       redirectionTarget = _userNoticesTarget;
+
+  if(flags & Message::Redirected) {
+    int redirectionTarget = 0;
+    switch(messageType) {
+    case Message::Notice:
+      if(Client::networkModel()->bufferType(bufferId) != BufferInfo::ChannelBuffer) {
+       if(flags & Message::ServerMsg) {
+         // server notice
+         redirectionTarget = _serverNoticesTarget;
+       } else {
+         redirectionTarget = _userNoticesTarget;
+       }
       }
+      break;
+    case Message::Error:
+      redirectionTarget = _errorMsgsTarget;
+      break;
+    default:
+      break;
     }
-    break;
-  case Message::Error:
-    redirect = true;
-    redirectionTarget = _errorMsgsTarget;
-    break;
-  default:
-    break;
-  }
-
-  if(redirect) {
 
     if(redirectionTarget & BufferSettings::DefaultBuffer && _validBuffers.contains(bufferId))
       return true;
index 939fcb1..8b087d5 100644 (file)
@@ -798,6 +798,12 @@ NetworkModel::NetworkModel(QObject *parent)
          this, SLOT(checkForNewBuffers(const QModelIndex &, int, int)));
   connect(this, SIGNAL(rowsAboutToBeRemoved(const QModelIndex &, int, int)),
          this, SLOT(checkForRemovedBuffers(const QModelIndex &, int, int)));
+
+  BufferSettings defaultSettings;
+  defaultSettings.notify("UserNoticesTarget", this, SLOT(messageRedirectionSettingsChanged()));
+  defaultSettings.notify("ServerNoticesTarget", this, SLOT(messageRedirectionSettingsChanged()));
+  defaultSettings.notify("ErrorMsgsTarget", this, SLOT(messageRedirectionSettingsChanged()));
+  messageRedirectionSettingsChanged();
 }
 
 QList<QVariant >NetworkModel::defaultHeader() {
@@ -979,11 +985,50 @@ void NetworkModel::setLastSeenMsgId(const BufferId &bufferId, const MsgId &msgId
   bufferItem->setLastSeenMsgId(msgId);
 }
 
-void NetworkModel::updateBufferActivity(const Message &msg) {
-  BufferItem *item = bufferItem(msg.bufferInfo());
-  item->updateActivityLevel(msg);
-  if(item->isCurrentBuffer())
-    emit setLastSeenMsg(item->bufferId(), msg.msgId());
+void NetworkModel::updateBufferActivity(Message &msg) {
+  int redirectionTarget = 0;
+  switch(msg.type()) {
+  case Message::Notice:
+    if(bufferType(msg.bufferId()) != BufferInfo::ChannelBuffer) {
+      msg.setFlags(msg.flags() | Message::Redirected);
+      if(msg.flags() & Message::ServerMsg) {
+       // server notice
+       redirectionTarget = _serverNoticesTarget;
+      } else {
+       redirectionTarget = _userNoticesTarget;
+      }
+    }
+    break;
+  case Message::Error:
+    msg.setFlags(msg.flags() | Message::Redirected);
+    redirectionTarget = _errorMsgsTarget;
+    break;
+  default:
+    break;
+  }
+
+  if(msg.flags() & Message::Redirected) {
+    if(redirectionTarget & BufferSettings::DefaultBuffer)
+      updateBufferActivity(bufferItem(msg.bufferInfo()), msg);
+
+    if(redirectionTarget & BufferSettings::StatusBuffer) {
+      const NetworkItem *netItem = findNetworkItem(msg.bufferInfo().networkId());
+      if(netItem) {
+       updateBufferActivity(netItem->statusBufferItem(), msg);
+      }
+    }
+  } else {
+    updateBufferActivity(bufferItem(msg.bufferInfo()), msg);
+  }
+}
+
+void NetworkModel::updateBufferActivity(BufferItem *bufferItem, const Message &msg) {
+  if(!bufferItem)
+    return;
+
+  bufferItem->updateActivityLevel(msg);
+  if(bufferItem->isCurrentBuffer())
+    emit setLastSeenMsg(bufferItem->bufferId(), msg.msgId());
 }
 
 void NetworkModel::setBufferActivity(const BufferId &bufferId, BufferInfo::ActivityLevel level) {
@@ -1119,3 +1164,10 @@ bool NetworkModel::bufferItemLessThan(const BufferItem *left, const BufferItem *
     return QString::compare(left->bufferName(), right->bufferName(), Qt::CaseInsensitive) < 0;
 }
 
+void NetworkModel::messageRedirectionSettingsChanged() {
+  BufferSettings bufferSettings;
+
+  _userNoticesTarget = bufferSettings.userNoticesTarget();
+  _serverNoticesTarget = bufferSettings.serverNoticesTarget();
+  _errorMsgsTarget = bufferSettings.errorMsgsTarget();
+}
index f763a21..8be6b85 100644 (file)
@@ -56,6 +56,7 @@ public:
   BufferItem *findBufferItem(BufferId bufferId);
   inline BufferItem *findBufferItem(const BufferInfo &bufferInfo) { return findBufferItem(bufferInfo.bufferId()); }
   BufferItem *bufferItem(const BufferInfo &bufferInfo);
+  inline StatusBufferItem *statusBufferItem() const { return _statusBufferItem; }
 
 public slots:
   void setNetworkName(const QString &networkName);
@@ -70,7 +71,7 @@ signals:
 
 private slots:
   void onBeginRemoveChilds(int start, int end);
-  
+
 private:
   NetworkId _networkId;
   StatusBufferItem *_statusBufferItem;
@@ -327,7 +328,7 @@ public slots:
   void setLastSeenMsgId(const BufferId &bufferId, const MsgId &msgId);
   void setBufferActivity(const BufferId &bufferId, BufferInfo::ActivityLevel activity);
   void clearBufferActivity(const BufferId &bufferId);
-  void updateBufferActivity(const Message &msg);
+  void updateBufferActivity(Message &msg);
   void networkRemoved(const NetworkId &networkId);
 
 signals:
@@ -336,6 +337,7 @@ signals:
 private slots:
   void checkForRemovedBuffers(const QModelIndex &parent, int start, int end);
   void checkForNewBuffers(const QModelIndex &parent, int start, int end);
+  void messageRedirectionSettingsChanged();
 
 private:
   int networkRow(NetworkId networkId) const;
@@ -345,9 +347,15 @@ private:
   BufferItem *findBufferItem(BufferId bufferId) const;
   BufferItem *bufferItem(const BufferInfo &bufferInfo);
 
+  void updateBufferActivity(BufferItem *bufferItem, const Message &msg);
+
   static bool bufferItemLessThan(const BufferItem *left, const BufferItem *right);
 
   QHash<BufferId, BufferItem *> _bufferItemCache;
+
+  int _userNoticesTarget;
+  int _serverNoticesTarget;
+  int _errorMsgsTarget;
 };
 Q_DECLARE_OPERATORS_FOR_FLAGS(NetworkModel::ItemTypes)
 
index 3aa3acd..2466e15 100644 (file)
@@ -56,8 +56,8 @@ void QtUiMessageProcessor::reset() {
 
 void QtUiMessageProcessor::process(Message &msg) {
   checkForHighlight(msg);
+  preProcess(msg);
   Client::messageModel()->insertMessage(msg);
-  postProcess(msg);
 }
 
 void QtUiMessageProcessor::process(QList<Message> &msgs) {
@@ -65,7 +65,7 @@ void QtUiMessageProcessor::process(QList<Message> &msgs) {
   QList<Message>::iterator msgIterEnd = msgs.end();
   while(msgIter != msgIterEnd) {
     checkForHighlight(*msgIter);
-    postProcess(*msgIter);
+    preProcess(*msgIter);
     msgIter++;
   }
   Client::messageModel()->insertMessages(msgs);