From aa30d9026c09e826f1f965bb4b1682debfc97df9 Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Tue, 30 May 2017 15:50:55 +0200 Subject: 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 --- src/quickcontrols2/qquicktheme.cpp | 53 +++++++++++++++++++++++++++++++++++++- src/quickcontrols2/qquicktheme_p.h | 4 +++ 2 files changed, 56 insertions(+), 1 deletion(-) (limited to 'src/quickcontrols2') 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 &settings) settings->endGroup(); return new QFont(f); } + +static void readColorGroup(const QSharedPointer &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(role), settings->value(key).value()); + } +} + +static QPalette *readPalette(const QSharedPointer &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 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 #include #include +#include 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 m_styleFont; + QScopedPointer m_stylePalette; }; QT_END_NAMESPACE -- cgit v1.2.3