Fixed rendering for CTCP ACTION, closing BR #27.
[quassel.git] / gui / style.cpp
index 8837872..5488986 100644 (file)
@@ -40,7 +40,8 @@ void Style::init() {
   colors["15"] = QColor("silver");
 
   QTextCharFormat def;
-  //def.setFont(QFont("Lucida Mono"));
+  def.setForeground(QBrush("black"));
+  def.setFont(QFont("Verdana",9));
   formats["default"] = def;
 
   // %B - 0x02 - bold
@@ -49,7 +50,7 @@ void Style::init() {
   formats["%B"] = bold;
 
   // %O - 0x0f - plain
-  formats["%O"] = QTextCharFormat();
+  formats["%O"] = def;
 
   // %R - 0x12 - reverse
   // -- - 0x16 - reverse
@@ -97,15 +98,15 @@ void Style::init() {
   formats["%Dj"] = join;
   // %Dp - part
   QTextCharFormat part;
-  part.setForeground(QBrush("firebrick"));
+  part.setForeground(QBrush("indianred"));
   formats["%Dp"] = part;
   // %Dq - quit
   QTextCharFormat quit;
-  quit.setForeground(QBrush("firebrick"));
+  quit.setForeground(QBrush("indianred"));
   formats["%Dq"] = quit;
   // %Dk - kick
   QTextCharFormat kick;
-  kick.setForeground(QBrush("firebrick"));
+  kick.setForeground(QBrush("indianred"));
   formats["%Dk"] = kick;
   // %Dr - nick rename
   QTextCharFormat nren;
@@ -115,6 +116,11 @@ void Style::init() {
   QTextCharFormat mode;
   mode.setForeground(QBrush("steelblue"));
   formats["%Dm"] = mode;
+  // %Da - ctcp action
+  QTextCharFormat action;
+  action.setFontItalic(true);
+  action.setForeground(QBrush("darkmagenta"));
+  formats["%Da"] = action;
 
   // %DT - timestamp
   QTextCharFormat ts;
@@ -143,7 +149,11 @@ void Style::init() {
   QTextCharFormat flags;
   flags.setFontWeight(QFont::Bold);
   formats["%DM"] = flags;
-
+  // %DU - clickable URL
+  QTextCharFormat url;
+  url.setFontUnderline(true);
+  url.setAnchor(true);
+  formats["%DU"] = url;
 }
 
 QString Style::mircToInternal(QString mirc) {
@@ -162,10 +172,10 @@ QString Style::mircToInternal(QString mirc) {
  *  describing the formats of the string.
  * \param s string in internal format (% style format codes)
  */ 
-Style::StringFormats Style::internalToFormatted(QString s) {
+Style::FormattedString Style::internalToFormatted(QString s) {
   QHash<QString, int> toggles;
   QString p;
-  StringFormats sf;
+  FormattedString sf;
   QTextLayout::FormatRange rng;
   rng.format = formats["default"]; rng.start = 0; rng.length = -1; sf.formats.append(rng);
   toggles["default"] = sf.formats.count() - 1;
@@ -216,6 +226,7 @@ Style::StringFormats Style::internalToFormatted(QString s) {
       }
     } else if(s[i] == 'O') {
       foreach(QString key, toggles.keys()) {
+        if(key == "default") continue;
         sf.formats[toggles[key]].length = j - sf.formats[toggles[key]].start;
         toggles.remove(key);
       }
@@ -231,6 +242,16 @@ Style::StringFormats Style::internalToFormatted(QString s) {
         if(s[i] == 'D') i++;
         if(toggles.contains(key)) {
           sf.formats[toggles[key]].length = j - sf.formats[toggles[key]].start;
+          if(key == "%DU") {
+            // URL handling
+            // FIXME check for and handle format codes within URLs
+            QString u = s.mid(i - sf.formats[toggles[key]].length - 2, sf.formats[toggles[key]].length);
+            UrlInfo url;
+            url.start = sf.formats[toggles[key]].start;
+            url.end   = j;
+            url.url = QUrl(u);
+            sf.urls.append(url);
+          }
           toggles.remove(key);
         } else {
           QTextLayout::FormatRange range;