From 374bb1f45bed3d21ad9abd7343bf0d2fc8a56fbc Mon Sep 17 00:00:00 2001 From: Manuel Nickschas Date: Thu, 8 Mar 2018 00:22:24 +0100 Subject: [PATCH] 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. --- src/uisupport/qssparser.cpp | 2 -- src/uisupport/uistyle.cpp | 20 ++++++++++++++------ src/uisupport/uistyle.h | 1 - 3 files changed, 14 insertions(+), 9 deletions(-) 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, -- 2.20.1