aboutsummaryrefslogtreecommitdiffstats
path: root/src/imports/controls/universal/qquickuniversalstyle.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/imports/controls/universal/qquickuniversalstyle.cpp')
-rw-r--r--src/imports/controls/universal/qquickuniversalstyle.cpp138
1 files changed, 95 insertions, 43 deletions
diff --git a/src/imports/controls/universal/qquickuniversalstyle.cpp b/src/imports/controls/universal/qquickuniversalstyle.cpp
index f2bfd70d..6634763c 100644
--- a/src/imports/controls/universal/qquickuniversalstyle.cpp
+++ b/src/imports/controls/universal/qquickuniversalstyle.cpp
@@ -37,13 +37,11 @@
#include "qquickuniversalstyle_p.h"
#include <QtCore/qdebug.h>
+#include <QtCore/qsettings.h>
#include <QtLabsControls/private/qquickstyle_p.h>
QT_BEGIN_NAMESPACE
-static const QQuickUniversalStyle::Theme DefaultTheme = QQuickUniversalStyle::Light;
-static const QQuickUniversalStyle::Accent DefaultAccent = QQuickUniversalStyle::Cobalt;
-
static QColor qquickuniversal_light_color(QQuickUniversalStyle::SystemColor role)
{
static const QRgb colors[] = {
@@ -106,37 +104,40 @@ static QColor qquickuniversal_dark_color(QQuickUniversalStyle::SystemColor role)
return QColor::fromRgba(colors[role]);
}
-static QColor qquickuniversal_accent_color(QQuickUniversalStyle::Accent accent)
+static QRgb qquickuniversal_accent_color(QQuickUniversalStyle::Accent accent)
{
static const QRgb colors[] = {
- 0xA4C400, // Lime
- 0x60A917, // Green
- 0x008A00, // Emerald
- 0x00ABA9, // Teal
- 0x1BA1E2, // Cyan
- 0x3E65FF, // Cobalt
- 0x6A00FF, // Indigo
- 0xAA00FF, // Violet
- 0xF472D0, // Pink
- 0xD80073, // Magenta
- 0xA20025, // Crimson
- 0xE51400, // Red
- 0xFA6800, // Orange
- 0xF0A30A, // Amber
- 0xE3C800, // Yellow
- 0x825A2C, // Brown
- 0x6D8764, // Olive
- 0x647687, // Steel
- 0x76608A, // Mauve
- 0x87794E // Taupe
+ 0xFFA4C400, // Lime
+ 0xFF60A917, // Green
+ 0xFF008A00, // Emerald
+ 0xFF00ABA9, // Teal
+ 0xFF1BA1E2, // Cyan
+ 0xFF3E65FF, // Cobalt
+ 0xFF6A00FF, // Indigo
+ 0xFFAA00FF, // Violet
+ 0xFFF472D0, // Pink
+ 0xFFD80073, // Magenta
+ 0xFFA20025, // Crimson
+ 0xFFE51400, // Red
+ 0xFFFA6800, // Orange
+ 0xFFF0A30A, // Amber
+ 0xFFE3C800, // Yellow
+ 0xFF825A2C, // Brown
+ 0xFF6D8764, // Olive
+ 0xFF647687, // Steel
+ 0xFF76608A, // Mauve
+ 0xFF87794E // Taupe
};
return colors[accent];
}
+static QQuickUniversalStyle::Theme DefaultTheme = QQuickUniversalStyle::Light;
+static QRgb DefaultAccent = qquickuniversal_accent_color(QQuickUniversalStyle::Cobalt);
+
QQuickUniversalStyle::QQuickUniversalStyle(QObject *parent) : QQuickStyle(parent),
m_hasTheme(false), m_hasAccent(false), m_theme(DefaultTheme), m_accent(DefaultAccent)
{
- init(); // TODO: lazy init?
+ init();
}
QQuickUniversalStyle *QQuickUniversalStyle::qmlAttachedProperties(QObject *object)
@@ -188,17 +189,35 @@ void QQuickUniversalStyle::resetTheme()
}
}
-QQuickUniversalStyle::Accent QQuickUniversalStyle::accent() const
-{
- return m_accent;
-}
-
-void QQuickUniversalStyle::setAccent(Accent accent)
-{
- if (accent < Lime || accent > Taupe) {
- qWarning() << "QQuickUniversalStyle: unknown accent" << accent;
- return;
+QVariant QQuickUniversalStyle::accent() const
+{
+ return QColor::fromRgba(m_accent);
+}
+
+void QQuickUniversalStyle::setAccent(const QVariant &var)
+{
+ QRgb accent = 0;
+ if (var.type() == QVariant::Int) {
+ int val = var.toInt();
+ if (val < Lime || val > Taupe) {
+ qWarning() << "QQuickUniversalStyle: unknown accent" << val;
+ return;
+ }
+ accent = qquickuniversal_accent_color(static_cast<Accent>(val));
+ } else {
+ int val = QMetaEnum::fromType<Accent>().keyToValue(var.toByteArray());
+ if (val != -1) {
+ accent = qquickuniversal_accent_color(static_cast<Accent>(val));
+ } else {
+ QColor color(var.toString());
+ if (!color.isValid()) {
+ qWarning() << "QQuickUniversalStyle: unknown accent" << var.toString();
+ return;
+ }
+ accent = color.rgba();
+ }
}
+
m_hasAccent = true;
if (m_accent != accent) {
m_accent = accent;
@@ -207,7 +226,7 @@ void QQuickUniversalStyle::setAccent(Accent accent)
}
}
-void QQuickUniversalStyle::inheritAccent(Accent accent)
+void QQuickUniversalStyle::inheritAccent(QRgb accent)
{
if (!m_hasAccent && m_accent != accent) {
m_accent = accent;
@@ -230,15 +249,10 @@ void QQuickUniversalStyle::resetAccent()
if (m_hasAccent) {
m_hasAccent = false;
QQuickUniversalStyle *universal = qobject_cast<QQuickUniversalStyle *>(parentStyle());
- inheritAccent(universal ? universal->accent() : DefaultAccent);
+ inheritAccent(universal ? universal->m_accent : DefaultAccent);
}
}
-QColor QQuickUniversalStyle::accentColor() const
-{
- return qquickuniversal_accent_color(m_accent);
-}
-
QColor QQuickUniversalStyle::altHighColor() const
{
return getColor(AltHigh);
@@ -370,8 +384,46 @@ void QQuickUniversalStyle::parentStyleChange(QQuickStyle *newParent, QQuickStyle
QQuickUniversalStyle *universal = qobject_cast<QQuickUniversalStyle *>(newParent);
if (universal) {
inheritTheme(universal->theme());
- inheritAccent(universal->accent());
+ inheritAccent(universal->m_accent);
+ }
+}
+
+template <typename Enum>
+static Enum readEnumValue(QSettings *settings, const QString &name, bool *ok)
+{
+ int value = -1;
+ *ok = settings->contains(name);
+ if (*ok) {
+ QMetaEnum enumeration = QMetaEnum::fromType<Enum>();
+ value = enumeration.keyToValue(settings->value(name).toByteArray(), ok);
}
+ return static_cast<Enum>(value);
+}
+
+void QQuickUniversalStyle::init()
+{
+ static bool defaultsInitialized = false;
+ if (!defaultsInitialized) {
+ QSharedPointer<QSettings> settings = QQuickStyle::settings(QStringLiteral("Universal"));
+ if (!settings.isNull()) {
+ bool ok = false;
+ Theme theme = readEnumValue<Theme>(settings.data(), QStringLiteral("Theme"), &ok);
+ if (ok)
+ DefaultTheme = m_theme = theme;
+
+ Accent accent = readEnumValue<Accent>(settings.data(), QStringLiteral("Accent"), &ok);
+ if (ok) {
+ DefaultAccent = m_accent = qquickuniversal_accent_color(accent);
+ } else {
+ QColor color(settings->value(QStringLiteral("Accent")).toString());
+ if (color.isValid())
+ DefaultAccent = m_accent = color.rgba();
+ }
+ }
+ defaultsInitialized = true;
+ }
+
+ QQuickStyle::init(); // TODO: lazy init?
}
QT_END_NAMESPACE