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).
***************************************************************************/
#include "message.h"
+#include "util.h"
#include <QDataStream>
Message::Message(BufferId __buffer, Type __type, QString __text, QString __sender, quint8 __flags)
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()
#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 */
quint8 flags() const;
QDateTime timeStamp() const;
+ QString formattedTimeStamp();
+ QString formattedSender();
+ QString formattedText();
+
+ void format();
+
private:
QDateTime _timeStamp;
MsgId _msgId;
Type _type;
quint8 _flags;
+ QString _formattedTimeStamp, _formattedSender, _formattedText; // cache
+
+ QString mircToInternal(QString);
+
friend QDataStream &operator>>(QDataStream &in, Message &msg);
};
}
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();
}
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)