uistyle: Support reverse color rendering
authorManuel Nickschas <sputnick@quassel-irc.org>
Wed, 7 Mar 2018 23:22:24 +0000 (00:22 +0100)
committerManuel Nickschas <sputnick@quassel-irc.org>
Thu, 8 Mar 2018 01:10:28 +0000 (02:10 +0100)
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
src/uisupport/uistyle.cpp
src/uisupport/uistyle.h

index d1a13e8..07dab3a 100644 (file)
@@ -322,8 +322,6 @@ std::pair<UiStyle::FormatType, UiStyle::MessageLabel> QssParser::parseFormatType
                     fmtType |= FormatType::Italic;
                 else if (condValue == "underline")
                     fmtType |= FormatType::Underline;
                     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;
                 else {
                     qWarning() << Q_FUNC_INFO << tr("Invalid format name: %1").arg(condValue);
                     return invalid;
index d913fc9..bd9b013 100644 (file)
@@ -18,6 +18,7 @@
  *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.         *
  ***************************************************************************/
 
  *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.         *
  ***************************************************************************/
 
+#include <utility>
 #include <vector>
 
 #include <QApplication>
 #include <vector>
 
 #include <QApplication>
@@ -86,7 +87,6 @@ UiStyle::UiStyle(QObject *parent)
     _formatCodes["%B"] = FormatType::Bold;
     _formatCodes["%S"] = FormatType::Italic;
     _formatCodes["%U"] = FormatType::Underline;
     _formatCodes["%B"] = FormatType::Bold;
     _formatCodes["%S"] = FormatType::Italic;
     _formatCodes["%U"] = FormatType::Underline;
-    _formatCodes["%R"] = FormatType::Reverse;
 
     _formatCodes["%DN"] = FormatType::Nick;
     _formatCodes["%DH"] = FormatType::Hostmask;
 
     _formatCodes["%DN"] = FormatType::Nick;
     _formatCodes["%DH"] = FormatType::Hostmask;
@@ -639,6 +639,7 @@ UiStyle::StyledString UiStyle::styleString(const QString &s_, FormatType baseFor
     }
 
     Format curfmt{baseFormat, {}, {}};
     }
 
     Format curfmt{baseFormat, {}, {}};
+    QChar fgChar{'f'}; // character to indicate foreground color, changed when reversing
 
     int pos = 0; quint16 length = 0;
     for (;;) {
 
     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)
                 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;
                     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)};
         }
         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);
             }
                 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{};
             curfmt.type &= 0x000000ff; // we keep message type-specific formatting
             curfmt.foreground = QColor{};
             curfmt.background = QColor{};
+            fgChar = 'f';
             length = 2;
         }
             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<quint32>(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
             length = 2;
         }
         else { // all others are toggles
index f0618bb..35d9eee 100644 (file)
@@ -81,7 +81,6 @@ public:
         Bold            = 0x00000100,
         Italic          = 0x00000200,
         Underline       = 0x00000400,
         Bold            = 0x00000100,
         Italic          = 0x00000200,
         Underline       = 0x00000400,
-        Reverse         = 0x00000800,
 
         // Individual parts of a message
         Timestamp       = 0x00001000,
 
         // Individual parts of a message
         Timestamp       = 0x00001000,