X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fuisupport%2Fuistyle.cpp;h=9abdeb53d4229e379bde21f048b7592de6f5d45a;hp=4cb7dff6af742a6406deb45634d796a5054015d7;hb=7fcfb895c67d3769e985905cbc0bc885f5e52b56;hpb=858cba7fac9928549219de070397be65e1b92cde diff --git a/src/uisupport/uistyle.cpp b/src/uisupport/uistyle.cpp index 4cb7dff6..9abdeb53 100644 --- a/src/uisupport/uistyle.cpp +++ b/src/uisupport/uistyle.cpp @@ -25,7 +25,7 @@ UiStyle::UiStyle(const QString &settingsKey) : _settingsKey(settingsKey) { // register FormatList if that hasn't happened yet - // FIXME I don't think this actually avoids double registration... :/ + // FIXME I don't think this actually avoids double registration... then again... does it hurt? if(QVariant::nameToType("UiStyle::FormatList") == QVariant::Invalid) { qRegisterMetaType("UiStyle::FormatList"); qRegisterMetaTypeStreamOperators("UiStyle::FormatList"); @@ -119,6 +119,8 @@ void UiStyle::setFormat(FormatType ftype, QTextCharFormat fmt, Settings::Mode mo s.removeCustomFormat(ftype); } } + // TODO: invalidate only affected cached formats... if that's possible with less overhead than just rebuilding them + _cachedFormats.clear(); } QTextCharFormat UiStyle::format(FormatType ftype, Settings::Mode mode) const { @@ -144,6 +146,7 @@ QTextCharFormat UiStyle::mergedFormat(quint32 ftype) { if(ftype & 0x00800000) fmt.merge(format((FormatType)(ftype & 0xf0800000))); // background // URL if(ftype & Url) fmt.merge(format(Url)); + _cachedFormats[ftype] = fmt; return fmt; } @@ -160,12 +163,16 @@ QString UiStyle::formatCode(FormatType ftype) const { // Since we create those ourselves, we should be pretty safe that nobody does something crappy here. UiStyle::StyledString UiStyle::styleString(const QString &s_) { QString s = s_; + if(s.length() > 65535) { + qWarning() << QString("String too long to be styled: %1").arg(s); + return StyledString(); + } StyledString result; - result.formats.append(qMakePair(0, (quint32)None)); + result.formatList.append(qMakePair((quint16)0, (quint32)None)); quint32 curfmt = (quint32)None; - int pos = 0; int length = 0; + int pos = 0; quint16 length = 0; for(;;) { - pos = s.indexOf('%', pos); + int pos = s.indexOf('%', pos); if(pos < 0) break; if(s[pos+1] == '%') { // escaped %, we just remove one and continue s.remove(pos, 1); @@ -205,12 +212,12 @@ UiStyle::StyledString UiStyle::styleString(const QString &s_) { length = code.length(); } s.remove(pos, length); - if(pos == result.formats.last().first) - result.formats.last().second = curfmt; + if(pos == result.formatList.last().first) + result.formatList.last().second = curfmt; else - result.formats.append(qMakePair(pos, curfmt)); + result.formatList.append(qMakePair((quint16)pos, curfmt)); } - result.text = s; + result.plainText = s; return result; } @@ -262,7 +269,7 @@ UiStyle::StyledMessage UiStyle::styleMessage(const Message &msg) { QString user = userFromMask(msg.sender()); QString host = hostFromMask(msg.sender()); QString nick = nickFromMask(msg.sender()); - QString txt = mircToInternal(msg.text()); + QString txt = mircToInternal(msg.contents()); QString bufferName = msg.bufferInfo().bufferName(); StyledMessage result; @@ -300,7 +307,7 @@ UiStyle::StyledMessage UiStyle::styleMessage(const Message &msg) { break; case Message::Nick: s = tr("%Dr<->"); - if(nick == msg.text()) t = tr("%DrYou are now known as %DN%1%DN").arg(txt); + if(nick == msg.contents()) t = tr("%DrYou are now known as %DN%1%DN").arg(txt); else t = tr("%Dr%DN%1%DN is now known as %DN%2%DN").arg(nick, txt); break; case Message::Mode: @@ -317,7 +324,7 @@ UiStyle::StyledMessage UiStyle::styleMessage(const Message &msg) { t = tr("%De[%1]").arg(txt); } result.sender = styleString(s); - result.text = styleString(t); + result.contents = styleString(t); return result; } @@ -332,12 +339,12 @@ QDataStream &operator<<(QDataStream &out, const UiStyle::FormatList &formatList) } QDataStream &operator>>(QDataStream &in, UiStyle::FormatList &formatList) { - int cnt; + quint16 cnt; in >> cnt; - for(int i = 0; i < cnt; i++) { - int pos; quint32 ftype; + for(quint16 i = 0; i < cnt; i++) { + quint16 pos; quint32 ftype; in >> pos >> ftype; - formatList.append(qMakePair(pos, ftype)); + formatList.append(qMakePair((quint16)pos, ftype)); } return in; }