Moving the message format code (i.e. msg -> formatted string) from Style into Message.
authorManuel Nickschas <sputnick@quassel-irc.org>
Thu, 4 Oct 2007 23:14:22 +0000 (23:14 +0000)
committerManuel Nickschas <sputnick@quassel-irc.org>
Thu, 4 Oct 2007 23:14:22 +0000 (23:14 +0000)
This avoids code duplication, since that function is needed by all GUIs. Note that
the "formatted string" contains our internal format codes, which are then translated
into real eyecandy elsewhere (e.g. in Style).

src/common/message.cpp
src/common/message.h
src/qtgui/chatline.cpp
src/qtgui/style.cpp

index 9875473..7adedef 100644 (file)
@@ -19,6 +19,7 @@
  ***************************************************************************/
 
 #include "message.h"
+#include "util.h"
 #include <QDataStream>
 
 Message::Message(BufferId __buffer, Type __type, QString __text, QString __sender, quint8 __flags)
@@ -63,6 +64,92 @@ QDateTime Message::timeStamp() const {
   return _timeStamp;
 }
 
+QString Message::mircToInternal(QString mirc) {
+  mirc.replace('%', "%%");      // escape % just to be sure
+  mirc.replace('\x02', "%B");
+  mirc.replace('\x03', "%C");
+  mirc.replace('\x0f', "%O");
+  mirc.replace('\x12', "%R");
+  mirc.replace('\x16', "%R");
+  mirc.replace('\x1d', "%S");
+  mirc.replace('\x1f', "%U");
+  return mirc;
+}
+
+void Message::format() {
+  if(!_formattedText.isNull()) return; // already done
+  QString user = userFromMask(sender());
+  QString host = hostFromMask(sender());
+  QString nick = nickFromMask(sender());
+  QString txt = mircToInternal(text());
+  QString networkName = buffer().network();
+  QString bufferName = buffer().buffer();
+
+  _formattedTimeStamp = tr("%DT[%1]").arg(timeStamp().toLocalTime().toString("hh:mm:ss"));
+
+  QString s, t;
+  switch(type()) {
+    case Message::Plain:
+      s = tr("%DS<%1>").arg(nick); t = tr("%D0%1").arg(txt); break;
+    case Message::Server:
+      s = tr("%Ds*"); t = tr("%Ds%1").arg(txt); break;
+    case Message::Error:
+      s = tr("%De*"); t = tr("%De%1").arg(txt); break;
+    case Message::Join:
+      s = tr("%Dj-->"); t = tr("%Dj%DN%DU%1%DU%DN %DH(%2@%3)%DH has joined %DC%DU%4%DU%DC").arg(nick, user, host, bufferName); break;
+    case Message::Part:
+      s = tr("%Dp<--"); t = tr("%Dp%DN%DU%1%DU%DN %DH(%2@%3)%DH has left %DC%DU%4%DU%DC").arg(nick, user, host, bufferName);
+      if(!txt.isEmpty()) t = QString("%1 (%2)").arg(t).arg(txt);
+      break;
+    case Message::Quit:
+      s = tr("%Dq<--"); t = tr("%Dq%DN%DU%1%DU%DN %DH(%2@%3)%DH has quit").arg(nick, user, host);
+      if(!txt.isEmpty()) t = QString("%1 (%2)").arg(t).arg(txt);
+      break;
+    case Message::Kick:
+    { s = tr("%Dk<-*");
+    QString victim = txt.section(" ", 0, 0);
+        //if(victim == ui.ownNick->currentText()) victim = tr("you");
+    QString kickmsg = txt.section(" ", 1);
+    t = tr("%Dk%DN%DU%1%DU%DN has kicked %DN%DU%2%DU%DN from %DC%DU%3%DU%DC").arg(nick).arg(victim).arg(bufferName);
+    if(!kickmsg.isEmpty()) t = QString("%1 (%2)").arg(t).arg(kickmsg);
+    }
+    break;
+    case Message::Nick:
+      s = tr("%Dr<->");
+      if(nick == text()) t = tr("%DrYou are now known as %DN%1%DN").arg(text());
+      else t = tr("%Dr%DN%1%DN is now known as %DN%DU%2%DU%DN").arg(nick, text());
+      break;
+    case Message::Mode:
+      s = tr("%Dm***");
+      if(nick.isEmpty()) t = tr("%DmUser mode: %DM%1%DM").arg(text());
+      else t = tr("%DmMode %DM%1%DM by %DN%DU%2%DU%DN").arg(text(), nick);
+      break;
+    case Message::Action:
+      s = tr("%Da-*-");
+      t = tr("%Da%DN%DU%1%DU%DN %2").arg(nick).arg(text());
+      break;
+    default:
+      s = tr("%De%1").arg(sender());
+      t = tr("%De[%1]").arg(text());
+  }
+  _formattedSender = s;
+  _formattedText = t;
+}
+
+QString Message::formattedTimeStamp() {
+  format();
+  return _formattedTimeStamp;
+}
+
+QString Message::formattedSender() {
+  format();
+  return _formattedSender;
+}
+
+QString Message::formattedText() {
+  format();
+  return _formattedText;
+}
 
 QDataStream &operator<<(QDataStream &out, const Message &msg) {
   out << (quint32)msg.timeStamp().toTime_t() << (quint8)msg.type() << (quint8)msg.flags()
index baa8846..7fcd797 100644 (file)
 #ifndef _MESSAGE_H_
 #define _MESSAGE_H_
 
+#include <QCoreApplication>
 #include <QString>
 #include <QDateTime>
 
 #include "global.h"
 
 class Message {
+  Q_DECLARE_TR_FUNCTIONS(Message);
 
   public:
     /** The different types a message can have for display */
@@ -47,6 +49,12 @@ class Message {
     quint8 flags() const;
     QDateTime timeStamp() const;
 
+    QString formattedTimeStamp();
+    QString formattedSender();
+    QString formattedText();
+
+    void format();
+
   private:
     QDateTime _timeStamp;
     MsgId _msgId;
@@ -56,6 +64,10 @@ class Message {
     Type _type;
     quint8 _flags;
 
+    QString _formattedTimeStamp, _formattedSender, _formattedText; // cache
+
+    QString mircToInternal(QString);
+
     friend QDataStream &operator>>(QDataStream &in, Message &msg);
 
 };
index 10a5239..ef84777 100644 (file)
@@ -40,63 +40,10 @@ ChatLine::~ChatLine() {
 }
 
 void ChatLine::formatMsg(Message msg) {
-  QString user = userFromMask(msg.sender());
-  QString host = hostFromMask(msg.sender());
-  QString nick = nickFromMask(msg.sender());
-  QString text = Style::mircToInternal(msg.text());
-  QString networkName = msg.buffer().network();
-  QString bufferName = msg.buffer().buffer();
-
-  QString c = tr("%DT[%1]").arg(msg.timeStamp().toLocalTime().toString("hh:mm:ss"));
-  QString s, t;
-  switch(msg.type()) {
-    case Message::Plain:
-      s = tr("%DS<%1>").arg(nick); t = tr("%D0%1").arg(text); break;
-    case Message::Server:
-      s = tr("%Ds*"); t = tr("%Ds%1").arg(text); break;
-    case Message::Error:
-      s = tr("%De*"); t = tr("%De%1").arg(text); break;
-    case Message::Join:
-      s = tr("%Dj-->"); t = tr("%Dj%DN%DU%1%DU%DN %DH(%2@%3)%DH has joined %DC%DU%4%DU%DC").arg(nick, user, host, bufferName); break;
-    case Message::Part:
-      s = tr("%Dp<--"); t = tr("%Dp%DN%DU%1%DU%DN %DH(%2@%3)%DH has left %DC%DU%4%DU%DC").arg(nick, user, host, bufferName);
-      if(!text.isEmpty()) t = QString("%1 (%2)").arg(t).arg(text);
-      break;
-    case Message::Quit:
-      s = tr("%Dq<--"); t = tr("%Dq%DN%DU%1%DU%DN %DH(%2@%3)%DH has quit").arg(nick, user, host);
-      if(!text.isEmpty()) t = QString("%1 (%2)").arg(t).arg(text);
-      break;
-    case Message::Kick:
-    { s = tr("%Dk<-*");
-    QString victim = text.section(" ", 0, 0);
-        //if(victim == ui.ownNick->currentText()) victim = tr("you");
-    QString kickmsg = text.section(" ", 1);
-    t = tr("%Dk%DN%DU%1%DU%DN has kicked %DN%DU%2%DU%DN from %DC%DU%3%DU%DC").arg(nick).arg(victim).arg(bufferName);
-    if(!kickmsg.isEmpty()) t = QString("%1 (%2)").arg(t).arg(kickmsg);
-    }
-    break;
-    case Message::Nick:
-      s = tr("%Dr<->");
-      if(nick == msg.text()) t = tr("%DrYou are now known as %DN%1%DN").arg(msg.text());
-      else t = tr("%Dr%DN%1%DN is now known as %DN%DU%2%DU%DN").arg(nick, msg.text());
-      break;
-    case Message::Mode:
-      s = tr("%Dm***");
-      if(nick.isEmpty()) t = tr("%DmUser mode: %DM%1%DM").arg(msg.text());
-      else t = tr("%DmMode %DM%1%DM by %DN%DU%2%DU%DN").arg(msg.text(), nick);
-      break;
-    case Message::Action:
-      s = tr("%Da-*-");
-      t = tr("%Da%DN%DU%1%DU%DN %2").arg(nick).arg(msg.text());
-      break;
-    default:
-      s = tr("%De%1").arg(msg.sender());
-      t = tr("%De[%1]").arg(msg.text());
-  }
   QTextOption tsOption, senderOption, textOption;
-  tsFormatted = Style::internalToFormatted(c);
-  senderFormatted = Style::internalToFormatted(s);
-  textFormatted = Style::internalToFormatted(t);
+  tsFormatted = Style::internalToFormatted(msg.formattedTimeStamp());
+  senderFormatted = Style::internalToFormatted(msg.formattedSender());
+  textFormatted = Style::internalToFormatted(msg.formattedText());
   precomputeLine();
 }
 
index 5488986..87af678 100644 (file)
@@ -156,18 +156,6 @@ void Style::init() {
   formats["%DU"] = url;
 }
 
-QString Style::mircToInternal(QString mirc) {
-  mirc.replace('%', "%%");      // escape % just to be sure
-  mirc.replace('\x02', "%B");
-  mirc.replace('\x03', "%C");
-  mirc.replace('\x0f', "%O");
-  mirc.replace('\x12', "%R");
-  mirc.replace('\x16', "%R");
-  mirc.replace('\x1d', "%S");
-  mirc.replace('\x1f', "%U");
-  return mirc;
-}
-
 /** Returns a string stripped of format codes, and a list of FormatRange objects
  *  describing the formats of the string.
  * \param s string in internal format (% style format codes)