- if(_cachedFormats.contains(ftype)) return _cachedFormats.value(ftype);
- if(ftype == Invalid) return QTextCharFormat();
- // Now we construct the merged format, starting with the default
- QTextCharFormat fmt = format(None);
- // First: general message format
- fmt.merge(format((FormatType)(ftype & 0x0f)));
- // now more specific ones
- for(quint32 mask = 0x0010; mask <= 0x2000; mask <<= 1) {
- if(ftype & mask) fmt.merge(format((FormatType)mask));
+ if(ftype == Invalid)
+ return QTextCharFormat();
+ 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));
+ }
+ } else { // component
+ // We've already checked the cache for the combo of msgtype and component and failed,
+ // so we check if we defined a general format and merge this, or the stock format else
+ if(_cachedFormats.contains(ftype & 0xff00))
+ fmt.merge(_cachedFormats.value(ftype & 0xff00));
+ else
+ fmt.merge(format((FormatType)(ftype & 0xff00)));
+ }