diff options
author | J-P Nurmi <jpnurmi@qt.io> | 2017-05-30 15:50:55 +0200 |
---|---|---|
committer | J-P Nurmi <jpnurmi@qt.io> | 2017-06-02 08:49:51 +0000 |
commit | aa30d9026c09e826f1f965bb4b1682debfc97df9 (patch) | |
tree | 6cd030a19e66c2e606f1fd83a23c066e8ede34dd /src/quickcontrols2 | |
parent | 1af7f8a597138d57e4ea932572f0dd5c0832bcf0 (diff) |
Add support for configurable palettes
A style's default palette is specified in qtquickcontrols2.conf in
a "Palette" group under the style's section. QSettings supports the
following two alternative syntaxes:
[Fusion]
Palette\Window=#dedede
Palette\WindowText=#212121
or
[Fusion\Palette]
Window=#dedede
WindowText=#212121
Change-Id: I01bf44d9e332064e955e95f619de634fcb79f010
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
Diffstat (limited to 'src/quickcontrols2')
-rw-r--r-- | src/quickcontrols2/qquicktheme.cpp | 53 | ||||
-rw-r--r-- | src/quickcontrols2/qquicktheme_p.h | 4 |
2 files changed, 56 insertions, 1 deletions
diff --git a/src/quickcontrols2/qquicktheme.cpp b/src/quickcontrols2/qquicktheme.cpp index 54653e6b..06a66bfd 100644 --- a/src/quickcontrols2/qquicktheme.cpp +++ b/src/quickcontrols2/qquicktheme.cpp @@ -83,6 +83,41 @@ QFont *readFont(const QSharedPointer<QSettings> &settings) settings->endGroup(); return new QFont(f); } + +static void readColorGroup(const QSharedPointer<QSettings> &settings, QPalette::ColorGroup group, QPalette *palette) +{ + const QStringList keys = settings->childKeys(); + if (keys.isEmpty()) + return; + + static const int index = QPalette::staticMetaObject.indexOfEnumerator("ColorRole"); + Q_ASSERT(index != -1); + QMetaEnum metaEnum = QPalette::staticMetaObject.enumerator(index); + + for (const QString &key : keys) { + bool ok = false; + int role = metaEnum.keyToValue(key.toUtf8(), &ok); + if (ok) + palette->setColor(group, static_cast<QPalette::ColorRole>(role), settings->value(key).value<QColor>()); + } +} + +static QPalette *readPalette(const QSharedPointer<QSettings> &settings) +{ + QPalette p; + settings->beginGroup(QStringLiteral("Palette")); + readColorGroup(settings, QPalette::All, &p); + + settings->beginGroup(QStringLiteral("Normal")); + readColorGroup(settings, QPalette::Normal, &p); + settings->endGroup(); + + settings->beginGroup(QStringLiteral("Disabled")); + readColorGroup(settings, QPalette::Disabled, &p); + settings->endGroup(); + return new QPalette(p); +} + #endif // QT_CONFIG(settings) QQuickTheme::QQuickTheme(const QString &style) @@ -90,8 +125,10 @@ QQuickTheme::QQuickTheme(const QString &style) { #if QT_CONFIG(settings) QSharedPointer<QSettings> settings = QQuickStylePrivate::settings(style); - if (settings) + if (settings) { m_styleFont.reset(readFont(settings)); + m_stylePalette.reset(readPalette(settings)); + } #endif } @@ -101,6 +138,12 @@ const QFont *QQuickTheme::font(Font type) const return m_styleFont.data(); } +const QPalette *QQuickTheme::palette(Palette type) const +{ + Q_UNUSED(type); + return m_stylePalette.data(); +} + QFont QQuickTheme::resolveFont(const QFont &font) const { if (!m_styleFont) @@ -109,4 +152,12 @@ QFont QQuickTheme::resolveFont(const QFont &font) const return m_styleFont->resolve(font); } +QPalette QQuickTheme::resolvePalette(const QPalette &palette) const +{ + if (!m_stylePalette) + return palette; + + return m_stylePalette->resolve(palette); +} + QT_END_NAMESPACE diff --git a/src/quickcontrols2/qquicktheme_p.h b/src/quickcontrols2/qquicktheme_p.h index 7ddd1d1d..098ac7f1 100644 --- a/src/quickcontrols2/qquicktheme_p.h +++ b/src/quickcontrols2/qquicktheme_p.h @@ -51,6 +51,7 @@ #include <QtQuickControls2/private/qquickproxytheme_p.h> #include <QtCore/qscopedpointer.h> #include <QtGui/qfont.h> +#include <QtGui/qpalette.h> QT_BEGIN_NAMESPACE @@ -60,12 +61,15 @@ public: QQuickTheme(const QString &name); const QFont *font(Font type = SystemFont) const override; + const QPalette *palette(Palette type = SystemPalette) const override; protected: QFont resolveFont(const QFont &font) const; + QPalette resolvePalette(const QPalette &palette) const; private: QScopedPointer<QFont> m_styleFont; + QScopedPointer<QPalette> m_stylePalette; }; QT_END_NAMESPACE |