From de1613db2dd9623aa650f7217eb718381bb642e3 Mon Sep 17 00:00:00 2001 From: Manuel Nickschas Date: Thu, 4 Oct 2007 23:14:22 +0000 Subject: [PATCH] Moving the message format code (i.e. msg -> formatted string) from Style into Message. 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 | 87 ++++++++++++++++++++++++++++++++++++++++++ src/common/message.h | 12 ++++++ src/qtgui/chatline.cpp | 59 ++-------------------------- src/qtgui/style.cpp | 12 ------ 4 files changed, 102 insertions(+), 68 deletions(-) diff --git a/src/common/message.cpp b/src/common/message.cpp index 9875473a..7adedef5 100644 --- a/src/common/message.cpp +++ b/src/common/message.cpp @@ -19,6 +19,7 @@ ***************************************************************************/ #include "message.h" +#include "util.h" #include 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() diff --git a/src/common/message.h b/src/common/message.h index baa88465..7fcd797c 100644 --- a/src/common/message.h +++ b/src/common/message.h @@ -21,12 +21,14 @@ #ifndef _MESSAGE_H_ #define _MESSAGE_H_ +#include #include #include #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); }; diff --git a/src/qtgui/chatline.cpp b/src/qtgui/chatline.cpp index 10a52391..ef847774 100644 --- a/src/qtgui/chatline.cpp +++ b/src/qtgui/chatline.cpp @@ -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(); } diff --git a/src/qtgui/style.cpp b/src/qtgui/style.cpp index 54889868..87af6787 100644 --- a/src/qtgui/style.cpp +++ b/src/qtgui/style.cpp @@ -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) -- 2.20.1