Escape % in channel names
[quassel.git] / src / uisupport / uistyle.cpp
index 3b55d68..b95a530 100644 (file)
 #include <QApplication>
 
 #include "uistyle.h"
-#include "uistylesettings.h"
+#include "uisettings.h"
 #include "util.h"
 
+// FIXME remove with migration code
+#include <QSettings>
+#include "global.h"
+
 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... then again... does it hurt?
@@ -32,6 +36,24 @@ UiStyle::UiStyle(const QString &settingsKey) : _settingsKey(settingsKey) {
     Q_ASSERT(QVariant::nameToType("UiStyle::FormatList") != QVariant::Invalid);
   }
 
+  // FIXME remove migration at some point
+  // We remove old settings if we find them, since they conflict
+#ifdef Q_WS_MAC
+  QSettings mys(QCoreApplication::organizationDomain(), Global::clientApplicationName);
+#else
+  QSettings mys(QCoreApplication::organizationName(), Global::clientApplicationName);
+#endif
+  mys.beginGroup("QtUi");
+  if(mys.childGroups().contains("Colors")) {
+    qDebug() << "Removing obsolete UiStyle settings!";
+    mys.endGroup();
+    mys.remove("Ui");
+    mys.remove("QtUiStyle");
+    mys.remove("QtUiStyleNew");
+    mys.remove("QtUi/Colors");
+    mys.sync();
+  }
+
   _defaultFont = QFont("Monospace", QApplication::font().pointSize());
 
   // Default format
@@ -47,13 +69,6 @@ UiStyle::UiStyle(const QString &settingsKey) : _settingsKey(settingsKey) {
     _customFormats[type] = s.customFormat(type);
   }
 
-  // Initialize color codes according to mIRC "standard"
-  QStringList colors;
-  //colors << "white" << "black" << "navy" << "green" << "red" << "maroon" << "purple" << "orange";
-  //colors << "yellow" << "lime" << "teal" << "aqua" << "royalblue" << "fuchsia" << "grey" << "silver";
-  colors << "#ffffff" << "#000000" << "#000080" << "#008000" << "#ff0000" << "#800000" << "#800080" << "#ffa500";
-  colors << "#ffff00" << "#00ff00" << "#008080" << "#00ffff" << "#4169E1" << "#ff00ff" << "#808080" << "#c0c0c0";
-
   // Now initialize the mapping between FormatCodes and FormatTypes...
   _formatCodes["%O"] = None;
   _formatCodes["%B"] = Bold;
@@ -81,14 +96,21 @@ UiStyle::UiStyle(const QString &settingsKey) : _settingsKey(settingsKey) {
   _formatCodes["%DM"] = ModeFlags;
   _formatCodes["%DU"] = Url;
 
+  // Initialize color codes according to mIRC "standard"
+  QStringList colors;
+  //colors << "white" << "black" << "navy" << "green" << "red" << "maroon" << "purple" << "orange";
+  //colors << "yellow" << "lime" << "teal" << "aqua" << "royalblue" << "fuchsia" << "grey" << "silver";
+  colors << "#ffffff" << "#000000" << "#000080" << "#008000" << "#ff0000" << "#800000" << "#800080" << "#ffa500";
+  colors << "#ffff00" << "#00ff00" << "#008080" << "#00ffff" << "#4169E1" << "#ff00ff" << "#808080" << "#c0c0c0";
+
   // Set color formats
   for(int i = 0; i < 16; i++) {
     QString idx = QString("%1").arg(i, (int)2, (int)10, (QChar)'0');
-    _formatCodes[QString("%Dcf%1").arg(idx)] = (FormatType)(FgCol00 + i);
-    _formatCodes[QString("%Dcb%1").arg(idx)] = (FormatType)(BgCol00 + i);
+    _formatCodes[QString("%Dcf%1").arg(idx)] = (FormatType)(FgCol00 | i<<24);
+    _formatCodes[QString("%Dcb%1").arg(idx)] = (FormatType)(BgCol00 | i<<28);
     QTextCharFormat fgf, bgf;
-    fgf.setForeground(QBrush(QColor(colors[i]))); setFormat((FormatType)(FgCol00 + i), fgf, Settings::Default);
-    bgf.setBackground(QBrush(QColor(colors[i]))); setFormat((FormatType)(BgCol00 + i), bgf, Settings::Default);
+    fgf.setForeground(QBrush(QColor(colors[i]))); setFormat((FormatType)(FgCol00 | i<<24), fgf, Settings::Default);
+    bgf.setBackground(QBrush(QColor(colors[i]))); setFormat((FormatType)(BgCol00 | i<<28), bgf, Settings::Default);
   }
 
   // Set a few more standard formats
@@ -117,7 +139,7 @@ void UiStyle::setFormat(FormatType ftype, QTextCharFormat fmt, Settings::Mode mo
       _customFormats[ftype] = fmt;
       s.setCustomFormat(ftype, fmt);
     } else {
-      _customFormats[ftype] = QTextFormat().toCharFormat();
+      _customFormats.remove(ftype);
       s.removeCustomFormat(ftype);
     }
   }
@@ -193,7 +215,7 @@ UiStyle::StyledString UiStyle::styleString(const QString &s_) {
   quint32 curfmt = (quint32)None;
   int pos = 0; quint16 length = 0;
   for(;;) {
-    int pos = s.indexOf('%', pos);
+    pos = s.indexOf('%', pos);
     if(pos < 0) break;
     if(s[pos+1] == '%') { // escaped %, we just remove one and continue
       s.remove(pos, 1);
@@ -208,10 +230,13 @@ UiStyle::StyledString UiStyle::styleString(const QString &s_) {
         int color = 10 * s[pos+4].digitValue() + s[pos+5].digitValue();
         //TODO: use 99 as transparent color (re mirc color "standard")
         color &= 0x0f;
-        if(pos+3 == 'f')
+        if(s[pos+3] == 'f') {
+          curfmt &= 0xf0ffffff;
           curfmt |= (color << 24) | 0x00400000;
-        else
+        } else {
+          curfmt &= 0x0fffffff;
           curfmt |= (color << 28) | 0x00800000;
+        }
         length = 6;
       }
     } else if(s[pos+1] == 'O') { // reset formatting
@@ -242,7 +267,7 @@ UiStyle::StyledString UiStyle::styleString(const QString &s_) {
   return result;
 }
 
-QString UiStyle::mircToInternal(const QString &mirc_) {
+QString UiStyle::mircToInternal(const QString &mirc_) const {
   QString mirc = mirc_;
   mirc.replace('%', "%%");      // escape % just to be sure
   mirc.replace('\x02', "%B");
@@ -292,6 +317,7 @@ UiStyle::StyledMessage UiStyle::styleMessage(const Message &msg) {
   QString nick = nickFromMask(msg.sender());
   QString txt = mircToInternal(msg.contents());
   QString bufferName = msg.bufferInfo().bufferName();
+  bufferName.replace('%', "%%"); // well, you _can_ have a % in a buffername apparently... -_-
 
   StyledMessage result;