From 589d52b3b64a4b5221738a28df08be2eae4d12b2 Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Thu, 11 Jan 2018 13:29:23 +0100 Subject: Fusion: eliminate internal IDs to enable deferred execution Task-number: QTBUG-65341 Change-Id: I3bfd36f1d1e275eb507184c376599aa7751a069e Reviewed-by: Mitch Curtis --- src/imports/controls/fusion/BusyIndicator.qml | 6 +-- src/imports/controls/fusion/DelayButton.qml | 58 +++++++--------------- src/imports/controls/fusion/ProgressBar.qml | 3 +- src/imports/controls/fusion/RoundButton.qml | 12 ++--- src/imports/controls/fusion/ScrollBar.qml | 6 +-- src/imports/controls/fusion/ScrollIndicator.qml | 6 +-- src/imports/controls/fusion/TabButton.qml | 27 +++------- .../controls/fusion/qquickfusionbusyindicator.cpp | 21 +++++++- .../controls/fusion/qquickfusionbusyindicator_p.h | 7 +++ tests/auto/customization/tst_customization.cpp | 2 +- 10 files changed, 68 insertions(+), 80 deletions(-) diff --git a/src/imports/controls/fusion/BusyIndicator.qml b/src/imports/controls/fusion/BusyIndicator.qml index d0f2b531..9be5ae71 100644 --- a/src/imports/controls/fusion/BusyIndicator.qml +++ b/src/imports/controls/fusion/BusyIndicator.qml @@ -54,12 +54,12 @@ T.BusyIndicator { implicitHeight: 28 color: control.palette.text + running: control.running opacity: control.running ? 1 : 0 - visible: control.running || opacityAnimator.running - Behavior on opacity { OpacityAnimator { id: opacityAnimator; duration: 250 } } + Behavior on opacity { OpacityAnimator { duration: 250 } } RotationAnimator on rotation { - running: control.running || opacityAnimator.running + running: control.running || contentItem.visible from: 0 to: 360 duration: 1000 diff --git a/src/imports/controls/fusion/DelayButton.qml b/src/imports/controls/fusion/DelayButton.qml index abeda360..c39cb9d0 100644 --- a/src/imports/controls/fusion/DelayButton.qml +++ b/src/imports/controls/fusion/DelayButton.qml @@ -58,53 +58,33 @@ T.DelayButton { } } - contentItem: Item { - implicitWidth: label.implicitWidth - implicitHeight: label.implicitHeight - - Item { - x: -control.leftPadding + (control.mirrored ? 0 : control.progress * control.width) - width: control.width - height: parent.height - + contentItem: ItemGroup { + ClippedText { clip: control.progress > 0 + clipX: -control.leftPadding + (control.mirrored ? 0 : control.progress * control.width) + clipWidth: control.width visible: control.mirrored ? control.progress > 0 : control.progress < 1 - Text { - id: label - x: -parent.x - width: control.availableWidth - height: parent.height - - text: control.text - font: control.font - color: control.mirrored ? control.palette.brightText : control.palette.buttonText - horizontalAlignment: Text.AlignHCenter - verticalAlignment: Text.AlignVCenter - elide: Text.ElideRight - } + text: control.text + font: control.font + color: control.mirrored ? control.palette.brightText : control.palette.buttonText + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + elide: Text.ElideRight } - Item { - x: -control.leftPadding - width: (control.mirrored ? 1.0 - control.progress : control.progress) * control.width - height: parent.height - + ClippedText { clip: control.progress > 0 + clipX: -control.leftPadding + clipWidth: (control.mirrored ? 1.0 - control.progress : control.progress) * control.width visible: control.mirrored ? control.progress < 1 : control.progress > 0 - Text { - x: -parent.x - width: control.availableWidth - height: parent.height - - text: control.text - font: control.font - color: control.mirrored ? control.palette.buttonText : control.palette.brightText - horizontalAlignment: Text.AlignHCenter - verticalAlignment: Text.AlignVCenter - elide: Text.ElideRight - } + text: control.text + font: control.font + color: control.mirrored ? control.palette.buttonText : control.palette.brightText + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + elide: Text.ElideRight } } diff --git a/src/imports/controls/fusion/ProgressBar.qml b/src/imports/controls/fusion/ProgressBar.qml index f7e21809..3ca7a09b 100644 --- a/src/imports/controls/fusion/ProgressBar.qml +++ b/src/imports/controls/fusion/ProgressBar.qml @@ -80,7 +80,6 @@ T.ProgressBar { clip: true ColorImage { - id: mask width: Math.ceil(parent.width / implicitWidth + 1) * implicitWidth height: parent.height @@ -92,7 +91,7 @@ T.ProgressBar { visible: control.indeterminate NumberAnimation on x { running: control.indeterminate && control.visible - from: -mask.implicitWidth + from: -31 // progressmask.png width to: 0 loops: Animation.Infinite duration: 750 diff --git a/src/imports/controls/fusion/RoundButton.qml b/src/imports/controls/fusion/RoundButton.qml index 390f78f3..981a44ab 100644 --- a/src/imports/controls/fusion/RoundButton.qml +++ b/src/imports/controls/fusion/RoundButton.qml @@ -72,18 +72,16 @@ T.RoundButton { implicitHeight: 32 visible: !control.flat || control.down || control.checked - color: Fusion.buttonColor(control.palette, control.highlighted, control.down || control.checked, control.hovered) - gradient: control.down || control.checked ? null : buttonGradient - - Gradient { - id: buttonGradient + gradient: Gradient { GradientStop { position: 0 - color: Fusion.gradientStart(Fusion.buttonColor(control.palette, control.highlighted, control.down, control.hovered)) + color: control.down || control.checked ? Fusion.buttonColor(control.palette, control.highlighted, control.down || control.checked, control.hovered) + : Fusion.gradientStart(Fusion.buttonColor(control.palette, control.highlighted, control.down, control.hovered)) } GradientStop { position: 1 - color: Fusion.gradientStop(Fusion.buttonColor(control.palette, control.highlighted, control.down, control.hovered)) + color: control.down || control.checked ? Fusion.buttonColor(control.palette, control.highlighted, control.down || control.checked, control.hovered) + : Fusion.gradientStop(Fusion.buttonColor(control.palette, control.highlighted, control.down, control.hovered)) } } diff --git a/src/imports/controls/fusion/ScrollBar.qml b/src/imports/controls/fusion/ScrollBar.qml index e85c8440..8668838d 100644 --- a/src/imports/controls/fusion/ScrollBar.qml +++ b/src/imports/controls/fusion/ScrollBar.qml @@ -53,8 +53,6 @@ T.ScrollBar { visible: control.policy !== T.ScrollBar.AlwaysOff contentItem: Rectangle { - id: handle - implicitWidth: control.interactive ? 6 : 2 implicitHeight: control.interactive ? 6 : 2 @@ -65,14 +63,14 @@ T.ScrollBar { states: State { name: "active" when: control.policy === T.ScrollBar.AlwaysOn || (control.active && control.size < 1.0) - PropertyChanges { target: handle; opacity: 0.75 } + PropertyChanges { target: control.contentItem; opacity: 0.75 } } transitions: Transition { from: "active" SequentialAnimation { PauseAnimation { duration: 450 } - NumberAnimation { target: handle; duration: 200; property: "opacity"; to: 0.0 } + NumberAnimation { target: control.contentItem; duration: 200; property: "opacity"; to: 0.0 } } } } diff --git a/src/imports/controls/fusion/ScrollIndicator.qml b/src/imports/controls/fusion/ScrollIndicator.qml index 68147ea5..3a0c17b6 100644 --- a/src/imports/controls/fusion/ScrollIndicator.qml +++ b/src/imports/controls/fusion/ScrollIndicator.qml @@ -52,8 +52,6 @@ T.ScrollIndicator { padding: 2 contentItem: Rectangle { - id: indicator - implicitWidth: 2 implicitHeight: 2 @@ -64,7 +62,7 @@ T.ScrollIndicator { states: State { name: "active" when: control.active - PropertyChanges { target: indicator; opacity: 0.75 } + PropertyChanges { target: control.contentItem; opacity: 0.75 } } transitions: [ @@ -72,7 +70,7 @@ T.ScrollIndicator { from: "active" SequentialAnimation { PauseAnimation { duration: 450 } - NumberAnimation { target: indicator; duration: 200; property: "opacity"; to: 0.0 } + NumberAnimation { target: control.contentItem; duration: 200; property: "opacity"; to: 0.0 } } } ] diff --git a/src/imports/controls/fusion/TabButton.qml b/src/imports/controls/fusion/TabButton.qml index c4ec2029..c705d2a1 100644 --- a/src/imports/controls/fusion/TabButton.qml +++ b/src/imports/controls/fusion/TabButton.qml @@ -77,33 +77,22 @@ T.TabButton { height: control.height - (control.checked ? 0 : 2) border.color: Qt.lighter(Fusion.outline(control.palette), 1.1) - gradient: control.checked ? selectedGradient : normalGradient - Gradient { - id: selectedGradient + gradient: Gradient { GradientStop { position: 0 - color: Qt.lighter(Fusion.tabFrameColor(control.palette), 1.04) + color: control.checked ? Qt.lighter(Fusion.tabFrameColor(control.palette), 1.04) + : Qt.darker(Fusion.tabFrameColor(control.palette), 1.08) } GradientStop { - position: 1 - color: Fusion.tabFrameColor(control.palette) - } - } - - Gradient { - id: normalGradient - GradientStop { - position: 0 - color: Qt.darker(Fusion.tabFrameColor(control.palette), 1.08) - } - GradientStop { - position: 0.85 - color: Qt.darker(Fusion.tabFrameColor(control.palette), 1.08) + position: control.checked ? 0 : 0.85 + color: control.checked ? Qt.lighter(Fusion.tabFrameColor(control.palette), 1.04) + : Qt.darker(Fusion.tabFrameColor(control.palette), 1.08) } GradientStop { position: 1 - color: Qt.darker(Fusion.tabFrameColor(control.palette), 1.16) + color: control.checked ? Fusion.tabFrameColor(control.palette) + : Qt.darker(Fusion.tabFrameColor(control.palette), 1.16) } } } diff --git a/src/imports/controls/fusion/qquickfusionbusyindicator.cpp b/src/imports/controls/fusion/qquickfusionbusyindicator.cpp index 7254b7b7..f5c92010 100644 --- a/src/imports/controls/fusion/qquickfusionbusyindicator.cpp +++ b/src/imports/controls/fusion/qquickfusionbusyindicator.cpp @@ -59,11 +59,22 @@ void QQuickFusionBusyIndicator::setColor(const QColor &color) update(); } +bool QQuickFusionBusyIndicator::isRunning() const +{ + return isVisible(); +} + +void QQuickFusionBusyIndicator::setRunning(bool running) +{ + if (running) + setVisible(true); +} + void QQuickFusionBusyIndicator::paint(QPainter *painter) { const qreal w = width(); const qreal h = height(); - if (w <= 0 || h <= 0 || !isVisible()) + if (w <= 0 || h <= 0 || !isRunning()) return; const qreal sz = qMin(w, h); @@ -87,4 +98,12 @@ void QQuickFusionBusyIndicator::paint(QPainter *painter) painter->drawArc(bounds, 0, 20 * 16); } +void QQuickFusionBusyIndicator::itemChange(ItemChange change, const ItemChangeData &data) +{ + QQuickPaintedItem::itemChange(change, data); + + if (change == ItemOpacityHasChanged && qFuzzyIsNull(data.realValue)) + setVisible(false); +} + QT_END_NAMESPACE diff --git a/src/imports/controls/fusion/qquickfusionbusyindicator_p.h b/src/imports/controls/fusion/qquickfusionbusyindicator_p.h index c8af3311..77487ec8 100644 --- a/src/imports/controls/fusion/qquickfusionbusyindicator_p.h +++ b/src/imports/controls/fusion/qquickfusionbusyindicator_p.h @@ -57,6 +57,7 @@ class QQuickFusionBusyIndicator : public QQuickPaintedItem { Q_OBJECT Q_PROPERTY(QColor color READ color WRITE setColor FINAL) + Q_PROPERTY(bool running READ isRunning WRITE setRunning) public: explicit QQuickFusionBusyIndicator(QQuickItem *parent = nullptr); @@ -64,8 +65,14 @@ public: QColor color() const; void setColor(const QColor &color); + bool isRunning() const; + void setRunning(bool running); + void paint(QPainter *painter) override; +protected: + void itemChange(ItemChange change, const ItemChangeData &data) override; + private: QColor m_color; }; diff --git a/tests/auto/customization/tst_customization.cpp b/tests/auto/customization/tst_customization.cpp index 3fabfaee..3608a710 100644 --- a/tests/auto/customization/tst_customization.cpp +++ b/tests/auto/customization/tst_customization.cpp @@ -360,7 +360,7 @@ void tst_customization::override_data() #ifndef Q_OS_MACOS // QTBUG-65671 // test that the built-in styles don't have undesired IDs in their delegates - const QStringList styles = QStringList() << "Default" << "Material" << "Universal"; // ### TODO: QQuickStyle::availableStyles(); + const QStringList styles = QStringList() << "Default" << "Fusion" << "Material" << "Universal"; // ### TODO: QQuickStyle::availableStyles(); for (const QString &style : styles) { for (const ControlInfo &control : ControlInfos) QTest::newRow(qPrintable(style + ":" + control.type)) << style << control.type << control.delegates << "" << false; -- cgit v1.2.3