diff options
author | J-P Nurmi <jpnurmi@qt.io> | 2018-02-13 22:03:31 +0100 |
---|---|---|
committer | J-P Nurmi <jpnurmi@qt.io> | 2018-02-15 08:48:44 +0000 |
commit | 544456ea001c1a2ea7917cc4923222c8dc72f41f (patch) | |
tree | e40389e506776337e9f1ecb79cadce61a9d16e1b | |
parent | 71d5afa10c297db4aabd032f992fb93fbaaf5470 (diff) |
Read :/qtquickcontrols2.conf in QQuickStylePlugin
QQuickTheme is going to be promoted from libQQC2 to libQQT2 so that it
can provide dark and light palettes (and later, icons). The first step
is to refactor out the :/qtquickcontrols2.conf reading code, which
cannot be in style-agnostic libQQT2. Read the conf file in QQuickStyle
Plugin instead. The additional benefit is that we don't need duplicate
name() methods for styles and their themes. Even though QQuickStyle
Plugin's name handling is case-insensitive, QSetting is case-sensitive.
Therefore all QQuickStylePlugin::name() overrides have been updated
to use capital first letter. This name is used to lookup the correct
section in :/qtquickcontrols2.conf.
Task-number: QTBUG-63331
Change-Id: I07b1269d9dbc2c9568e6f22f2da75951fde7b669
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
18 files changed, 182 insertions, 145 deletions
diff --git a/src/imports/controls/fusion/qquickfusiontheme.cpp b/src/imports/controls/fusion/qquickfusiontheme.cpp index 31494efb..78465b6b 100644 --- a/src/imports/controls/fusion/qquickfusiontheme.cpp +++ b/src/imports/controls/fusion/qquickfusiontheme.cpp @@ -39,7 +39,6 @@ QT_BEGIN_NAMESPACE QQuickFusionTheme::QQuickFusionTheme() - : QQuickTheme(QStringLiteral("Fusion")) { } diff --git a/src/imports/controls/fusion/qtquickcontrols2fusionstyleplugin.cpp b/src/imports/controls/fusion/qtquickcontrols2fusionstyleplugin.cpp index 9a329d03..2d1a6e28 100644 --- a/src/imports/controls/fusion/qtquickcontrols2fusionstyleplugin.cpp +++ b/src/imports/controls/fusion/qtquickcontrols2fusionstyleplugin.cpp @@ -72,7 +72,7 @@ public: void initializeEngine(QQmlEngine *engine, const char *uri) override; QString name() const override; - QQuickProxyTheme *createTheme() const override; + QQuickTheme *createTheme() const override; }; QtQuickControls2FusionStylePlugin::QtQuickControls2FusionStylePlugin(QObject *parent) : QQuickStylePlugin(parent) @@ -109,10 +109,10 @@ void QtQuickControls2FusionStylePlugin::initializeEngine(QQmlEngine *engine, con QString QtQuickControls2FusionStylePlugin::name() const { - return QStringLiteral("fusion"); + return QStringLiteral("Fusion"); } -QQuickProxyTheme *QtQuickControls2FusionStylePlugin::createTheme() const +QQuickTheme *QtQuickControls2FusionStylePlugin::createTheme() const { return new QQuickFusionTheme; } diff --git a/src/imports/controls/imagine/qquickimaginetheme.cpp b/src/imports/controls/imagine/qquickimaginetheme.cpp index 5505e7ce..f6d78cbc 100644 --- a/src/imports/controls/imagine/qquickimaginetheme.cpp +++ b/src/imports/controls/imagine/qquickimaginetheme.cpp @@ -41,11 +41,17 @@ QT_BEGIN_NAMESPACE QQuickImagineTheme::QQuickImagineTheme() - : QQuickTheme(QStringLiteral("Imagine")) +{ +} + +void QQuickImagineTheme::resolveFonts(const QFont &defaultFont) { systemFont.setFamily(QLatin1String("Open Sans")); - systemFont = resolveFont(systemFont); + systemFont = defaultFont.resolve(systemFont); +} +void QQuickImagineTheme::resolvePalettes(const QPalette &defaultPalette) +{ const QColor accentColor = QColor::fromRgb(0x4fc1e9); const QColor windowTextColor = QColor::fromRgb(0x434a54); const QColor disabledWindowTextColor = QColor::fromRgb(0xccd1d9); @@ -59,7 +65,7 @@ QQuickImagineTheme::QQuickImagineTheme() systemPalette.setColor(QPalette::WindowText, windowTextColor); systemPalette.setColor(QPalette::Disabled, QPalette::Text, disabledWindowTextColor); systemPalette.setColor(QPalette::Disabled, QPalette::WindowText, disabledWindowTextColor); - systemPalette = resolvePalette(systemPalette); + systemPalette = defaultPalette.resolve(systemPalette); } const QFont *QQuickImagineTheme::font(QPlatformTheme::Font type) const diff --git a/src/imports/controls/imagine/qquickimaginetheme_p.h b/src/imports/controls/imagine/qquickimaginetheme_p.h index ea3a1cbd..4ec9dfd7 100644 --- a/src/imports/controls/imagine/qquickimaginetheme_p.h +++ b/src/imports/controls/imagine/qquickimaginetheme_p.h @@ -60,6 +60,10 @@ public: const QFont *font(Font type = SystemFont) const override; const QPalette *palette(Palette type = SystemPalette) const override; +protected: + void resolveFonts(const QFont &defaultFont) override; + void resolvePalettes(const QPalette &defaultPalette) override; + private: QFont systemFont; QPalette systemPalette; diff --git a/src/imports/controls/imagine/qtquickcontrols2imaginestyleplugin.cpp b/src/imports/controls/imagine/qtquickcontrols2imaginestyleplugin.cpp index 7aa78075..3ab8a472 100644 --- a/src/imports/controls/imagine/qtquickcontrols2imaginestyleplugin.cpp +++ b/src/imports/controls/imagine/qtquickcontrols2imaginestyleplugin.cpp @@ -67,7 +67,7 @@ public: void initializeEngine(QQmlEngine *engine, const char *uri) override; QString name() const override; - QQuickProxyTheme *createTheme() const override; + QQuickTheme *createTheme() const override; }; QtQuickControls2ImagineStylePlugin::QtQuickControls2ImagineStylePlugin(QObject *parent) : QQuickStylePlugin(parent) @@ -96,10 +96,10 @@ void QtQuickControls2ImagineStylePlugin::initializeEngine(QQmlEngine *engine, co QString QtQuickControls2ImagineStylePlugin::name() const { - return QStringLiteral("imagine"); + return QStringLiteral("Imagine"); } -QQuickProxyTheme *QtQuickControls2ImagineStylePlugin::createTheme() const +QQuickTheme *QtQuickControls2ImagineStylePlugin::createTheme() const { return new QQuickImagineTheme; } diff --git a/src/imports/controls/material/qquickmaterialtheme.cpp b/src/imports/controls/material/qquickmaterialtheme.cpp index c697b2a5..7b21a886 100644 --- a/src/imports/controls/material/qquickmaterialtheme.cpp +++ b/src/imports/controls/material/qquickmaterialtheme.cpp @@ -43,7 +43,10 @@ QT_BEGIN_NAMESPACE QQuickMaterialTheme::QQuickMaterialTheme() - : QQuickTheme(QStringLiteral("Material")) +{ +} + +void QQuickMaterialTheme::resolveFonts(const QFont &defaultFont) { QFont font; font.setFamily(QLatin1String("Roboto")); @@ -65,29 +68,29 @@ QQuickMaterialTheme::QQuickMaterialTheme() } systemFont.setPixelSize(14); - systemFont = resolveFont(systemFont); + systemFont = defaultFont.resolve(systemFont); buttonFont.setPixelSize(14); buttonFont.setCapitalization(QFont::AllUppercase); buttonFont.setWeight(QFont::Medium); - buttonFont = resolveFont(buttonFont); + buttonFont = defaultFont.resolve(buttonFont); toolTipFont.setPixelSize(14); toolTipFont.setWeight(QFont::Medium); - toolTipFont = resolveFont(toolTipFont); + toolTipFont = defaultFont.resolve(toolTipFont); itemViewFont.setPixelSize(14); itemViewFont.setWeight(QFont::Medium); - itemViewFont = resolveFont(itemViewFont); + itemViewFont = defaultFont.resolve(itemViewFont); listViewFont.setPixelSize(16); - listViewFont = resolveFont(listViewFont); + listViewFont = defaultFont.resolve(listViewFont); menuItemFont.setPixelSize(16); - menuItemFont = resolveFont(menuItemFont); + menuItemFont = defaultFont.resolve(menuItemFont); editorFont.setPixelSize(16); - editorFont = resolveFont(editorFont); + editorFont = defaultFont.resolve(editorFont); } const QFont *QQuickMaterialTheme::font(QPlatformTheme::Font type) const diff --git a/src/imports/controls/material/qquickmaterialtheme_p.h b/src/imports/controls/material/qquickmaterialtheme_p.h index 0e791386..1c7b1413 100644 --- a/src/imports/controls/material/qquickmaterialtheme_p.h +++ b/src/imports/controls/material/qquickmaterialtheme_p.h @@ -63,6 +63,9 @@ public: QVariant themeHint(ThemeHint hint) const override; +protected: + void resolveFonts(const QFont &defaultFont) override; + private: QFont systemFont; QFont buttonFont; diff --git a/src/imports/controls/material/qtquickcontrols2materialstyleplugin.cpp b/src/imports/controls/material/qtquickcontrols2materialstyleplugin.cpp index 7eae0826..4ea1f426 100644 --- a/src/imports/controls/material/qtquickcontrols2materialstyleplugin.cpp +++ b/src/imports/controls/material/qtquickcontrols2materialstyleplugin.cpp @@ -67,7 +67,7 @@ public: void initializeEngine(QQmlEngine *engine, const char *uri) override; QString name() const override; - QQuickProxyTheme *createTheme() const override; + QQuickTheme *createTheme() const override; }; QtQuickControls2MaterialStylePlugin::QtQuickControls2MaterialStylePlugin(QObject *parent) : QQuickStylePlugin(parent) @@ -103,10 +103,10 @@ void QtQuickControls2MaterialStylePlugin::initializeEngine(QQmlEngine *engine, c QString QtQuickControls2MaterialStylePlugin::name() const { - return QStringLiteral("material"); + return QStringLiteral("Material"); } -QQuickProxyTheme *QtQuickControls2MaterialStylePlugin::createTheme() const +QQuickTheme *QtQuickControls2MaterialStylePlugin::createTheme() const { return new QQuickMaterialTheme; } diff --git a/src/imports/controls/qquickdefaulttheme.cpp b/src/imports/controls/qquickdefaulttheme.cpp index f4b6f5d7..e2936def 100644 --- a/src/imports/controls/qquickdefaulttheme.cpp +++ b/src/imports/controls/qquickdefaulttheme.cpp @@ -39,7 +39,10 @@ QT_BEGIN_NAMESPACE QQuickDefaultTheme::QQuickDefaultTheme() - : QQuickTheme(QStringLiteral("Default")) +{ +} + +void QQuickDefaultTheme::resolvePalettes(const QPalette &defaultPalette) { systemPalette.setColor(QPalette::Base, QColor::fromRgba(0xFFFFFFFF)); systemPalette.setColor(QPalette::Disabled, QPalette::Base, QColor::fromRgba(0xFFD6D6D6)); @@ -80,7 +83,7 @@ QQuickDefaultTheme::QQuickDefaultTheme() systemPalette.setColor(QPalette::WindowText, QColor::fromRgba(0xFF26282A)); systemPalette.setColor(QPalette::Disabled, QPalette::WindowText, QColor::fromRgba(0xFFBDBEBF)); - systemPalette = resolvePalette(systemPalette); + systemPalette = defaultPalette.resolve(systemPalette); } const QPalette *QQuickDefaultTheme::palette(QPlatformTheme::Palette type) const diff --git a/src/imports/controls/qquickdefaulttheme_p.h b/src/imports/controls/qquickdefaulttheme_p.h index 16e4d061..6b043e14 100644 --- a/src/imports/controls/qquickdefaulttheme_p.h +++ b/src/imports/controls/qquickdefaulttheme_p.h @@ -59,6 +59,9 @@ public: const QPalette *palette(Palette type) const override; +protected: + void resolvePalettes(const QPalette &defaultPalette) override; + private: QPalette systemPalette; }; diff --git a/src/imports/controls/qtquickcontrols2plugin.cpp b/src/imports/controls/qtquickcontrols2plugin.cpp index 464bbbdf..dba18fc8 100644 --- a/src/imports/controls/qtquickcontrols2plugin.cpp +++ b/src/imports/controls/qtquickcontrols2plugin.cpp @@ -81,7 +81,7 @@ public: void initializeEngine(QQmlEngine *engine, const char *uri) override; QString name() const override; - QQuickProxyTheme *createTheme() const override; + QQuickTheme *createTheme() const override; }; QtQuickControls2Plugin::QtQuickControls2Plugin(QObject *parent) : QQuickStylePlugin(parent) @@ -217,10 +217,10 @@ void QtQuickControls2Plugin::initializeEngine(QQmlEngine *engine, const char *ur QString QtQuickControls2Plugin::name() const { - return QStringLiteral("default"); + return QStringLiteral("Default"); } -QQuickProxyTheme *QtQuickControls2Plugin::createTheme() const +QQuickTheme *QtQuickControls2Plugin::createTheme() const { return new QQuickDefaultTheme; } diff --git a/src/imports/controls/universal/qquickuniversaltheme.cpp b/src/imports/controls/universal/qquickuniversaltheme.cpp index 549840b6..f457b614 100644 --- a/src/imports/controls/universal/qquickuniversaltheme.cpp +++ b/src/imports/controls/universal/qquickuniversaltheme.cpp @@ -42,7 +42,10 @@ QT_BEGIN_NAMESPACE QQuickUniversalTheme::QQuickUniversalTheme() - : QQuickTheme(QStringLiteral("Universal")) +{ +} + +void QQuickUniversalTheme::resolveFonts(const QFont &defaultFont) { const QFont font(QLatin1String("Segoe UI")); if (QFontInfo(font).family() == QLatin1String("Segoe UI")) { @@ -53,15 +56,15 @@ QQuickUniversalTheme::QQuickUniversalTheme() } systemFont.setPixelSize(15); - systemFont = resolveFont(systemFont); + systemFont = defaultFont.resolve(systemFont); groupBoxTitleFont.setPixelSize(15); groupBoxTitleFont.setWeight(QFont::DemiBold); - groupBoxTitleFont = resolveFont(groupBoxTitleFont); + groupBoxTitleFont = defaultFont.resolve(groupBoxTitleFont); tabButtonFont.setPixelSize(24); tabButtonFont.setWeight(QFont::Light); - tabButtonFont = resolveFont(tabButtonFont); + tabButtonFont = defaultFont.resolve(tabButtonFont); } const QFont *QQuickUniversalTheme::font(QPlatformTheme::Font type) const diff --git a/src/imports/controls/universal/qquickuniversaltheme_p.h b/src/imports/controls/universal/qquickuniversaltheme_p.h index f15dee3e..5da74470 100644 --- a/src/imports/controls/universal/qquickuniversaltheme_p.h +++ b/src/imports/controls/universal/qquickuniversaltheme_p.h @@ -60,6 +60,9 @@ public: const QFont *font(Font type = SystemFont) const override; +protected: + void resolveFonts(const QFont &defaultFont) override; + private: QFont systemFont; QFont groupBoxTitleFont; diff --git a/src/imports/controls/universal/qtquickcontrols2universalstyleplugin.cpp b/src/imports/controls/universal/qtquickcontrols2universalstyleplugin.cpp index 55255181..b9934c73 100644 --- a/src/imports/controls/universal/qtquickcontrols2universalstyleplugin.cpp +++ b/src/imports/controls/universal/qtquickcontrols2universalstyleplugin.cpp @@ -64,7 +64,7 @@ public: void initializeEngine(QQmlEngine *engine, const char *uri) override; QString name() const override; - QQuickProxyTheme *createTheme() const override; + QQuickTheme *createTheme() const override; }; QtQuickControls2UniversalStylePlugin::QtQuickControls2UniversalStylePlugin(QObject *parent) : QQuickStylePlugin(parent) @@ -96,10 +96,10 @@ void QtQuickControls2UniversalStylePlugin::initializeEngine(QQmlEngine *engine, QString QtQuickControls2UniversalStylePlugin::name() const { - return QStringLiteral("universal"); + return QStringLiteral("Universal"); } -QQuickProxyTheme *QtQuickControls2UniversalStylePlugin::createTheme() const +QQuickTheme *QtQuickControls2UniversalStylePlugin::createTheme() const { return new QQuickUniversalTheme; } diff --git a/src/quickcontrols2/qquickstyleplugin.cpp b/src/quickcontrols2/qquickstyleplugin.cpp index fa8e9785..6f9a6d13 100644 --- a/src/quickcontrols2/qquickstyleplugin.cpp +++ b/src/quickcontrols2/qquickstyleplugin.cpp @@ -35,13 +35,94 @@ ****************************************************************************/ #include "qquickstyleplugin_p.h" -#include "qquickproxytheme_p.h" +#include "qquicktheme_p.h" #include "qquickstyle.h" +#include "qquickstyle_p.h" +#include <QtCore/qmetaobject.h> +#include <QtCore/qsettings.h> #include <QtGui/private/qguiapplication_p.h> +#include <functional> + QT_BEGIN_NAMESPACE +#if QT_CONFIG(settings) +static void readValue(const QSharedPointer<QSettings> &settings, const QString &name, std::function<void(const QVariant &)> setValue) +{ + const QVariant var = settings->value(name); + if (var.isValid()) + setValue(var); +} + +template <typename Enum> +static Enum toEnumValue(const QVariant &var) +{ + // ### TODO: expose QFont enums to the meta object system using Q_ENUM + //QMetaEnum enumeration = QMetaEnum::fromType<Enum>(); + //bool ok = false; + //int value = enumeration.keyToValue(var.toByteArray(), &ok); + //if (!ok) + // value = var.toInt(); + //return static_cast<Enum>(value); + + return static_cast<Enum>(var.toInt()); +} + +static const QFont *readFont(const QSharedPointer<QSettings> &settings) +{ + const QVariant var = settings->value(QStringLiteral("Font")); + if (var.isValid()) + return new QFont(var.value<QFont>()); + + QFont f; + settings->beginGroup(QStringLiteral("Font")); + readValue(settings, QStringLiteral("Family"), [&f](const QVariant &var) { f.setFamily(var.toString()); }); + readValue(settings, QStringLiteral("PointSize"), [&f](const QVariant &var) { f.setPointSizeF(var.toReal()); }); + readValue(settings, QStringLiteral("PixelSize"), [&f](const QVariant &var) { f.setPixelSize(var.toInt()); }); + readValue(settings, QStringLiteral("StyleHint"), [&f](const QVariant &var) { f.setStyleHint(toEnumValue<QFont::StyleHint>(var.toInt())); }); + readValue(settings, QStringLiteral("Weight"), [&f](const QVariant &var) { f.setWeight(toEnumValue<QFont::Weight>(var)); }); + readValue(settings, QStringLiteral("Style"), [&f](const QVariant &var) { f.setStyle(toEnumValue<QFont::Style>(var.toInt())); }); + 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 const 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) + QQuickStylePlugin::QQuickStylePlugin(QObject *parent) : QQmlExtensionPlugin(parent) { } @@ -67,8 +148,16 @@ void QQuickStylePlugin::initializeEngine(QQmlEngine *engine, const char *uri) if (isCurrent()) { m_theme.reset(createTheme()); - if (m_theme) + if (m_theme) { +#if QT_CONFIG(settings) + QSharedPointer<QSettings> settings = QQuickStylePrivate::settings(name()); + if (settings) { + m_theme->setDefaultFont(readFont(settings)); + m_theme->setDefaultPalette(readPalette(settings)); + } +#endif QGuiApplicationPrivate::platform_theme = m_theme.data(); + } } } @@ -87,7 +176,7 @@ QString QQuickStylePlugin::name() const return QString(); } -QQuickProxyTheme *QQuickStylePlugin::createTheme() const +QQuickTheme *QQuickStylePlugin::createTheme() const { return nullptr; } diff --git a/src/quickcontrols2/qquickstyleplugin_p.h b/src/quickcontrols2/qquickstyleplugin_p.h index 9457b472..24f8e564 100644 --- a/src/quickcontrols2/qquickstyleplugin_p.h +++ b/src/quickcontrols2/qquickstyleplugin_p.h @@ -54,7 +54,7 @@ QT_BEGIN_NAMESPACE -class QQuickProxyTheme; +class QQuickTheme; class Q_QUICKCONTROLS2_PRIVATE_EXPORT QQuickStylePlugin : public QQmlExtensionPlugin { @@ -69,12 +69,12 @@ public: bool isCurrent() const; virtual QString name() const; - virtual QQuickProxyTheme *createTheme() const; + virtual QQuickTheme *createTheme() const; QUrl typeUrl(const QString &name = QString()) const; private: - QScopedPointer<QQuickProxyTheme> m_theme; + QScopedPointer<QQuickTheme> m_theme; }; QT_END_NAMESPACE diff --git a/src/quickcontrols2/qquicktheme.cpp b/src/quickcontrols2/qquicktheme.cpp index 06a66bfd..73957207 100644 --- a/src/quickcontrols2/qquicktheme.cpp +++ b/src/quickcontrols2/qquicktheme.cpp @@ -35,129 +35,47 @@ ****************************************************************************/ #include "qquicktheme_p.h" -#include "qquickstyle_p.h" - -#include <QtCore/qmetaobject.h> -#include <QtCore/qsettings.h> - -#include <functional> QT_BEGIN_NAMESPACE -#if QT_CONFIG(settings) -static void readValue(const QSharedPointer<QSettings> &settings, const QString &name, std::function<void(const QVariant &)> setValue) -{ - const QVariant var = settings->value(name); - if (var.isValid()) - setValue(var); -} - -template <typename Enum> -static Enum toEnumValue(const QVariant &var) -{ - // ### TODO: expose QFont enums to the meta object system using Q_ENUM - //QMetaEnum enumeration = QMetaEnum::fromType<Enum>(); - //bool ok = false; - //int value = enumeration.keyToValue(var.toByteArray(), &ok); - //if (!ok) - // value = var.toInt(); - //return static_cast<Enum>(value); - - return static_cast<Enum>(var.toInt()); -} - -QFont *readFont(const QSharedPointer<QSettings> &settings) -{ - const QVariant var = settings->value(QStringLiteral("Font")); - if (var.isValid()) - return new QFont(var.value<QFont>()); - - QFont f; - settings->beginGroup(QStringLiteral("Font")); - readValue(settings, QStringLiteral("Family"), [&f](const QVariant &var) { f.setFamily(var.toString()); }); - readValue(settings, QStringLiteral("PointSize"), [&f](const QVariant &var) { f.setPointSizeF(var.toReal()); }); - readValue(settings, QStringLiteral("PixelSize"), [&f](const QVariant &var) { f.setPixelSize(var.toInt()); }); - readValue(settings, QStringLiteral("StyleHint"), [&f](const QVariant &var) { f.setStyleHint(toEnumValue<QFont::StyleHint>(var.toInt())); }); - readValue(settings, QStringLiteral("Weight"), [&f](const QVariant &var) { f.setWeight(toEnumValue<QFont::Weight>(var)); }); - readValue(settings, QStringLiteral("Style"), [&f](const QVariant &var) { f.setStyle(toEnumValue<QFont::Style>(var.toInt())); }); - 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) - : QQuickProxyTheme() +QQuickTheme::QQuickTheme() { -#if QT_CONFIG(settings) - QSharedPointer<QSettings> settings = QQuickStylePrivate::settings(style); - if (settings) { - m_styleFont.reset(readFont(settings)); - m_stylePalette.reset(readPalette(settings)); - } -#endif } const QFont *QQuickTheme::font(Font type) const { Q_UNUSED(type); - return m_styleFont.data(); + return m_defaultFont.data(); } const QPalette *QQuickTheme::palette(Palette type) const { Q_UNUSED(type); - return m_stylePalette.data(); + return m_defaultPalette.data(); } -QFont QQuickTheme::resolveFont(const QFont &font) const +void QQuickTheme::setDefaultFont(const QFont *defaultFont) { - if (!m_styleFont) - return font; + m_defaultFont.reset(defaultFont); + if (defaultFont) + resolveFonts(*defaultFont); +} - return m_styleFont->resolve(font); +void QQuickTheme::setDefaultPalette(const QPalette *defaultPalette) +{ + m_defaultPalette.reset(defaultPalette); + if (defaultPalette) + resolvePalettes(*defaultPalette); } -QPalette QQuickTheme::resolvePalette(const QPalette &palette) const +void QQuickTheme::resolveFonts(const QFont &defaultFont) { - if (!m_stylePalette) - return palette; + Q_UNUSED(defaultFont) +} - return m_stylePalette->resolve(palette); +void QQuickTheme::resolvePalettes(const QPalette &defaultPalette) +{ + Q_UNUSED(defaultPalette) } QT_END_NAMESPACE diff --git a/src/quickcontrols2/qquicktheme_p.h b/src/quickcontrols2/qquicktheme_p.h index 098ac7f1..78ff17c1 100644 --- a/src/quickcontrols2/qquicktheme_p.h +++ b/src/quickcontrols2/qquicktheme_p.h @@ -58,18 +58,21 @@ QT_BEGIN_NAMESPACE class Q_QUICKCONTROLS2_PRIVATE_EXPORT QQuickTheme : public QQuickProxyTheme { public: - QQuickTheme(const QString &name); + QQuickTheme(); const QFont *font(Font type = SystemFont) const override; const QPalette *palette(Palette type = SystemPalette) const override; + void setDefaultFont(const QFont *defaultFont); + void setDefaultPalette(const QPalette *defaultPalette); + protected: - QFont resolveFont(const QFont &font) const; - QPalette resolvePalette(const QPalette &palette) const; + virtual void resolveFonts(const QFont &defaultFont); + virtual void resolvePalettes(const QPalette &defaultPalette); private: - QScopedPointer<QFont> m_styleFont; - QScopedPointer<QPalette> m_stylePalette; + QScopedPointer<const QFont> m_defaultFont; + QScopedPointer<const QPalette> m_defaultPalette; }; QT_END_NAMESPACE |