+void UiStyle::mergeFormat(QTextCharFormat &fmt, quint32 ftype, quint64 label) {
+ mergeSubElementFormat(fmt, ftype & 0x00ff, label);
+
+ // 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"
+ if((ftype & 0xfff0)) { // element format
+ for(quint32 mask = 0x00100; mask <= 0x40000; mask <<= 1) {
+ if(ftype & mask) {
+ mergeSubElementFormat(fmt, mask | 0xff, label);
+ }
+ }
+ }
+
+ // Now we handle color codes
+ // We assume that those can't be combined with subelement and message types.
+ if(ftype & 0x00400000)
+ mergeSubElementFormat(fmt, ftype & 0x0f400000, label); // foreground
+ if(ftype & 0x00800000)
+ mergeSubElementFormat(fmt, ftype & 0xf0800000, label); // background
+ if((ftype & 0x00c00000) == 0x00c00000)
+ mergeSubElementFormat(fmt, ftype & 0xffc00000, label); // combination
+
+ // URL
+ if(ftype & Url)
+ mergeSubElementFormat(fmt, ftype & Url, label);
+}
+
+// Merge a subelement format into an existing message format
+void UiStyle::mergeSubElementFormat(QTextCharFormat& fmt, quint32 ftype, quint64 label) {
+ quint64 key = ftype | label;
+ fmt.merge(cachedFormat(key & Q_UINT64_C(0x0000ffffffffff00))); // label + subelement
+ fmt.merge(cachedFormat(key & Q_UINT64_C(0x0000ffffffffffff))); // label + subelement + msgtype
+ fmt.merge(cachedFormat(key & Q_UINT64_C(0xffffffffffffff00))); // label + subelement + nickhash
+ fmt.merge(cachedFormat(key & Q_UINT64_C(0xffffffffffffffff))); // label + subelement + nickhash + msgtype
+}
+
+UiStyle::FormatType UiStyle::formatType(Message::Type msgType) {
+ switch(msgType) {
+ case Message::Plain:
+ return PlainMsg;
+ case Message::Notice:
+ return NoticeMsg;
+ case Message::Action:
+ return ActionMsg;
+ case Message::Nick:
+ return NickMsg;
+ case Message::Mode:
+ return ModeMsg;
+ case Message::Join:
+ return JoinMsg;
+ case Message::Part:
+ return PartMsg;
+ case Message::Quit:
+ return QuitMsg;
+ case Message::Kick:
+ return KickMsg;
+ case Message::Kill:
+ return KillMsg;
+ case Message::Server:
+ return ServerMsg;
+ case Message::Info:
+ return InfoMsg;
+ case Message::Error:
+ return ErrorMsg;
+ case Message::DayChange:
+ return DayChangeMsg;
+ }
+ //Q_ASSERT(false); // we need to handle all message types
+ qWarning() << Q_FUNC_INFO << "Unknown message type:" << msgType;
+ return ErrorMsg;
+}
+
+UiStyle::FormatType UiStyle::formatType(const QString & code) {