From: Manuel Nickschas Date: Wed, 7 Mar 2018 23:22:24 +0000 (+0100) Subject: uistyle: Support reverse color rendering X-Git-Tag: travis-deploy-test~165 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=374bb1f45bed3d21ad9abd7343bf0d2fc8a56fbc;hp=b12b02f1bd5ee8a68bda20622b7ec3eac84f000c uistyle: Support reverse color rendering Format codes 0x12 and 0x16 toggle the swap of foreground and background colors. In the current implementation, the color swap only applies to custom colors, i.e. mIRC colors and hex colors. Normal text is not affected. Since this is not a styleable property, remove support for it from the stylesheet parser. --- diff --git a/src/uisupport/qssparser.cpp b/src/uisupport/qssparser.cpp index d1a13e8f..07dab3a8 100644 --- a/src/uisupport/qssparser.cpp +++ b/src/uisupport/qssparser.cpp @@ -322,8 +322,6 @@ std::pair QssParser::parseFormatType fmtType |= FormatType::Italic; else if (condValue == "underline") fmtType |= FormatType::Underline; - else if (condValue == "reverse") - fmtType |= FormatType::Reverse; else { qWarning() << Q_FUNC_INFO << tr("Invalid format name: %1").arg(condValue); return invalid; diff --git a/src/uisupport/uistyle.cpp b/src/uisupport/uistyle.cpp index d913fc9b..bd9b013c 100644 --- a/src/uisupport/uistyle.cpp +++ b/src/uisupport/uistyle.cpp @@ -18,6 +18,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ +#include #include #include @@ -86,7 +87,6 @@ UiStyle::UiStyle(QObject *parent) _formatCodes["%B"] = FormatType::Bold; _formatCodes["%S"] = FormatType::Italic; _formatCodes["%U"] = FormatType::Underline; - _formatCodes["%R"] = FormatType::Reverse; _formatCodes["%DN"] = FormatType::Nick; _formatCodes["%DH"] = FormatType::Hostmask; @@ -639,6 +639,7 @@ UiStyle::StyledString UiStyle::styleString(const QString &s_, FormatType baseFor } Format curfmt{baseFormat, {}, {}}; + QChar fgChar{'f'}; // character to indicate foreground color, changed when reversing int pos = 0; quint16 length = 0; for (;;) { @@ -660,7 +661,7 @@ UiStyle::StyledString UiStyle::styleString(const QString &s_, FormatType baseFor quint32 color = 10 * s[pos+4].digitValue() + s[pos+5].digitValue(); // Color values 0-15 are traditional mIRC colors, defined in the stylesheet and thus going through the format engine // Larger color values are hardcoded and applied separately (cf. https://modern.ircdocs.horse/formatting.html#colors-16-98) - if (s[pos+3] == 'f') { + if (s[pos+3] == fgChar) { if (color < 16) { // Traditional mIRC color, defined in the stylesheet curfmt.type &= 0xf0ffffff; @@ -688,7 +689,7 @@ UiStyle::StyledString UiStyle::styleString(const QString &s_, FormatType baseFor } else if (s[pos+1] == 'D' && s[pos+2] == 'h') { // Hex color QColor color{s.mid(pos+4, 7)}; - if (s[pos+3] == 'f') { + if (s[pos+3] == fgChar) { curfmt.type &= 0xf0bfffff; // mask out mIRC foreground color curfmt.foreground = std::move(color); } @@ -702,11 +703,18 @@ UiStyle::StyledString UiStyle::styleString(const QString &s_, FormatType baseFor curfmt.type &= 0x000000ff; // we keep message type-specific formatting curfmt.foreground = QColor{}; curfmt.background = QColor{}; + fgChar = 'f'; length = 2; } - else if (s[pos+1] == 'R') { // reverse - // TODO: implement reverse formatting - + else if (s[pos+1] == 'R') { // Reverse colors + fgChar = (fgChar == 'f' ? 'b' : 'f'); + quint32 orig = static_cast(curfmt.type & 0xffc00000); + curfmt.type &= 0x003fffff; + curfmt.type |= (orig & 0x00400000) <<1; + curfmt.type |= (orig & 0x0f000000) <<4; + curfmt.type |= (orig & 0x00800000) >>1; + curfmt.type |= (orig & 0xf0000000) >>4; + std::swap(curfmt.foreground, curfmt.background); length = 2; } else { // all others are toggles diff --git a/src/uisupport/uistyle.h b/src/uisupport/uistyle.h index f0618bbb..35d9eeeb 100644 --- a/src/uisupport/uistyle.h +++ b/src/uisupport/uistyle.h @@ -81,7 +81,6 @@ public: Bold = 0x00000100, Italic = 0x00000200, Underline = 0x00000400, - Reverse = 0x00000800, // Individual parts of a message Timestamp = 0x00001000,