- if(_cachedFormats.contains(ftype))
- return _cachedFormats.value(ftype);
-
- QTextCharFormat fmt;
-
- // Check if we have a special message format stored already sans color codes
- if(_cachedFormats.contains(ftype & 0x1fffff))
- fmt = _cachedFormats.value(ftype &0x1fffff);
- else {
- // Nope, so we have to construct it...
- // We assume that we don't mix mirc format codes and component codes, so at this point we know that it's either
- // a stock (not stylesheeted) component, or mirc formats
- // In both cases, we start off with the basic format for this message type and then merge the extra stuff
-
- // Check if we at least already have something stored for the message type first
- if(_cachedFormats.contains(ftype & 0xf))
- fmt = _cachedFormats.value(ftype & 0xf);
- else {
- // Not being in the cache means it hasn't been preset via stylesheet (or used before)
- // We might still have set something in code as a fallback, so merge
- fmt = format(None);
- fmt.merge(format((FormatType)(ftype & 0x0f)));
- // This can be cached
- _cachedFormats[ftype & 0x0f] = fmt;
- }
- // OK, at this point we have the message type format - now merge the rest
- if((ftype & 0xf0)) { // mirc format
- for(quint32 mask = 0x10; mask <= 0x80; mask <<= 1) {
- if(!(ftype & mask))
- continue;
- // We need to check for overrides in the cache
- if(_cachedFormats.contains(mask | (ftype & 0x0f)))
- fmt.merge(_cachedFormats.value(mask | (ftype & 0x0f)));
- else if(_cachedFormats.contains(mask))
- fmt.merge(_cachedFormats.value(mask));
- else // nothing in cache, use stock format
- fmt.merge(format((FormatType)mask));
+
+ quint64 label = (quint64)label_ << 32;
+
+ // check if we have exactly this format readily cached already
+ QTextCharFormat fmt = cachedFormat(ftype, label_);
+ if(fmt.properties().count())
+ return fmt;
+
+ mergeFormat(fmt, ftype, label & Q_UINT64_C(0xffff000000000000));
+
+ for(quint64 mask = Q_UINT64_C(0x0000000100000000); mask <= (quint64)Selected << 32; mask <<=1) {
+ if(label & mask)
+ mergeFormat(fmt, ftype, mask | Q_UINT64_C(0xffff000000000000));
+ }
+
+ setCachedFormat(fmt, ftype, label_);
+ return fmt;
+}
+
+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 & 0xfff00)) { // element format
+ for(quint32 mask = 0x00100; mask <= 0x40000; mask <<= 1) {
+ if(ftype & mask) {
+ mergeSubElementFormat(fmt, ftype & (mask | 0xff), label);