#include "uisettings.h"
#include "util.h"
+QHash<QString, UiStyle::FormatType> UiStyle::_formatCodes;
+
UiStyle::UiStyle() {
// register FormatList if that hasn't happened yet
// FIXME I don't think this actually avoids double registration... then again... does it hurt?
quint64 key = ftype | ((quint64)label << 32);
// start with the most general format and then specialize
- fmt.merge(cachedFormat(key & 0x00000000fffffff0)); // basic subelement format
- fmt.merge(cachedFormat(key & 0x00000000ffffffff)); // subelement + msgtype
- fmt.merge(cachedFormat(key & 0xffff0000fffffff0)); // subelement + nickhash
- fmt.merge(cachedFormat(key & 0xffff0000ffffffff)); // subelement + nickhash + msgtype
- fmt.merge(cachedFormat(key & 0x0000fffffffffff0)); // label + subelement
- fmt.merge(cachedFormat(key & 0x0000ffffffffffff)); // label + subelement + msgtype
- fmt.merge(cachedFormat(key & 0xfffffffffffffff0)); // label + subelement + nickhash
- fmt.merge(cachedFormat(key & 0xffffffffffffffff)); // label + subelement + nickhash + msgtype
+ fmt.merge(cachedFormat(key & Q_UINT64_C(0x00000000fffffff0))); // basic subelement format
+ fmt.merge(cachedFormat(key & Q_UINT64_C(0x00000000ffffffff))); // subelement + msgtype
+ fmt.merge(cachedFormat(key & Q_UINT64_C(0xffff0000fffffff0))); // subelement + nickhash
+ fmt.merge(cachedFormat(key & Q_UINT64_C(0xffff0000ffffffff))); // subelement + nickhash + msgtype
+ fmt.merge(cachedFormat(key & Q_UINT64_C(0x0000fffffffffff0))); // label + subelement
+ fmt.merge(cachedFormat(key & Q_UINT64_C(0x0000ffffffffffff))); // label + subelement + msgtype
+ fmt.merge(cachedFormat(key & Q_UINT64_C(0xfffffffffffffff0))); // label + subelement + nickhash
+ fmt.merge(cachedFormat(key & Q_UINT64_C(0xffffffffffffffff))); // label + subelement + nickhash + msgtype
}
// NOTE: This function is intimately tied to the values in FormatType. Don't change this
if(fmt.properties().count())
return fmt;
- fmt.merge(cachedFormat(key & 0x0000000000000000)); // basic
- fmt.merge(cachedFormat(key & 0x000000000000000f)); // msgtype
- fmt.merge(cachedFormat(key & 0x0000ffff00000000)); // label
- fmt.merge(cachedFormat(key & 0x0000ffff0000000f)); // label + msgtype
+ fmt.merge(cachedFormat(key & Q_UINT64_C(0x0000000000000000))); // basic
+ fmt.merge(cachedFormat(key & Q_UINT64_C(0x000000000000000f))); // msgtype
+ fmt.merge(cachedFormat(key & Q_UINT64_C(0xffff000000000000))); // nickhash
+ fmt.merge(cachedFormat(key & Q_UINT64_C(0xffff00000000000f))); // nickhash + msgtype
+ fmt.merge(cachedFormat(key & Q_UINT64_C(0x0000ffff00000000))); // label
+ fmt.merge(cachedFormat(key & Q_UINT64_C(0x0000ffff0000000f))); // label + msgtype
+ fmt.merge(cachedFormat(key & Q_UINT64_C(0xffffffff00000000))); // label + nickhash
+ fmt.merge(cachedFormat(key & Q_UINT64_C(0xffffffff0000000f))); // label + nickhash + msgtype
// TODO: allow combinations for mirc formats and colors (each), e.g. setting a special format for "bold and italic"
// or "foreground 01 and background 03"
return (_metricsCache[key] = new QFontMetricsF(format(ftype, label).font()));
}
-UiStyle::FormatType UiStyle::formatType(Message::Type msgType) const {
+UiStyle::FormatType UiStyle::formatType(Message::Type msgType) {
switch(msgType) {
case Message::Plain:
return PlainMsg;
return ErrorMsg;
}
-UiStyle::FormatType UiStyle::formatType(const QString & code) const {
+UiStyle::FormatType UiStyle::formatType(const QString & code) {
if(_formatCodes.contains(code)) return _formatCodes.value(code);
return Invalid;
}
-QString UiStyle::formatCode(FormatType ftype) const {
+QString UiStyle::formatCode(FormatType ftype) {
return _formatCodes.key(ftype);
}
-QList<QTextLayout::FormatRange> UiStyle::toTextLayoutList(const FormatList &formatList, int textLength) {
+QList<QTextLayout::FormatRange> UiStyle::toTextLayoutList(const FormatList &formatList, int textLength, quint32 messageLabel) {
QList<QTextLayout::FormatRange> formatRanges;
QTextLayout::FormatRange range;
int i = 0;
for(i = 0; i < formatList.count(); i++) {
- range.format = format(formatList.at(i).second);
+ range.format = format(formatList.at(i).second, messageLabel);
range.start = formatList.at(i).first;
if(i > 0) formatRanges.last().length = range.start - formatRanges.last().start;
formatRanges.append(range);
return StyledString();
}
StyledString result;
- result.formatList.append(qMakePair((quint16)0, (quint32)None));
+ result.formatList.append(qMakePair((quint16)0, baseFormat));
quint32 curfmt = baseFormat;
int pos = 0; quint16 length = 0;
for(;;) {
return result;
}
-QString UiStyle::mircToInternal(const QString &mirc_) const {
+QString UiStyle::mircToInternal(const QString &mirc_) {
QString mirc = mirc_;
mirc.replace('%', "%%"); // escape % just to be sure
mirc.replace('\x02', "%B");
UiStyle::StyledMessage::StyledMessage(const Message &msg)
: Message(msg)
{
+ if(type() == Message::Plain)
+ _senderHash = 0xff;
+ else
+ _senderHash = 0x00; // this means we never compute the hash for msgs that aren't plain
}
-void UiStyle::StyledMessage::style(UiStyle *style) const {
+void UiStyle::StyledMessage::style() const {
QString user = userFromMask(sender());
QString host = hostFromMask(sender());
QString nick = nickFromMask(sender());
- QString txt = style->mircToInternal(contents());
+ QString txt = UiStyle::mircToInternal(contents());
QString bufferName = bufferInfo().bufferName();
bufferName.replace('%', "%%"); // well, you _can_ have a % in a buffername apparently... -_-
default:
t = tr("[%1]").arg(txt);
}
- _contents = style->styleString(t, style->formatType(type()));
+ _contents = UiStyle::styleString(t, UiStyle::formatType(type()));
+}
+
+const QString &UiStyle::StyledMessage::plainContents() const {
+ if(_contents.plainText.isNull())
+ style();
+
+ return _contents.plainText;
+}
+
+const UiStyle::FormatList &UiStyle::StyledMessage::contentsFormatList() const {
+ if(_contents.plainText.isNull())
+ style();
+
+ return _contents.formatList;
}
QString UiStyle::StyledMessage::decoratedTimestamp() const {
}
}
+// FIXME hardcoded to 16 sender hashes
+quint8 UiStyle::StyledMessage::senderHash() const {
+ if(_senderHash != 0xff)
+ return _senderHash;
+
+ QString nick = nickFromMask(sender()).toLower();
+ if(!nick.isEmpty()) {
+ int chopCount = 0;
+ while(nick.at(nick.count() - 1 - chopCount) == '_')
+ chopCount++;
+ nick.chop(chopCount);
+ }
+ quint16 hash = qChecksum(nick.toAscii().data(), nick.toAscii().size());
+ return (_senderHash = (hash & 0xf) + 1);
+}
+
/***********************************************************************************/
QDataStream &operator<<(QDataStream &out, const UiStyle::FormatList &formatList) {