Introduce extra Palette roles for UiStyle
authorManuel Nickschas <sputnick@quassel-irc.org>
Thu, 30 Jul 2009 21:23:29 +0000 (23:23 +0200)
committerManuel Nickschas <sputnick@quassel-irc.org>
Thu, 6 Aug 2009 18:25:58 +0000 (20:25 +0200)
In particular BufferView and NickView use several colors that can't be expressed properly
by QPalette roles. We thus introduce various UiStyle::ColorRoles which can be used by the UI and
defined via stylesheets (as usual, in Palette {} blocks).

src/qtui/chatline.cpp
src/uisupport/qssparser.cpp
src/uisupport/qssparser.h
src/uisupport/uistyle.cpp
src/uisupport/uistyle.h

index 12268a2..c1c98da 100644 (file)
@@ -187,7 +187,7 @@ void ChatLine::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
       MsgId lastSeenMsgId = Client::networkModel()->lastSeenMarkerMsgId(bufferId);
       if(lastSeenMsgId < myMsgId && lastSeenMsgId >= prevMsgId) {
         QLinearGradient gradient(0, 0, 0, contentsItem().fontMetrics()->lineSpacing());
       MsgId lastSeenMsgId = Client::networkModel()->lastSeenMarkerMsgId(bufferId);
       if(lastSeenMsgId < myMsgId && lastSeenMsgId >= prevMsgId) {
         QLinearGradient gradient(0, 0, 0, contentsItem().fontMetrics()->lineSpacing());
-        gradient.setColorAt(0, QtUi::style()->markerLineBrush().color()); // FIXME: Use full (gradient?) brush instead of just the color
+        gradient.setColorAt(0, QtUi::style()->brush(UiStyle::MarkerLine).color()); // FIXME: Use full (gradient?) brush instead of just the color
         gradient.setColorAt(0.1, Qt::transparent);
         painter->fillRect(boundingRect(), gradient);
       }
         gradient.setColorAt(0.1, Qt::transparent);
         painter->fillRect(boundingRect(), gradient);
       }
index 8234404..091ac4b 100644 (file)
@@ -49,6 +49,22 @@ QssParser::QssParser()
   _paletteColorRoles["tooltip-text"] = QPalette::ToolTipText;
   _paletteColorRoles["window"] = QPalette::Window;
   _paletteColorRoles["window-text"] = QPalette::WindowText;
   _paletteColorRoles["tooltip-text"] = QPalette::ToolTipText;
   _paletteColorRoles["window"] = QPalette::Window;
   _paletteColorRoles["window-text"] = QPalette::WindowText;
+
+  _uiStylePalette = QVector<QBrush>(UiStyle::NumRoles, QBrush());
+
+  _uiStyleColorRoles["marker-line"] = UiStyle::MarkerLine;
+  _uiStyleColorRoles["active-nick"] = UiStyle::ActiveNick;
+  _uiStyleColorRoles["inactive-nick"] = UiStyle::InactiveNick;
+  _uiStyleColorRoles["channel"] = UiStyle::Channel;
+  _uiStyleColorRoles["inactive-channel"] = UiStyle::InactiveChannel;
+  _uiStyleColorRoles["active-channel"] = UiStyle::ActiveChannel;
+  _uiStyleColorRoles["unread-channel"] = UiStyle::UnreadChannel;
+  _uiStyleColorRoles["highlighted-channel"] = UiStyle::HighlightedChannel;
+  _uiStyleColorRoles["query"] = UiStyle::Query;
+  _uiStyleColorRoles["inactive-query"] = UiStyle::InactiveQuery;
+  _uiStyleColorRoles["active-query"] = UiStyle::ActiveQuery;
+  _uiStyleColorRoles["unread-query"] = UiStyle::UnreadQuery;
+  _uiStyleColorRoles["highlighted-query"] = UiStyle::HighlightedQuery;
 }
 
 void QssParser::processStyleSheet(QString &ss) {
 }
 
 void QssParser::processStyleSheet(QString &ss) {
@@ -303,22 +319,17 @@ void QssParser::parsePaletteData(const QString &decl, const QString &contents) {
     QString rolestr = line.left(idx).trimmed();
     QString brushstr = line.mid(idx + 1).trimmed();
 
     QString rolestr = line.left(idx).trimmed();
     QString brushstr = line.mid(idx + 1).trimmed();
 
-    // We treat the marker line color as a palette role even though it isn't -> special casing
-    if(rolestr == "marker-line") {
-      _markerLineBrush = parseBrush(brushstr);
-      continue;
-    }
-
-    if(!_paletteColorRoles.contains(rolestr)) {
-      qWarning() << Q_FUNC_INFO << tr("Unknown palette role name: %1").arg(rolestr);
-      continue;
-    }
-    QBrush brush = parseBrush(brushstr);
-    if(colorGroups.count()) {
-      foreach(QPalette::ColorGroup group, colorGroups)
-        _palette.setBrush(group, _paletteColorRoles.value(rolestr), brush);
+    if(_paletteColorRoles.contains(rolestr)) {
+      QBrush brush = parseBrush(brushstr);
+      if(colorGroups.count()) {
+        foreach(QPalette::ColorGroup group, colorGroups)
+          _palette.setBrush(group, _paletteColorRoles.value(rolestr), brush);
+      } else
+        _palette.setBrush(_paletteColorRoles.value(rolestr), brush);
+    } else if(_uiStyleColorRoles.contains(rolestr)) {
+      _uiStylePalette[_uiStyleColorRoles.value(rolestr)] = parseBrush(brushstr);
     } else
     } else
-      _palette.setBrush(_paletteColorRoles.value(rolestr), brush);
+      qWarning() << Q_FUNC_INFO << tr("Unknown palette role name: %1").arg(rolestr);
   }
 }
 
   }
 }
 
@@ -338,11 +349,12 @@ QBrush QssParser::parseBrush(const QString &str, bool *ok) {
       qWarning() << Q_FUNC_INFO << tr("Invalid palette color role specification: %1").arg(str);
       return QBrush();
     }
       qWarning() << Q_FUNC_INFO << tr("Invalid palette color role specification: %1").arg(str);
       return QBrush();
     }
-    if(!_paletteColorRoles.contains(rx.cap(1))) {
-      qWarning() << Q_FUNC_INFO << tr("Unknown palette color role: %1").arg(rx.cap(1));
-      return QBrush();
-    }
-    return QBrush(_palette.brush(_paletteColorRoles.value(rx.cap(1))));
+    if(_paletteColorRoles.contains(rx.cap(1)))
+      return QBrush(_palette.brush(_paletteColorRoles.value(rx.cap(1))));
+    if(_uiStyleColorRoles.contains(rx.cap(1)))
+      return QBrush(_uiStylePalette.at(_uiStyleColorRoles.value(rx.cap(1))));
+    qWarning() << Q_FUNC_INFO << tr("Unknown palette color role: %1").arg(rx.cap(1));
+    return QBrush();
 
   } else if(str.startsWith("qlineargradient")) {
     static QString rxFloat("\\s*(-?\\s*[0-9]*\\.?[0-9]+)\\s*");
 
   } else if(str.startsWith("qlineargradient")) {
     static QString rxFloat("\\s*(-?\\s*[0-9]*\\.?[0-9]+)\\s*");
index e006955..ece5880 100644 (file)
@@ -32,8 +32,8 @@ class QssParser {
     void processStyleSheet(QString &sheet);
 
     inline QPalette palette() const { return _palette; }
     void processStyleSheet(QString &sheet);
 
     inline QPalette palette() const { return _palette; }
+    inline QVector<QBrush> uiStylePalette() const { return _uiStylePalette; }
     inline const QHash<quint64, QTextCharFormat>& formats() const { return _formats; }
     inline const QHash<quint64, QTextCharFormat>& formats() const { return _formats; }
-    inline QBrush markerLineBrush() const { return _markerLineBrush; }
 
   protected:
     typedef QList<qreal> ColorTuple;
 
   protected:
     typedef QList<qreal> ColorTuple;
@@ -60,11 +60,12 @@ class QssParser {
     void parseFontFamily(const QString &str, QTextCharFormat *format);
 
     QHash<QString, QPalette::ColorRole> _paletteColorRoles;
     void parseFontFamily(const QString &str, QTextCharFormat *format);
 
     QHash<QString, QPalette::ColorRole> _paletteColorRoles;
+    QHash<QString, UiStyle::ColorRole> _uiStyleColorRoles;
 
   private:
     QPalette _palette;
 
   private:
     QPalette _palette;
+    QVector<QBrush> _uiStylePalette;
     QHash<quint64, QTextCharFormat> _formats;
     QHash<quint64, QTextCharFormat> _formats;
-    QBrush _markerLineBrush;
     int _maxSenderHash;
 };
 
     int _maxSenderHash;
 };
 
index 3ab08f4..ce39d2d 100644 (file)
@@ -37,6 +37,8 @@ UiStyle::UiStyle(QObject *parent) : QObject(parent) {
     Q_ASSERT(QVariant::nameToType("UiStyle::FormatList") != QVariant::Invalid);
   }
 
     Q_ASSERT(QVariant::nameToType("UiStyle::FormatList") != QVariant::Invalid);
   }
 
+  _uiStylePalette = QVector<QBrush>(NumRoles, QBrush());
+
   // Now initialize the mapping between FormatCodes and FormatTypes...
   _formatCodes["%O"] = Base;
   _formatCodes["%B"] = Bold;
   // Now initialize the mapping between FormatCodes and FormatTypes...
   _formatCodes["%O"] = Base;
   _formatCodes["%B"] = Bold;
@@ -81,7 +83,7 @@ void UiStyle::loadStyleSheet() {
     QssParser parser;
     parser.processStyleSheet(styleSheet);
     QApplication::setPalette(parser.palette());
     QssParser parser;
     parser.processStyleSheet(styleSheet);
     QApplication::setPalette(parser.palette());
-    _markerLineBrush = parser.markerLineBrush();
+    _uiStylePalette = parser.uiStylePalette();
 
     QTextCharFormat baseFmt = parser.formats().value(Base);
     foreach(quint64 fmtType, parser.formats().keys()) {
 
     QTextCharFormat baseFmt = parser.formats().value(Base);
     foreach(quint64 fmtType, parser.formats().keys()) {
index 3342aa4..581c420 100644 (file)
@@ -97,6 +97,23 @@ public:
     Selected        = 0x00000004  // must be last!
   };
 
     Selected        = 0x00000004  // must be last!
   };
 
+  enum ColorRole {
+    MarkerLine,
+    ActiveNick,
+    InactiveNick,
+    Channel,
+    InactiveChannel,
+    ActiveChannel,
+    UnreadChannel,
+    HighlightedChannel,
+    Query,
+    InactiveQuery,
+    ActiveQuery,
+    UnreadQuery,
+    HighlightedQuery,
+    NumRoles  // must be last!
+  };
+
   struct StyledString {
     QString plainText;
     FormatList formatList;  // starting pos, ftypes
   struct StyledString {
     QString plainText;
     FormatList formatList;  // starting pos, ftypes
@@ -113,7 +130,9 @@ public:
   QFontMetricsF *fontMetrics(quint32 formatType, quint32 messageLabel = 0);
 
   inline QFont defaultFont() const { return _defaultFont; }
   QFontMetricsF *fontMetrics(quint32 formatType, quint32 messageLabel = 0);
 
   inline QFont defaultFont() const { return _defaultFont; }
-  inline QBrush markerLineBrush() const { return _markerLineBrush; }
+
+  inline const QBrush &brush(ColorRole role) const { return _uiStylePalette.at((int) role); }
+  inline void setBrush(ColorRole role, const QBrush &brush) { _uiStylePalette[(int) role] = brush; }
 
   QList<QTextLayout::FormatRange> toTextLayoutList(const FormatList &, int textLength, quint32 messageLabel = 0);
 
 
   QList<QTextLayout::FormatRange> toTextLayoutList(const FormatList &, int textLength, quint32 messageLabel = 0);
 
@@ -139,6 +158,7 @@ protected:
 
 private:
   QFont _defaultFont;
 
 private:
   QFont _defaultFont;
+  QVector<QBrush> _uiStylePalette;
   QBrush _markerLineBrush;
   QHash<quint64, QTextCharFormat> _formatCache;
   QHash<quint64, QFontMetricsF *> _metricsCache;
   QBrush _markerLineBrush;
   QHash<quint64, QTextCharFormat> _formatCache;
   QHash<quint64, QFontMetricsF *> _metricsCache;