Redirection of certain messages to different targets is now possible.
authorMarcus Eggenberger <egs@quassel-irc.org>
Tue, 26 Feb 2008 15:57:40 +0000 (15:57 +0000)
committerMarcus Eggenberger <egs@quassel-irc.org>
Tue, 26 Feb 2008 15:57:40 +0000 (15:57 +0000)
You can chose wheter the message should be displayed in the current
buffer, the status buffer or the original target.
The settings apply currently to notices and error messages like "no such
nick or channel"

src/client/client.cpp
src/client/client.h
src/qtui/settingspages/generalsettingspage.cpp
src/qtui/settingspages/generalsettingspage.ui
version.inc

index a2988ed..24f1726 100644 (file)
@@ -33,6 +33,7 @@
 #include "quasselui.h"
 #include "signalproxy.h"
 #include "util.h"
 #include "quasselui.h"
 #include "signalproxy.h"
 #include "util.h"
+#include "buffersettings.h"
 
 QPointer<Client> Client::instanceptr = 0;
 AccountId Client::_currentCoreAccount = 0;
 
 QPointer<Client> Client::instanceptr = 0;
 AccountId Client::_currentCoreAccount = 0;
@@ -142,7 +143,13 @@ QList<Buffer *> Client::buffers() {
 }
 
 
 }
 
 
-// FIXME remove
+Buffer *Client::statusBuffer(const NetworkId &networkId) const {
+  if(_statusBuffers.contains(networkId))
+    return _statusBuffers[networkId];
+  else
+    return 0;
+}
+
 Buffer *Client::buffer(BufferId bufferId) {
   if(instance()->_buffers.contains(bufferId))
     return instance()->_buffers[bufferId];
 Buffer *Client::buffer(BufferId bufferId) {
   if(instance()->_buffers.contains(bufferId))
     return instance()->_buffers[bufferId];
@@ -150,16 +157,17 @@ Buffer *Client::buffer(BufferId bufferId) {
     return 0;
 }
 
     return 0;
 }
 
-// FIXME remove
 Buffer *Client::buffer(BufferInfo bufferInfo) {
   Buffer *buff = buffer(bufferInfo.bufferId());
 
   if(!buff) {
     Client *client = Client::instance();
     buff = new Buffer(bufferInfo, client);
 Buffer *Client::buffer(BufferInfo bufferInfo) {
   Buffer *buff = buffer(bufferInfo.bufferId());
 
   if(!buff) {
     Client *client = Client::instance();
     buff = new Buffer(bufferInfo, client);
-    connect(buff, SIGNAL(destroyed()),
-           client, SLOT(bufferDestroyed()));
+    connect(buff, SIGNAL(destroyed()), client, SLOT(bufferDestroyed()));
     client->_buffers[bufferInfo.bufferId()] = buff;
     client->_buffers[bufferInfo.bufferId()] = buff;
+    if(bufferInfo.type() == BufferInfo::StatusBuffer)
+      client->_statusBuffers[bufferInfo.networkId()] = buff;
+
     emit client->bufferUpdated(bufferInfo);
 
     // I don't like this: but currently there isn't really a prettier way:
     emit client->bufferUpdated(bufferInfo);
 
     // I don't like this: but currently there isn't really a prettier way:
@@ -327,6 +335,8 @@ void Client::disconnectFromCore() {
   }
   Q_ASSERT(_buffers.isEmpty());
 
   }
   Q_ASSERT(_buffers.isEmpty());
 
+  _statusBuffers.clear();
+
   QHash<NetworkId, Network*>::iterator netIter = _networks.begin();
   while(netIter != _networks.end()) {
     Network *net = netIter.value();
   QHash<NetworkId, Network*>::iterator netIter = _networks.begin();
   while(netIter != _networks.end()) {
     Network *net = netIter.value();
@@ -370,6 +380,15 @@ void Client::bufferDestroyed() {
     }
     iter++;
   }
     }
     iter++;
   }
+
+  QHash<NetworkId, Buffer *>::iterator statusIter = _statusBuffers.begin();
+  while(statusIter != _statusBuffers.end()) {
+    if(statusIter.value() == buffer) {
+      statusIter = _statusBuffers.erase(statusIter);
+      break;
+    }
+    statusIter++;
+  }
 }
 
 void Client::networkDestroyed() {
 }
 
 void Client::networkDestroyed() {
@@ -388,19 +407,55 @@ void Client::networkDestroyed() {
 void Client::recvMessage(const Message &message) {
   Message msg = message;
   Buffer *b;
 void Client::recvMessage(const Message &message) {
   Message msg = message;
   Buffer *b;
-  
-  if(msg.type() == Message::Error) {
-    b = buffer(msg.bufferInfo().bufferId());
-    if(!b) {
-      // FIXME: if buffer doesn't exist, forward the message to the status or current buffer
-      b = buffer(msg.bufferInfo());
+
+  checkForHighlight(msg);
+
+  if(msg.flags() & Message::Redirected) {
+    BufferSettings bufferSettings;
+    bool inStatus = bufferSettings.value("UserMessagesInStatusBuffer", QVariant(true)).toBool();
+    bool inQuery = bufferSettings.value("UserMessagesInQueryBuffer", QVariant(false)).toBool();
+    bool inCurrent = bufferSettings.value("UserMessagesInCurrentBuffer", QVariant(false)).toBool();
+
+    if(inStatus) {
+      b = statusBuffer(msg.bufferInfo().networkId());
+      if(b) {
+       b->appendMsg(msg);
+      } else if(!inQuery && !inCurrent) {      // make sure the message get's shown somewhere
+       b = buffer(msg.bufferInfo());
+       b->appendMsg(msg);
+      }
+    }
+
+    if(inQuery) {
+      b = buffer(msg.bufferInfo().bufferId());
+      if(b) {
+       b->appendMsg(msg);
+      } else if(!inStatus && !inCurrent) {     // make sure the message get's shown somewhere
+       b = statusBuffer(msg.bufferInfo().networkId());
+       if(!b)
+         b = buffer(msg.bufferInfo()); // seems like we have to create the buffer anyways... 
+       b->appendMsg(msg);
+      }
+    }
+
+    if(inCurrent) {
+      BufferId currentId = bufferModel()->currentIndex().data(NetworkModel::BufferIdRole).value<BufferId>();
+      b = buffer(currentId);
+      if(b && currentId != msg.bufferInfo().bufferId() && !inQuery) {
+       b->appendMsg(msg);
+      } else if(!inStatus && !inQuery) {       // make sure the message get's shown somewhere
+       b = statusBuffer(msg.bufferInfo().networkId());
+       if(!b)
+         b = buffer(msg.bufferInfo()); // seems like we have to create the buffer anyways... 
+       b->appendMsg(msg);
+      }
     }
   } else {
     }
   } else {
+    // the regular case: we can deliver where it was supposed to go
     b = buffer(msg.bufferInfo());
     b = buffer(msg.bufferInfo());
+    b->appendMsg(msg);
   }
   }
-
-  checkForHighlight(msg);
-  b->appendMsg(msg);
+  
   //bufferModel()->updateBufferActivity(msg);
 
   if(msg.type() == Message::Plain || msg.type() == Message::Notice || msg.type() == Message::Action) {
   //bufferModel()->updateBufferActivity(msg);
 
   if(msg.type() == Message::Plain || msg.type() == Message::Notice || msg.type() == Message::Action) {
@@ -420,6 +475,11 @@ void Client::recvStatusMsg(QString /*net*/, QString /*msg*/) {
 
 void Client::recvBacklogData(BufferInfo id, QVariantList msgs, bool /*done*/) {
   Buffer *b = buffer(id);
 
 void Client::recvBacklogData(BufferInfo id, QVariantList msgs, bool /*done*/) {
   Buffer *b = buffer(id);
+  if(!b) {
+    qWarning() << "Client::recvBacklogData(): received Backlog for unknown Buffer:" << id;
+    return;
+  }
+    
   foreach(QVariant v, msgs) {
     Message msg = v.value<Message>();
     checkForHighlight(msg);
   foreach(QVariant v, msgs) {
     Message msg = v.value<Message>();
     checkForHighlight(msg);
index 21e6102..4d1bad6 100644 (file)
@@ -193,6 +193,8 @@ private:
   static void setCurrentCoreAccount(AccountId);
   static inline BufferSyncer *bufferSyncer() { return instance()->_bufferSyncer; }
 
   static void setCurrentCoreAccount(AccountId);
   static inline BufferSyncer *bufferSyncer() { return instance()->_bufferSyncer; }
 
+  Buffer *statusBuffer(const NetworkId &networkid) const;
+
   static QPointer<Client> instanceptr;
 
   QPointer<QIODevice> socket;
   static QPointer<Client> instanceptr;
 
   QPointer<QIODevice> socket;
@@ -208,6 +210,7 @@ private:
   bool _connectedToCore, _syncedToCore;
 
   QHash<BufferId, Buffer *> _buffers;
   bool _connectedToCore, _syncedToCore;
 
   QHash<BufferId, Buffer *> _buffers;
+  QHash<NetworkId, Buffer *> _statusBuffers; // fast lookup
   QHash<NetworkId, Network *> _networks;
   QHash<IdentityId, Identity *> _identities;
 
   QHash<NetworkId, Network *> _networks;
   QHash<IdentityId, Identity *> _identities;
 
index e8e6bfb..53ed051 100644 (file)
@@ -50,9 +50,9 @@ GeneralSettingsPage::GeneralSettingsPage(QWidget *parent)
   connect(ui.displayTopicInTooltip, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged()));
   connect(ui.mouseWheelChangesBuffers, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged()));
 
   connect(ui.displayTopicInTooltip, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged()));
   connect(ui.mouseWheelChangesBuffers, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged()));
 
-  ui.userMessagesInStatusBuffer->setEnabled(false);
-  ui.userMessagesInQueryBuffer->setEnabled(false);
-  ui.userMessagesInCurrentBuffer->setEnabled(false);
+//   ui.userMessagesInStatusBuffer->setEnabled(false);
+//   ui.userMessagesInQueryBuffer->setEnabled(false);
+//   ui.userMessagesInCurrentBuffer->setEnabled(false);
 }
 
 bool GeneralSettingsPage::hasDefaults() const {
 }
 
 bool GeneralSettingsPage::hasDefaults() const {
index 4a4784e..4620bb4 100644 (file)
@@ -61,7 +61,7 @@
    <item>
     <widget class="QGroupBox" name="groupBox" >
      <property name="title" >
    <item>
     <widget class="QGroupBox" name="groupBox" >
      <property name="title" >
-      <string>Display user related messages:</string>
+      <string>Display user related messages and private Notices:</string>
      </property>
      <layout class="QVBoxLayout" >
       <item>
      </property>
      <layout class="QVBoxLayout" >
       <item>
index 96e2b8a..959caa9 100644 (file)
@@ -5,7 +5,7 @@
 
   quasselVersion = "0.2.0-alpha1";
   quasselDate = "2008-02-24";
 
   quasselVersion = "0.2.0-alpha1";
   quasselDate = "2008-02-24";
-  quasselBuild = 585;
+  quasselBuild = 586;
 
   //! Minimum client build number the core needs
   clientBuildNeeded = 563;
 
   //! Minimum client build number the core needs
   clientBuildNeeded = 563;