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 /src/quickcontrols2/qquickstyleplugin.cpp | |
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>
Diffstat (limited to 'src/quickcontrols2/qquickstyleplugin.cpp')
-rw-r--r-- | src/quickcontrols2/qquickstyleplugin.cpp | 95 |
1 files changed, 92 insertions, 3 deletions
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; } |