From 120861b909702039da9993278d8319dad14fd292 Mon Sep 17 00:00:00 2001 From: Manuel Nickschas Date: Thu, 30 Jul 2009 23:23:29 +0200 Subject: [PATCH] Introduce extra Palette roles for UiStyle 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 | 2 +- src/uisupport/qssparser.cpp | 52 +++++++++++++++++++++++-------------- src/uisupport/qssparser.h | 5 ++-- src/uisupport/uistyle.cpp | 4 ++- src/uisupport/uistyle.h | 22 +++++++++++++++- 5 files changed, 60 insertions(+), 25 deletions(-) diff --git a/src/qtui/chatline.cpp b/src/qtui/chatline.cpp index 12268a28..c1c98da6 100644 --- a/src/qtui/chatline.cpp +++ b/src/qtui/chatline.cpp @@ -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()); - 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); } diff --git a/src/uisupport/qssparser.cpp b/src/uisupport/qssparser.cpp index 82344040..091ac4b2 100644 --- a/src/uisupport/qssparser.cpp +++ b/src/uisupport/qssparser.cpp @@ -49,6 +49,22 @@ QssParser::QssParser() _paletteColorRoles["tooltip-text"] = QPalette::ToolTipText; _paletteColorRoles["window"] = QPalette::Window; _paletteColorRoles["window-text"] = QPalette::WindowText; + + _uiStylePalette = QVector(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) { @@ -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(); - // 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 - _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(); } - 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*"); diff --git a/src/uisupport/qssparser.h b/src/uisupport/qssparser.h index e0069550..ece58801 100644 --- a/src/uisupport/qssparser.h +++ b/src/uisupport/qssparser.h @@ -32,8 +32,8 @@ class QssParser { void processStyleSheet(QString &sheet); inline QPalette palette() const { return _palette; } + inline QVector uiStylePalette() const { return _uiStylePalette; } inline const QHash& formats() const { return _formats; } - inline QBrush markerLineBrush() const { return _markerLineBrush; } protected: typedef QList ColorTuple; @@ -60,11 +60,12 @@ class QssParser { void parseFontFamily(const QString &str, QTextCharFormat *format); QHash _paletteColorRoles; + QHash _uiStyleColorRoles; private: QPalette _palette; + QVector _uiStylePalette; QHash _formats; - QBrush _markerLineBrush; int _maxSenderHash; }; diff --git a/src/uisupport/uistyle.cpp b/src/uisupport/uistyle.cpp index 3ab08f41..ce39d2d8 100644 --- a/src/uisupport/uistyle.cpp +++ b/src/uisupport/uistyle.cpp @@ -37,6 +37,8 @@ UiStyle::UiStyle(QObject *parent) : QObject(parent) { Q_ASSERT(QVariant::nameToType("UiStyle::FormatList") != QVariant::Invalid); } + _uiStylePalette = QVector(NumRoles, QBrush()); + // 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()); - _markerLineBrush = parser.markerLineBrush(); + _uiStylePalette = parser.uiStylePalette(); QTextCharFormat baseFmt = parser.formats().value(Base); foreach(quint64 fmtType, parser.formats().keys()) { diff --git a/src/uisupport/uistyle.h b/src/uisupport/uistyle.h index 3342aa49..581c420e 100644 --- a/src/uisupport/uistyle.h +++ b/src/uisupport/uistyle.h @@ -97,6 +97,23 @@ public: 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 @@ -113,7 +130,9 @@ public: 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 toTextLayoutList(const FormatList &, int textLength, quint32 messageLabel = 0); @@ -139,6 +158,7 @@ protected: private: QFont _defaultFont; + QVector _uiStylePalette; QBrush _markerLineBrush; QHash _formatCache; QHash _metricsCache; -- 2.20.1