aboutsummaryrefslogtreecommitdiffstats
path: root/src/imports/controls
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@theqtcompany.com>2016-04-16 18:37:09 +0200
committerJ-P Nurmi <jpnurmi@qt.io>2016-04-18 14:11:31 +0000
commitb9c3f6b95e116354acc3f70c0811f4d2f4c68afe (patch)
tree3331ce65de4436f0f4ff98a7ae514efc18bc17eb /src/imports/controls
parent392d520ade77e6fb941e54fdaa8b23d34c745a8b (diff)
Universal: add foreground and background attached properties
Same as b51e520f for Material. This has been a common request on the mailing lists and forums. Users want to customize the text color of various controls without having to replace whole delegates. This change makes it possible to specify both foreground (eg. Button text) and background (eg. ApplicationWindow, Page and Pane background) colors so that they propagate to children in the same way than accent and theme do. Change-Id: I55084c58f0c62e8088b270ed98437241e382ca15 Reviewed-by: Mitch Curtis <mitch.curtis@theqtcompany.com>
Diffstat (limited to 'src/imports/controls')
-rw-r--r--src/imports/controls/doc/images/qtquickcontrols2-universal-attributes.pngbin0 -> 6181 bytes
-rw-r--r--src/imports/controls/doc/src/qtquickcontrols2-universal.qdoc28
-rw-r--r--src/imports/controls/universal/ApplicationWindow.qml2
-rw-r--r--src/imports/controls/universal/Button.qml3
-rw-r--r--src/imports/controls/universal/CheckBox.qml3
-rw-r--r--src/imports/controls/universal/CheckDelegate.qml3
-rw-r--r--src/imports/controls/universal/ComboBox.qml4
-rw-r--r--src/imports/controls/universal/GroupBox.qml4
-rw-r--r--src/imports/controls/universal/ItemDelegate.qml3
-rw-r--r--src/imports/controls/universal/Label.qml3
-rw-r--r--src/imports/controls/universal/Page.qml2
-rw-r--r--src/imports/controls/universal/Pane.qml2
-rw-r--r--src/imports/controls/universal/RadioButton.qml3
-rw-r--r--src/imports/controls/universal/RadioDelegate.qml3
-rw-r--r--src/imports/controls/universal/SpinBox.qml4
-rw-r--r--src/imports/controls/universal/SwipeDelegate.qml3
-rw-r--r--src/imports/controls/universal/Switch.qml3
-rw-r--r--src/imports/controls/universal/SwitchDelegate.qml3
-rw-r--r--src/imports/controls/universal/TabBar.qml2
-rw-r--r--src/imports/controls/universal/TabButton.qml4
-rw-r--r--src/imports/controls/universal/TextArea.qml4
-rw-r--r--src/imports/controls/universal/TextField.qml4
-rw-r--r--src/imports/controls/universal/ToolButton.qml4
-rw-r--r--src/imports/controls/universal/ToolTip.qml3
-rw-r--r--src/imports/controls/universal/Tumbler.qml4
-rw-r--r--src/imports/controls/universal/qquickuniversalstyle.cpp142
-rw-r--r--src/imports/controls/universal/qquickuniversalstyle_p.h22
27 files changed, 234 insertions, 31 deletions
diff --git a/src/imports/controls/doc/images/qtquickcontrols2-universal-attributes.png b/src/imports/controls/doc/images/qtquickcontrols2-universal-attributes.png
new file mode 100644
index 00000000..96e9abeb
--- /dev/null
+++ b/src/imports/controls/doc/images/qtquickcontrols2-universal-attributes.png
Binary files differ
diff --git a/src/imports/controls/doc/src/qtquickcontrols2-universal.qdoc b/src/imports/controls/doc/src/qtquickcontrols2-universal.qdoc
index a1caceb8..00173694 100644
--- a/src/imports/controls/doc/src/qtquickcontrols2-universal.qdoc
+++ b/src/imports/controls/doc/src/qtquickcontrols2-universal.qdoc
@@ -38,6 +38,8 @@
\list
\li \l {accent-attached-prop}{\b accent} : color
+ \li \l {background-attached-prop}{\b background} : color
+ \li \l {foreground-attached-prop}{\b foreground} : color
\li \l {theme-attached-prop}{\b theme} : enumeration
\endlist
@@ -60,9 +62,13 @@
\section2 Customization
- The Universal style allows customizing two attributes, \l {theme-attached-prop}{theme}
- and \l {accent-attached-prop}{accent}. The following example illustrates how to create
- a red \e stop button with light text:
+ The Universal style allows customizing four attributes, \l {theme-attached-prop}{theme},
+ \l {accent-attached-prop}{accent}, \l {foreground-attached-prop}{foreground}, and
+ \l {background-attached-prop}{background}.
+
+ \image qtquickcontrols2-universal-attributes.png
+
+ The following example illustrates how to create a red \e stop button with light text:
\table
\row
@@ -188,6 +194,22 @@
\endstyleproperty
+ \styleproperty {Universal.background} {color} {background-attached-prop}
+ \target background-attached-prop
+ This attached property holds the background color of the theme. The property
+ can be attached to any window or item. The value is propagated to children.
+
+ The default value is theme-specific (light or dark).
+
+ \endstyleproperty
+
+ \styleproperty {Universal.foreground} {color} {foreground-attached-prop}
+ \target foreground-attached-prop
+ This attached property holds the foreground color of the theme. The property
+ can be attached to any window or item. The value is propagated to children.
+
+ The default value is theme-specific (light or dark).
+
\styleproperty {Universal.theme} {enumeration} {theme-attached-prop}
\target theme-attached-prop
This attached property holds whether the theme is light or dark. The property
diff --git a/src/imports/controls/universal/ApplicationWindow.qml b/src/imports/controls/universal/ApplicationWindow.qml
index 80c75091..1f56bd8a 100644
--- a/src/imports/controls/universal/ApplicationWindow.qml
+++ b/src/imports/controls/universal/ApplicationWindow.qml
@@ -42,7 +42,7 @@ import Qt.labs.controls.universal.impl 1.0
T.ApplicationWindow {
id: window
- color: Universal.altHighColor
+ color: Universal.background
overlay.background: Rectangle {
color: window.Universal.baseLowColor
diff --git a/src/imports/controls/universal/Button.qml b/src/imports/controls/universal/Button.qml
index d0dbcf99..0741812d 100644
--- a/src/imports/controls/universal/Button.qml
+++ b/src/imports/controls/universal/Button.qml
@@ -62,7 +62,8 @@ T.Button {
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
- color: !control.enabled ? control.Universal.baseLowColor : control.Universal.baseHighColor
+ opacity: enabled ? 1.0 : 0.2
+ color: control.Universal.foreground
}
//! [contentItem]
diff --git a/src/imports/controls/universal/CheckBox.qml b/src/imports/controls/universal/CheckBox.qml
index 78d45151..fbfb40b7 100644
--- a/src/imports/controls/universal/CheckBox.qml
+++ b/src/imports/controls/universal/CheckBox.qml
@@ -74,7 +74,8 @@ T.CheckBox {
horizontalAlignment: Text.AlignLeft
verticalAlignment: Text.AlignVCenter
- color: !control.enabled ? control.Universal.baseLowColor : control.Universal.baseHighColor
+ opacity: enabled ? 1.0 : 0.2
+ color: control.Universal.foreground
}
//! [contentItem]
}
diff --git a/src/imports/controls/universal/CheckDelegate.qml b/src/imports/controls/universal/CheckDelegate.qml
index 91f57b24..13cc0d90 100644
--- a/src/imports/controls/universal/CheckDelegate.qml
+++ b/src/imports/controls/universal/CheckDelegate.qml
@@ -75,7 +75,8 @@ T.CheckDelegate {
horizontalAlignment: Text.AlignLeft
verticalAlignment: Text.AlignVCenter
- color: !control.enabled ? control.Universal.baseLowColor : control.Universal.baseHighColor
+ opacity: enabled ? 1.0 : 0.2
+ color: control.Universal.foreground
}
//! [contentItem]
diff --git a/src/imports/controls/universal/ComboBox.qml b/src/imports/controls/universal/ComboBox.qml
index 8b0133fe..9a859b1c 100644
--- a/src/imports/controls/universal/ComboBox.qml
+++ b/src/imports/controls/universal/ComboBox.qml
@@ -67,11 +67,13 @@ T.ComboBox {
contentItem: Text {
text: control.displayText
font: control.font
- color: !control.enabled ? control.Universal.baseLowColor : control.Universal.baseHighColor
horizontalAlignment: Text.AlignLeft
verticalAlignment: Text.AlignVCenter
elide: Text.ElideRight
rightPadding: 12 + control.spacing
+
+ opacity: enabled ? 1.0 : 0.2
+ color: control.Universal.foreground
}
//! [contentItem]
diff --git a/src/imports/controls/universal/GroupBox.qml b/src/imports/controls/universal/GroupBox.qml
index 6e4c6ccd..3888f482 100644
--- a/src/imports/controls/universal/GroupBox.qml
+++ b/src/imports/controls/universal/GroupBox.qml
@@ -64,10 +64,12 @@ T.GroupBox {
text: control.title
font: control.font
- color: !control.enabled ? control.Universal.baseLowColor : control.Universal.baseHighColor
elide: Text.ElideRight
horizontalAlignment: Text.AlignLeft
verticalAlignment: Text.AlignVCenter
+
+ opacity: enabled ? 1.0 : 0.2
+ color: control.Universal.foreground
}
//! [label]
diff --git a/src/imports/controls/universal/ItemDelegate.qml b/src/imports/controls/universal/ItemDelegate.qml
index 7066bb3e..d32612f4 100644
--- a/src/imports/controls/universal/ItemDelegate.qml
+++ b/src/imports/controls/universal/ItemDelegate.qml
@@ -67,7 +67,8 @@ T.ItemDelegate {
horizontalAlignment: Text.AlignLeft
verticalAlignment: Text.AlignVCenter
- color: !control.enabled ? control.Universal.baseLowColor : control.Universal.baseHighColor
+ opacity: enabled ? 1.0 : 0.2
+ color: control.Universal.foreground
}
//! [contentItem]
diff --git a/src/imports/controls/universal/Label.qml b/src/imports/controls/universal/Label.qml
index a575fcbc..db0fdea0 100644
--- a/src/imports/controls/universal/Label.qml
+++ b/src/imports/controls/universal/Label.qml
@@ -41,6 +41,7 @@ import Qt.labs.controls.universal 1.0
T.Label {
id: control
- color: !control.enabled ? Universal.baseLowColor : Universal.baseHighColor
+ opacity: enabled ? 1.0 : 0.2
+ color: control.Universal.foreground
linkColor: Universal.accent
}
diff --git a/src/imports/controls/universal/Page.qml b/src/imports/controls/universal/Page.qml
index d84498fe..85b1ef8c 100644
--- a/src/imports/controls/universal/Page.qml
+++ b/src/imports/controls/universal/Page.qml
@@ -47,7 +47,7 @@ T.Page {
//! [background]
background: Rectangle {
- color: control.Universal.altHighColor
+ color: control.Universal.background
}
//! [background]
}
diff --git a/src/imports/controls/universal/Pane.qml b/src/imports/controls/universal/Pane.qml
index 2f17064b..97d1d140 100644
--- a/src/imports/controls/universal/Pane.qml
+++ b/src/imports/controls/universal/Pane.qml
@@ -55,7 +55,7 @@ T.Pane {
//! [background]
background: Rectangle {
- color: control.Universal.altHighColor
+ color: control.Universal.background
}
//! [background]
}
diff --git a/src/imports/controls/universal/RadioButton.qml b/src/imports/controls/universal/RadioButton.qml
index f0fc3975..2091e082 100644
--- a/src/imports/controls/universal/RadioButton.qml
+++ b/src/imports/controls/universal/RadioButton.qml
@@ -74,7 +74,8 @@ T.RadioButton {
horizontalAlignment: Text.AlignLeft
verticalAlignment: Text.AlignVCenter
- color: !control.enabled ? control.Universal.baseLowColor : control.Universal.baseHighColor
+ opacity: enabled ? 1.0 : 0.2
+ color: control.Universal.foreground
}
//! [contentItem]
}
diff --git a/src/imports/controls/universal/RadioDelegate.qml b/src/imports/controls/universal/RadioDelegate.qml
index 3ea37555..4aeeb7ce 100644
--- a/src/imports/controls/universal/RadioDelegate.qml
+++ b/src/imports/controls/universal/RadioDelegate.qml
@@ -77,7 +77,8 @@ T.RadioDelegate {
horizontalAlignment: Text.AlignLeft
verticalAlignment: Text.AlignVCenter
- color: !control.enabled ? control.Universal.baseLowColor : control.Universal.baseHighColor
+ opacity: enabled ? 1.0 : 0.2
+ color: control.Universal.foreground
}
//! [contentItem]
diff --git a/src/imports/controls/universal/SpinBox.qml b/src/imports/controls/universal/SpinBox.qml
index 8088289c..4751b83c 100644
--- a/src/imports/controls/universal/SpinBox.qml
+++ b/src/imports/controls/universal/SpinBox.qml
@@ -73,7 +73,7 @@ T.SpinBox {
font: control.font
color: !enabled ? control.Universal.chromeDisabledLowColor :
- activeFocus ? control.Universal.chromeBlackHighColor : control.Universal.baseHighColor
+ activeFocus ? control.Universal.chromeBlackHighColor : control.Universal.foreground
selectionColor: control.Universal.accent
selectedTextColor: control.Universal.chromeWhiteColor
horizontalAlignment: Qt.AlignHCenter
@@ -145,7 +145,7 @@ T.SpinBox {
border.width: 2 // TextControlBorderThemeThickness
border.color: !control.enabled ? control.Universal.baseLowColor :
control.activeFocus ? control.Universal.accent : control.Universal.chromeDisabledLowColor
- color: control.enabled ? control.Universal.altHighColor : control.Universal.baseLowColor
+ color: control.enabled ? control.Universal.background : control.Universal.baseLowColor
}
//! [background]
}
diff --git a/src/imports/controls/universal/SwipeDelegate.qml b/src/imports/controls/universal/SwipeDelegate.qml
index eace3045..6fe7dca0 100644
--- a/src/imports/controls/universal/SwipeDelegate.qml
+++ b/src/imports/controls/universal/SwipeDelegate.qml
@@ -68,7 +68,8 @@ T.SwipeDelegate {
verticalAlignment: Text.AlignVCenter
renderType: Text.NativeRendering
- color: !control.enabled ? control.Universal.baseLowColor : control.Universal.baseHighColor
+ opacity: enabled ? 1.0 : 0.2
+ color: control.Universal.foreground
Behavior on x {
enabled: !control.down
diff --git a/src/imports/controls/universal/Switch.qml b/src/imports/controls/universal/Switch.qml
index f4b2e63d..929993a5 100644
--- a/src/imports/controls/universal/Switch.qml
+++ b/src/imports/controls/universal/Switch.qml
@@ -73,7 +73,8 @@ T.Switch {
horizontalAlignment: Text.AlignLeft
verticalAlignment: Text.AlignVCenter
- color: !control.enabled ? control.Universal.baseLowColor : control.Universal.baseHighColor
+ opacity: enabled ? 1.0 : 0.2
+ color: control.Universal.foreground
}
//! [contentItem]
}
diff --git a/src/imports/controls/universal/SwitchDelegate.qml b/src/imports/controls/universal/SwitchDelegate.qml
index c543f8e6..4deca436 100644
--- a/src/imports/controls/universal/SwitchDelegate.qml
+++ b/src/imports/controls/universal/SwitchDelegate.qml
@@ -75,7 +75,8 @@ T.SwitchDelegate {
horizontalAlignment: Text.AlignLeft
verticalAlignment: Text.AlignVCenter
- color: !control.enabled ? control.Universal.baseLowColor : control.Universal.baseHighColor
+ opacity: enabled ? 1.0 : 0.2
+ color: control.Universal.foreground
}
//! [contentItem]
diff --git a/src/imports/controls/universal/TabBar.qml b/src/imports/controls/universal/TabBar.qml
index 16b248ed..185a1beb 100644
--- a/src/imports/controls/universal/TabBar.qml
+++ b/src/imports/controls/universal/TabBar.qml
@@ -73,7 +73,7 @@ T.TabBar {
background: Rectangle {
implicitWidth: 200
implicitHeight: 48
- color: control.Universal.altHighColor
+ color: control.Universal.background
}
//! [background]
}
diff --git a/src/imports/controls/universal/TabButton.qml b/src/imports/controls/universal/TabButton.qml
index 149de82c..9192d64d 100644
--- a/src/imports/controls/universal/TabButton.qml
+++ b/src/imports/controls/universal/TabButton.qml
@@ -54,9 +54,11 @@ T.TabButton {
text: control.text
font: control.font
elide: Text.ElideRight
- color: control.checked || control.down ? control.Universal.baseHighColor : control.Universal.baseLowColor
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
+
+ opacity: control.checked || control.down ? 1.0 : 0.2
+ color: control.Universal.foreground
}
//! [contentItem]
}
diff --git a/src/imports/controls/universal/TextArea.qml b/src/imports/controls/universal/TextArea.qml
index 63b81a0a..810fce82 100644
--- a/src/imports/controls/universal/TextArea.qml
+++ b/src/imports/controls/universal/TextArea.qml
@@ -57,7 +57,7 @@ T.TextArea {
Universal.theme: activeFocus ? Universal.Light : undefined
color: !enabled ? Universal.chromeDisabledLowColor :
- activeFocus ? Universal.chromeBlackHighColor : Universal.baseHighColor
+ activeFocus ? Universal.chromeBlackHighColor : Universal.foreground
selectionColor: Universal.accent
selectedTextColor: Universal.chromeWhiteColor
@@ -86,7 +86,7 @@ T.TextArea {
border.width: 2 // TextControlBorderThemeThickness
border.color: !control.enabled ? control.Universal.baseLowColor :
control.activeFocus ? control.Universal.accent : control.Universal.chromeDisabledLowColor
- color: control.enabled ? control.Universal.altHighColor : control.Universal.baseLowColor
+ color: control.enabled ? control.Universal.background : control.Universal.baseLowColor
}
//! [background]
}
diff --git a/src/imports/controls/universal/TextField.qml b/src/imports/controls/universal/TextField.qml
index 9521b00e..bc891164 100644
--- a/src/imports/controls/universal/TextField.qml
+++ b/src/imports/controls/universal/TextField.qml
@@ -57,7 +57,7 @@ T.TextField {
Universal.theme: activeFocus ? Universal.Light : undefined
color: !enabled ? Universal.chromeDisabledLowColor :
- activeFocus ? Universal.chromeBlackHighColor : Universal.baseHighColor
+ activeFocus ? Universal.chromeBlackHighColor : Universal.foreground
selectionColor: Universal.accent
selectedTextColor: Universal.chromeWhiteColor
verticalAlignment: TextInput.AlignVCenter
@@ -87,7 +87,7 @@ T.TextField {
border.width: 2 // TextControlBorderThemeThickness
border.color: !control.enabled ? control.Universal.baseLowColor :
control.activeFocus ? control.Universal.accent : control.Universal.chromeDisabledLowColor
- color: control.enabled ? control.Universal.altHighColor : control.Universal.baseLowColor
+ color: control.enabled ? control.Universal.background : control.Universal.baseLowColor
}
//! [background]
}
diff --git a/src/imports/controls/universal/ToolButton.qml b/src/imports/controls/universal/ToolButton.qml
index 14d2d923..90bbd46e 100644
--- a/src/imports/controls/universal/ToolButton.qml
+++ b/src/imports/controls/universal/ToolButton.qml
@@ -55,10 +55,12 @@ T.ToolButton {
contentItem: Text {
text: control.text
font: control.font
- color: control.enabled ? control.Universal.baseHighColor : control.Universal.baseLowColor
elide: Text.ElideRight
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
+
+ opacity: enabled ? 1.0 : 0.2
+ color: control.Universal.foreground
}
//! [contentItem]
diff --git a/src/imports/controls/universal/ToolTip.qml b/src/imports/controls/universal/ToolTip.qml
index 0b5e8cc0..3fec669f 100644
--- a/src/imports/controls/universal/ToolTip.qml
+++ b/src/imports/controls/universal/ToolTip.qml
@@ -61,7 +61,8 @@ T.ToolTip {
text: control.text
// TODO: font: control.font
// TODO: wrapMode: Label.Wrap
- color: control.Universal.baseHighColor
+ opacity: enabled ? 1.0 : 0.2
+ color: control.Universal.foreground
}
//! [contentItem]
diff --git a/src/imports/controls/universal/Tumbler.qml b/src/imports/controls/universal/Tumbler.qml
index c6bafaa1..7e05c6df 100644
--- a/src/imports/controls/universal/Tumbler.qml
+++ b/src/imports/controls/universal/Tumbler.qml
@@ -48,9 +48,9 @@ T.Tumbler {
//! [delegate]
delegate: Text {
text: modelData
- color: !control.enabled ? control.Universal.baseLowColor : control.Universal.baseHighColor
font: control.font
- opacity: 0.4 + Math.max(0, 1 - Math.abs(Tumbler.displacement)) * 0.6
+ color: control.Universal.foreground
+ opacity: 0.4 + Math.max(0, 1 - Math.abs(Tumbler.displacement)) * (control.enabled ? 0.6 : 0.2)
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
}
diff --git a/src/imports/controls/universal/qquickuniversalstyle.cpp b/src/imports/controls/universal/qquickuniversalstyle.cpp
index f156a80d..1cba474a 100644
--- a/src/imports/controls/universal/qquickuniversalstyle.cpp
+++ b/src/imports/controls/universal/qquickuniversalstyle.cpp
@@ -134,9 +134,13 @@ static QRgb qquickuniversal_accent_color(QQuickUniversalStyle::Color accent)
static QQuickUniversalStyle::Theme DefaultTheme = QQuickUniversalStyle::Light;
static QRgb DefaultAccent = qquickuniversal_accent_color(QQuickUniversalStyle::Cobalt);
+static QRgb DefaultForeground = qquickuniversal_light_color(QQuickUniversalStyle::BaseHigh);
+static QRgb DefaultBackground = qquickuniversal_light_color(QQuickUniversalStyle::AltHigh);
QQuickUniversalStyle::QQuickUniversalStyle(QObject *parent) : QQuickStyleAttached(parent),
- m_explicitTheme(false), m_explicitAccent(false), m_theme(DefaultTheme), m_accent(DefaultAccent)
+ m_explicitTheme(false), m_explicitAccent(false), m_explicitForeground(false), m_explicitBackground(false),
+ m_hasForeground(false), m_hasBackground(false), m_theme(DefaultTheme),
+ m_accent(DefaultAccent), m_foreground(DefaultForeground), m_background(DefaultBackground)
{
init();
}
@@ -244,6 +248,116 @@ void QQuickUniversalStyle::resetAccent()
inheritAccent(universal ? universal->m_accent : DefaultAccent);
}
+QVariant QQuickUniversalStyle::foreground() const
+{
+ if (m_hasForeground)
+ return QColor::fromRgba(m_foreground);
+ return baseHighColor();
+}
+
+void QQuickUniversalStyle::setForeground(const QVariant &var)
+{
+ QRgb foreground = 0;
+ if (!variantToRgba(var, "foreground", &foreground))
+ return;
+
+ m_hasForeground = true;
+ m_explicitForeground = true;
+ if (m_foreground == foreground)
+ return;
+
+ m_foreground = foreground;
+ propagateForeground();
+ emit foregroundChanged();
+}
+
+void QQuickUniversalStyle::inheritForeground(QRgb foreground, bool has)
+{
+ if (m_explicitForeground || m_foreground == foreground)
+ return;
+
+ m_hasForeground = has;
+ m_foreground = foreground;
+ propagateForeground();
+ emit foregroundChanged();
+}
+
+void QQuickUniversalStyle::propagateForeground()
+{
+ const auto styles = childStyles();
+ for (QQuickStyleAttached *child : styles) {
+ QQuickUniversalStyle *universal = qobject_cast<QQuickUniversalStyle *>(child);
+ if (universal)
+ universal->inheritForeground(m_foreground, m_hasForeground);
+ }
+}
+
+void QQuickUniversalStyle::resetForeground()
+{
+ if (!m_explicitForeground)
+ return;
+
+ m_hasForeground = false;
+ m_explicitForeground = false;
+ QQuickUniversalStyle *universal = qobject_cast<QQuickUniversalStyle *>(parentStyle());
+ inheritForeground(universal ? universal->m_foreground : DefaultForeground, universal ? universal->m_hasForeground : false);
+}
+
+QVariant QQuickUniversalStyle::background() const
+{
+ if (m_hasBackground)
+ return QColor::fromRgba(m_background);
+ return altHighColor();
+}
+
+void QQuickUniversalStyle::setBackground(const QVariant &var)
+{
+ QRgb background = 0;
+ if (!variantToRgba(var, "background", &background))
+ return;
+
+ m_hasBackground = true;
+ m_explicitBackground = true;
+ if (m_background == background)
+ return;
+
+ m_background = background;
+ propagateBackground();
+ emit backgroundChanged();
+}
+
+void QQuickUniversalStyle::inheritBackground(QRgb background, bool has)
+{
+ if (m_explicitBackground || m_background == background)
+ return;
+
+ m_hasBackground = has;
+ m_background = background;
+ propagateBackground();
+ emit backgroundChanged();
+}
+
+void QQuickUniversalStyle::propagateBackground()
+{
+ const auto styles = childStyles();
+ for (QQuickStyleAttached *child : styles) {
+ QQuickUniversalStyle *universal = qobject_cast<QQuickUniversalStyle *>(child);
+ if (universal)
+ universal->inheritBackground(m_background, m_hasBackground);
+ }
+}
+
+void QQuickUniversalStyle::resetBackground()
+{
+ if (!m_explicitBackground)
+ return;
+
+ m_hasBackground = false;
+ m_explicitBackground = false;
+ QQuickUniversalStyle *universal = qobject_cast<QQuickUniversalStyle *>(parentStyle());
+ inheritBackground(universal ? universal->m_background : DefaultBackground, universal ? universal->m_hasBackground : false);
+}
+
QColor QQuickUniversalStyle::color(Color color) const
{
return qquickuniversal_accent_color(color);
@@ -381,6 +495,8 @@ void QQuickUniversalStyle::parentStyleChange(QQuickStyleAttached *newParent, QQu
if (universal) {
inheritTheme(universal->theme());
inheritAccent(universal->m_accent);
+ inheritForeground(universal->m_foreground, universal->m_hasForeground);
+ inheritBackground(universal->m_background, universal->m_hasBackground);
}
}
@@ -425,6 +541,30 @@ void QQuickUniversalStyle::init()
qWarning().nospace().noquote() << "Universal: unknown accent value: " << accentValue;
}
+ QByteArray foregroundValue = resolveSetting("QT_LABS_CONTROLS_UNIVERSAL_FOREGROUND", settings, QStringLiteral("Foreground"));
+ Color foregroundEnum = toEnumValue<Color>(foregroundValue, &ok);
+ if (ok) {
+ DefaultForeground = m_foreground = qquickuniversal_accent_color(foregroundEnum);
+ } else if (!foregroundValue.isEmpty()) {
+ QColor color(foregroundValue.constData());
+ if (color.isValid())
+ DefaultForeground = m_foreground = color.rgba();
+ else
+ qWarning().nospace().noquote() << "Universal: unknown foreground value: " << foregroundValue;
+ }
+
+ QByteArray backgroundValue = resolveSetting("QT_LABS_CONTROLS_UNIVERSAL_BACKGROUND", settings, QStringLiteral("Background"));
+ Color backgroundEnum = toEnumValue<Color>(backgroundValue, &ok);
+ if (ok) {
+ DefaultBackground = m_background = qquickuniversal_accent_color(backgroundEnum);
+ } else if (!backgroundValue.isEmpty()) {
+ QColor color(backgroundValue.constData());
+ if (color.isValid())
+ DefaultBackground = m_background = color.rgba();
+ else
+ qWarning().nospace().noquote() << "Universal: unknown background value: " << backgroundValue;
+ }
+
defaultsInitialized = true;
}
diff --git a/src/imports/controls/universal/qquickuniversalstyle_p.h b/src/imports/controls/universal/qquickuniversalstyle_p.h
index f2e01f75..8e27215d 100644
--- a/src/imports/controls/universal/qquickuniversalstyle_p.h
+++ b/src/imports/controls/universal/qquickuniversalstyle_p.h
@@ -60,6 +60,8 @@ class QQuickUniversalStyle : public QQuickStyleAttached
Q_OBJECT
Q_PROPERTY(Theme theme READ theme WRITE setTheme RESET resetTheme NOTIFY themeChanged FINAL)
Q_PROPERTY(QVariant accent READ accent WRITE setAccent RESET resetAccent NOTIFY accentChanged FINAL)
+ Q_PROPERTY(QVariant foreground READ foreground WRITE setForeground RESET resetForeground NOTIFY foregroundChanged FINAL)
+ Q_PROPERTY(QVariant background READ background WRITE setBackground RESET resetBackground NOTIFY backgroundChanged FINAL)
Q_PROPERTY(QColor altHighColor READ altHighColor NOTIFY paletteChanged FINAL)
Q_PROPERTY(QColor altLowColor READ altLowColor NOTIFY paletteChanged FINAL)
@@ -130,6 +132,18 @@ public:
void propagateAccent();
void resetAccent();
+ QVariant foreground() const;
+ void setForeground(const QVariant &foreground);
+ void inheritForeground(QRgb foreground, bool has);
+ void propagateForeground();
+ void resetForeground();
+
+ QVariant background() const;
+ void setBackground(const QVariant &background);
+ void inheritBackground(QRgb background, bool has);
+ void propagateBackground();
+ void resetBackground();
+
Q_INVOKABLE QColor color(Color color) const;
QColor altHighColor() const;
@@ -189,6 +203,8 @@ public:
Q_SIGNALS:
void themeChanged();
void accentChanged();
+ void foregroundChanged();
+ void backgroundChanged();
void paletteChanged();
protected:
@@ -200,8 +216,14 @@ private:
bool m_explicitTheme;
bool m_explicitAccent;
+ bool m_explicitForeground;
+ bool m_explicitBackground;
+ bool m_hasForeground;
+ bool m_hasBackground;
QQuickUniversalStyle::Theme m_theme;
QRgb m_accent;
+ QRgb m_foreground;
+ QRgb m_background;
};
QT_END_NAMESPACE