From eae24fccc57437170e2ba01b894fa24fe65292be Mon Sep 17 00:00:00 2001 From: Mitch Curtis Date: Tue, 12 Apr 2016 16:19:58 +0200 Subject: [PATCH] Add QQuickAbstractButton::down This property will determine whether or not the button is visually pressed. Having such a distinction allows users more control over their controls. The patch also fixes the problem with ComboBox where pressing on the ComboBox when it's open would cause a delegate in the popup to show as being pressed. Unless explicitly set, this property follows the value of the pressed property. To return to the default value, set it to undefined. Change-Id: I29ecf325ed2ede125613f0c878b0427937599866 Task-number: QTBUG-51005 Reviewed-by: J-P Nurmi --- src/imports/controls/Button.qml | 8 +-- src/imports/controls/CheckBox.qml | 2 +- src/imports/controls/CheckDelegate.qml | 4 +- src/imports/controls/CheckIndicator.qml | 4 +- src/imports/controls/ComboBox.qml | 4 +- src/imports/controls/ItemDelegate.qml | 4 +- src/imports/controls/MenuItem.qml | 2 +- src/imports/controls/RadioButton.qml | 2 +- src/imports/controls/RadioDelegate.qml | 4 +- src/imports/controls/RadioIndicator.qml | 4 +- src/imports/controls/SwipeDelegate.qml | 6 +-- src/imports/controls/TabButton.qml | 4 +- src/imports/controls/ToolButton.qml | 4 +- .../qtquickcontrols2-button-pressed.qml | 2 +- .../doc/snippets/qtquickcontrols2-tooltip.qml | 2 +- src/imports/controls/material/Button.qml | 4 +- .../controls/material/CheckDelegate.qml | 4 +- .../controls/material/CheckIndicator.qml | 2 +- src/imports/controls/material/ComboBox.qml | 4 +- .../controls/material/ItemDelegate.qml | 4 +- src/imports/controls/material/MenuItem.qml | 4 +- .../controls/material/RadioDelegate.qml | 4 +- .../controls/material/RadioIndicator.qml | 6 +-- .../controls/material/SwipeDelegate.qml | 6 +-- src/imports/controls/material/TabButton.qml | 2 +- src/imports/controls/material/ToolButton.qml | 4 +- src/imports/controls/universal/Button.qml | 2 +- .../controls/universal/CheckDelegate.qml | 4 +- .../controls/universal/CheckIndicator.qml | 6 +-- src/imports/controls/universal/ComboBox.qml | 6 +-- src/imports/controls/universal/Dial.qml | 2 +- .../controls/universal/ItemDelegate.qml | 4 +- src/imports/controls/universal/MenuItem.qml | 4 +- .../controls/universal/RadioDelegate.qml | 4 +- .../controls/universal/RadioIndicator.qml | 6 +-- .../controls/universal/SwipeDelegate.qml | 6 +-- src/imports/controls/universal/TabButton.qml | 2 +- src/imports/controls/universal/ToolButton.qml | 2 +- src/quicktemplates2/qquickabstractbutton.cpp | 54 +++++++++++++++++-- src/quicktemplates2/qquickabstractbutton_p.h | 8 ++- .../qquickabstractbutton_p_p.h | 2 + src/quicktemplates2/qquickcombobox.cpp | 2 +- tests/auto/controls/data/tst_button.qml | 23 ++++++-- tests/auto/controls/data/tst_combobox.qml | 2 +- tests/auto/controls/data/tst_toolbutton.qml | 24 +++++++++ tests/manual/testbench/main.qml | 26 ++++----- 46 files changed, 192 insertions(+), 97 deletions(-) diff --git a/src/imports/controls/Button.qml b/src/imports/controls/Button.qml index 82ff0914db..406ae931f2 100644 --- a/src/imports/controls/Button.qml +++ b/src/imports/controls/Button.qml @@ -55,7 +55,7 @@ T.Button { text: control.text font: control.font opacity: enabled || highlighted ? 1 : 0.3 - color: control.checked || control.highlighted ? "#ffffff" : (control.activeKeyFocus ? "#0066ff" : (control.pressed ? "#26282a" : "#353637")) + color: control.checked || control.highlighted ? "#ffffff" : (control.activeKeyFocus ? "#0066ff" : (control.down ? "#26282a" : "#353637")) horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter elide: Text.ElideRight @@ -68,9 +68,9 @@ T.Button { implicitHeight: 40 opacity: enabled ? 1 : (control.checked ? 0.2 : 0.3) color: control.checked || control.highlighted ? - (control.activeKeyFocus ? (control.pressed ? "#599bff" : "#0066ff") : (control.pressed ? "#585a5c" : "#353637")) : - (control.activeKeyFocus ? (control.pressed ? "#cce0ff" : "#f0f6ff") : (control.pressed ? "#d6d6d6" : "#f6f6f6")) - border.color: control.activeKeyFocus ? "#0066ff" : (control.pressed ? "#26282a" : "#353637") + (control.activeKeyFocus ? (control.down ? "#599bff" : "#0066ff") : (control.down ? "#585a5c" : "#353637")) : + (control.activeKeyFocus ? (control.down ? "#cce0ff" : "#f0f6ff") : (control.down ? "#d6d6d6" : "#f6f6f6")) + border.color: control.activeKeyFocus ? "#0066ff" : (control.down ? "#26282a" : "#353637") border.width: control.checked || control.highlighted ? 0 : (control.activeKeyFocus ? 2 : 1) } //! [background] diff --git a/src/imports/controls/CheckBox.qml b/src/imports/controls/CheckBox.qml index 720bd428c5..f46b46f2ef 100644 --- a/src/imports/controls/CheckBox.qml +++ b/src/imports/controls/CheckBox.qml @@ -67,7 +67,7 @@ T.CheckBox { text: control.text font: control.font - color: control.pressed ? "#26282a" : "#353637" + color: control.down ? "#26282a" : "#353637" elide: Text.ElideRight visible: control.text horizontalAlignment: Text.AlignLeft diff --git a/src/imports/controls/CheckDelegate.qml b/src/imports/controls/CheckDelegate.qml index f09dfd1502..c56ef22147 100644 --- a/src/imports/controls/CheckDelegate.qml +++ b/src/imports/controls/CheckDelegate.qml @@ -79,8 +79,8 @@ T.CheckDelegate { background: Rectangle { implicitWidth: 100 implicitHeight: 40 - visible: control.pressed || control.highlighted - color: control.pressed ? "#bdbebf" : "#eeeeee" + visible: control.down || control.highlighted + color: control.down ? "#bdbebf" : "#eeeeee" } //! [background] } diff --git a/src/imports/controls/CheckIndicator.qml b/src/imports/controls/CheckIndicator.qml index 260a0d28f7..68ff134eaa 100644 --- a/src/imports/controls/CheckIndicator.qml +++ b/src/imports/controls/CheckIndicator.qml @@ -44,9 +44,9 @@ Rectangle { implicitWidth: 28 implicitHeight: 28 - color: control.enabled ? (control.pressed ? (control.activeFocus ? "#cce0ff" : "#e4e4e4") : "#f6f6f6") : "#353637" + color: control.enabled ? (control.down ? (control.activeFocus ? "#cce0ff" : "#e4e4e4") : "#f6f6f6") : "#353637" border.width: control.activeFocus ? 2 : 1 - border.color: control.enabled ? (control.activeFocus ? "#0066ff" : (control.pressed ? "#26282a" : "#353637")) : "transparent" + border.color: control.enabled ? (control.activeFocus ? "#0066ff" : (control.down ? "#26282a" : "#353637")) : "transparent" Image { x: (parent.width - width) / 2 diff --git a/src/imports/controls/ComboBox.qml b/src/imports/controls/ComboBox.qml index 08ce97c8eb..5ecd638cb0 100644 --- a/src/imports/controls/ComboBox.qml +++ b/src/imports/controls/ComboBox.qml @@ -60,7 +60,7 @@ T.ComboBox { autoExclusive: true checked: control.currentIndex === index highlighted: control.highlightedIndex === index - pressed: highlighted && control.pressed + down: highlighted && control.down } //! [delegate] @@ -85,7 +85,7 @@ T.ComboBox { width: parent.width height: parent.height opacity: control.enabled ? 1.0 : 0.2 - color: control.pressed || popup.visible ? "#585A5C" : "#353637" + color: control.down || popup.visible ? "#585A5C" : "#353637" } Image { diff --git a/src/imports/controls/ItemDelegate.qml b/src/imports/controls/ItemDelegate.qml index 4339df862d..7bd4fd5865 100644 --- a/src/imports/controls/ItemDelegate.qml +++ b/src/imports/controls/ItemDelegate.qml @@ -69,8 +69,8 @@ T.ItemDelegate { background: Rectangle { implicitWidth: 100 implicitHeight: 40 - visible: control.pressed || control.highlighted - color: control.pressed ? "#bdbebf" : "#eeeeee" + visible: control.down || control.highlighted + color: control.down ? "#bdbebf" : "#eeeeee" } //! [background] } diff --git a/src/imports/controls/MenuItem.qml b/src/imports/controls/MenuItem.qml index eb3135cee2..1ad513e558 100644 --- a/src/imports/controls/MenuItem.qml +++ b/src/imports/controls/MenuItem.qml @@ -84,7 +84,7 @@ T.MenuItem { y: 1 width: parent.width - 2 height: parent.height - 2 - color: control.activeKeyFocus || control.pressed ? "#eeeeee" : "transparent" + color: control.activeKeyFocus || control.down ? "#eeeeee" : "transparent" } } //! [background] diff --git a/src/imports/controls/RadioButton.qml b/src/imports/controls/RadioButton.qml index e114ad89eb..b9ac74f373 100644 --- a/src/imports/controls/RadioButton.qml +++ b/src/imports/controls/RadioButton.qml @@ -67,7 +67,7 @@ T.RadioButton { text: control.text font: control.font - color: control.pressed ? "#26282a" : "#353637" + color: control.down ? "#26282a" : "#353637" elide: Text.ElideRight visible: control.text horizontalAlignment: Text.AlignLeft diff --git a/src/imports/controls/RadioDelegate.qml b/src/imports/controls/RadioDelegate.qml index f5e661bdce..2dce11fdc3 100644 --- a/src/imports/controls/RadioDelegate.qml +++ b/src/imports/controls/RadioDelegate.qml @@ -78,8 +78,8 @@ T.RadioDelegate { background: Rectangle { implicitWidth: 100 implicitHeight: 40 - visible: control.pressed || control.highlighted - color: control.pressed ? "#bdbebf" : "#eeeeee" + visible: control.down || control.highlighted + color: control.down ? "#bdbebf" : "#eeeeee" } //! [background] } diff --git a/src/imports/controls/RadioIndicator.qml b/src/imports/controls/RadioIndicator.qml index 49e682e4df..041f8f3e71 100644 --- a/src/imports/controls/RadioIndicator.qml +++ b/src/imports/controls/RadioIndicator.qml @@ -41,9 +41,9 @@ Rectangle { implicitHeight: 28 radius: width / 2 - color: control.pressed ? (control.activeFocus ? "#cce0ff" : "#e4e4e4") : "#f6f6f6" + color: control.down ? (control.activeFocus ? "#cce0ff" : "#e4e4e4") : "#f6f6f6" border.width: control.activeFocus ? 2 : 1 - border.color: control.activeFocus ? "#0066ff" : (control.pressed ? "#26282a" : "#353637") + border.color: control.activeFocus ? "#0066ff" : (control.down ? "#26282a" : "#353637") property Item control diff --git a/src/imports/controls/SwipeDelegate.qml b/src/imports/controls/SwipeDelegate.qml index 6621f44d6b..12673f335b 100644 --- a/src/imports/controls/SwipeDelegate.qml +++ b/src/imports/controls/SwipeDelegate.qml @@ -64,7 +64,7 @@ T.SwipeDelegate { verticalAlignment: Text.AlignVCenter Behavior on x { - enabled: !control.pressed + enabled: !control.down NumberAnimation { easing.type: Easing.InOutCubic duration: 400 @@ -75,10 +75,10 @@ T.SwipeDelegate { //! [background] background: Rectangle { - color: control.pressed ? "#bdbebf" : "#eeeeee" + color: control.down ? "#bdbebf" : "#eeeeee" Behavior on x { - enabled: !control.pressed + enabled: !control.down NumberAnimation { easing.type: Easing.InOutCubic duration: 400 diff --git a/src/imports/controls/TabButton.qml b/src/imports/controls/TabButton.qml index dff05d8c3b..352bef1a03 100644 --- a/src/imports/controls/TabButton.qml +++ b/src/imports/controls/TabButton.qml @@ -54,7 +54,7 @@ T.TabButton { font: control.font elide: Text.ElideRight opacity: enabled ? 1 : 0.3 - color: !control.checked ? "#ffffff" : control.pressed ? "#26282a" : "#353637" + color: !control.checked ? "#ffffff" : control.down ? "#26282a" : "#353637" horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter } @@ -63,7 +63,7 @@ T.TabButton { //! [background] background: Rectangle { implicitHeight: 40 - color: control.pressed ? (control.checked ? "#e4e4e4" : "#585a5c") : (control.checked ? "transparent" : "#353637") + color: control.down ? (control.checked ? "#e4e4e4" : "#585a5c") : (control.checked ? "transparent" : "#353637") } //! [background] } diff --git a/src/imports/controls/ToolButton.qml b/src/imports/controls/ToolButton.qml index fd33637135..8c903bb48d 100644 --- a/src/imports/controls/ToolButton.qml +++ b/src/imports/controls/ToolButton.qml @@ -65,8 +65,8 @@ T.ToolButton { implicitHeight: 40 color: Qt.darker("#33333333", control.enabled && (control.checked || control.highlighted) ? 1.5 : 1.0) - opacity: control.pressed ? 1.0 : control.enabled && (control.checked || control.highlighted) ? 0.5 : 0 - visible: control.pressed || (control.enabled && (control.checked || control.highlighted)) + opacity: control.down ? 1.0 : control.enabled && (control.checked || control.highlighted) ? 0.5 : 0 + visible: control.down || (control.enabled && (control.checked || control.highlighted)) } //! [background] } diff --git a/src/imports/controls/doc/snippets/qtquickcontrols2-button-pressed.qml b/src/imports/controls/doc/snippets/qtquickcontrols2-button-pressed.qml index b5c918db4e..9fde2fc42c 100644 --- a/src/imports/controls/doc/snippets/qtquickcontrols2-button-pressed.qml +++ b/src/imports/controls/doc/snippets/qtquickcontrols2-button-pressed.qml @@ -31,5 +31,5 @@ import Qt.labs.controls 1.0 Button { width: 80 text: "Pressed" - pressed: true + down: true } diff --git a/src/imports/controls/doc/snippets/qtquickcontrols2-tooltip.qml b/src/imports/controls/doc/snippets/qtquickcontrols2-tooltip.qml index 7a061b2d82..08ee995df2 100644 --- a/src/imports/controls/doc/snippets/qtquickcontrols2-tooltip.qml +++ b/src/imports/controls/doc/snippets/qtquickcontrols2-tooltip.qml @@ -36,7 +36,7 @@ Item { property Button button: children[0] - Binding { target: button; property: "pressed"; value: root.Window.active } + Binding { target: button; property: "down"; value: root.Window.active } Binding { target: button.anchors; property: "bottom"; value: root.bottom } Binding { target: button.anchors; property: "horizontalCenter"; value: root.horizontalCenter } diff --git a/src/imports/controls/material/Button.qml b/src/imports/controls/material/Button.qml index 09dac44c46..1e12cb6e40 100644 --- a/src/imports/controls/material/Button.qml +++ b/src/imports/controls/material/Button.qml @@ -76,7 +76,7 @@ T.Button { height: parent.height - 12 radius: 2 color: !control.enabled ? (control.highlighted ? control.Material.raisedHighlightedButtonDisabledColor : control.Material.raisedButtonDisabledColor) : - (control.pressed ? (control.highlighted ? control.Material.raisedHighlightedButtonPressColor : control.Material.raisedButtonPressColor) : + (control.down ? (control.highlighted ? control.Material.raisedHighlightedButtonPressColor : control.Material.raisedButtonPressColor) : (control.activeKeyFocus ? (control.highlighted ? control.Material.raisedHighlightedButtonHoverColor : control.Material.raisedButtonHoverColor) : (control.highlighted ? control.Material.raisedHighlightedButtonColor : control.Material.raisedButtonColor))) @@ -98,7 +98,7 @@ T.Button { layer.effect: DropShadow { verticalOffset: 1 color: control.Material.dropShadowColor - samples: control.pressed ? 15 : 9 + samples: control.down ? 15 : 9 spread: 0.5 } } diff --git a/src/imports/controls/material/CheckDelegate.qml b/src/imports/controls/material/CheckDelegate.qml index acea613cdf..7010496243 100644 --- a/src/imports/controls/material/CheckDelegate.qml +++ b/src/imports/controls/material/CheckDelegate.qml @@ -77,8 +77,8 @@ T.CheckDelegate { //! [background] background: Rectangle { - visible: control.pressed || control.highlighted - color: control.pressed ? control.Material.flatButtonPressColor : control.Material.listHighlightColor + visible: control.down || control.highlighted + color: control.down ? control.Material.flatButtonPressColor : control.Material.listHighlightColor } //! [background] } diff --git a/src/imports/controls/material/CheckIndicator.qml b/src/imports/controls/material/CheckIndicator.qml index ba6de6a2d2..31e1abaf80 100644 --- a/src/imports/controls/material/CheckIndicator.qml +++ b/src/imports/controls/material/CheckIndicator.qml @@ -68,7 +68,7 @@ Rectangle { height: width control: control colored: control.checked - opacity: control.pressed ? 1 : 0 + opacity: control.down ? 1 : 0 } // TODO: This needs to be transparent diff --git a/src/imports/controls/material/ComboBox.qml b/src/imports/controls/material/ComboBox.qml index b1c0c332a6..5a6e06101c 100644 --- a/src/imports/controls/material/ComboBox.qml +++ b/src/imports/controls/material/ComboBox.qml @@ -58,7 +58,7 @@ T.ComboBox { width: control.width text: control.textRole ? (Array.isArray(control.model) ? modelData[control.textRole] : model[control.textRole]) : modelData highlighted: control.highlightedIndex === index - pressed: highlighted && control.pressed + down: highlighted && control.down } //! [delegate] @@ -92,7 +92,7 @@ T.ComboBox { layer.effect: DropShadow { verticalOffset: 1 color: control.Material.dropShadowColor - samples: control.pressed ? 15 : 9 + samples: control.down ? 15 : 9 spread: 0.5 } diff --git a/src/imports/controls/material/ItemDelegate.qml b/src/imports/controls/material/ItemDelegate.qml index 963237161f..efba10b0b6 100644 --- a/src/imports/controls/material/ItemDelegate.qml +++ b/src/imports/controls/material/ItemDelegate.qml @@ -68,8 +68,8 @@ T.ItemDelegate { //! [background] background: Rectangle { - visible: control.pressed || control.highlighted - color: control.pressed ? control.Material.flatButtonPressColor : control.Material.listHighlightColor + visible: control.down || control.highlighted + color: control.down ? control.Material.flatButtonPressColor : control.Material.listHighlightColor } //! [background] } diff --git a/src/imports/controls/material/MenuItem.qml b/src/imports/controls/material/MenuItem.qml index ecc8a3883e..48eb390b88 100644 --- a/src/imports/controls/material/MenuItem.qml +++ b/src/imports/controls/material/MenuItem.qml @@ -79,8 +79,8 @@ T.MenuItem { //! [background] background: Rectangle { implicitWidth: 200 - visible: control.pressed || control.highlighted - color: control.pressed ? control.Material.flatButtonPressColor : control.Material.listHighlightColor + visible: control.down || control.highlighted + color: control.down ? control.Material.flatButtonPressColor : control.Material.listHighlightColor } //! [background] } diff --git a/src/imports/controls/material/RadioDelegate.qml b/src/imports/controls/material/RadioDelegate.qml index 78780e50a9..5f5f58cfc3 100644 --- a/src/imports/controls/material/RadioDelegate.qml +++ b/src/imports/controls/material/RadioDelegate.qml @@ -76,8 +76,8 @@ T.RadioDelegate { //! [background] background: Rectangle { - visible: control.pressed || control.highlighted - color: control.pressed ? control.Material.flatButtonPressColor : control.Material.listHighlightColor + visible: control.down || control.highlighted + color: control.down ? control.Material.flatButtonPressColor : control.Material.listHighlightColor } //! [background] } diff --git a/src/imports/controls/material/RadioIndicator.qml b/src/imports/controls/material/RadioIndicator.qml index 5ad92c3d21..27ab8d9a07 100644 --- a/src/imports/controls/material/RadioIndicator.qml +++ b/src/imports/controls/material/RadioIndicator.qml @@ -43,7 +43,7 @@ Rectangle { implicitHeight: 20 radius: width / 2 border.width: 2 - border.color: control.checked || control.pressed ? control.Material.accentColor : control.Material.secondaryTextColor + border.color: control.checked || control.down ? control.Material.accentColor : control.Material.secondaryTextColor color: "transparent" property alias control: ripple.control @@ -54,7 +54,7 @@ Rectangle { height: width control: control colored: control.checked - opacity: control.pressed || control.activeFocus ? 1 : 0 + opacity: control.down || control.activeFocus ? 1 : 0 } Rectangle { @@ -64,6 +64,6 @@ Rectangle { height: 10 radius: width / 2 color: parent.border.color - visible: control.checked || control.pressed + visible: control.checked || control.down } } diff --git a/src/imports/controls/material/SwipeDelegate.qml b/src/imports/controls/material/SwipeDelegate.qml index cb114bfcd4..c4bacc1010 100644 --- a/src/imports/controls/material/SwipeDelegate.qml +++ b/src/imports/controls/material/SwipeDelegate.qml @@ -66,7 +66,7 @@ T.SwipeDelegate { verticalAlignment: Text.AlignVCenter Behavior on x { - enabled: !control.pressed + enabled: !control.down NumberAnimation { easing.type: Easing.InOutCubic duration: 400 @@ -78,11 +78,11 @@ T.SwipeDelegate { //! [background] background: Rectangle { color: !control.enabled ? control.Material.swipeDelegateDisabledColor : - (control.pressed ? control.Material.swipeDelegatePressColor : + (control.down ? control.Material.swipeDelegatePressColor : (control.activeKeyFocus || control.hovered ? control.Material.swipeDelegateHoverColor : control.Material.swipeDelegateColor)) Behavior on x { - enabled: !control.pressed + enabled: !control.down NumberAnimation { easing.type: Easing.InOutCubic duration: 400 diff --git a/src/imports/controls/material/TabButton.qml b/src/imports/controls/material/TabButton.qml index 63728d2d23..70efc0ffa7 100644 --- a/src/imports/controls/material/TabButton.qml +++ b/src/imports/controls/material/TabButton.qml @@ -54,7 +54,7 @@ T.TabButton { text: control.text font: control.font elide: Text.ElideRight - color: !control.enabled ? control.Material.hintTextColor : control.pressed || control.checked ? control.Material.accentColor : control.Material.primaryTextColor + color: !control.enabled ? control.Material.hintTextColor : control.down || control.checked ? control.Material.accentColor : control.Material.primaryTextColor horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter } diff --git a/src/imports/controls/material/ToolButton.qml b/src/imports/controls/material/ToolButton.qml index 53da907787..e3a1d740ae 100644 --- a/src/imports/controls/material/ToolButton.qml +++ b/src/imports/controls/material/ToolButton.qml @@ -65,8 +65,8 @@ T.ToolButton { implicitWidth: 48 implicitHeight: 48 - color: control.pressed ? control.Material.flatButtonPressColor : control.Material.flatButtonFocusColor - visible: control.enabled && (control.pressed || control.activeKeyFocus || control.checked || control.highlighted) + color: control.down ? control.Material.flatButtonPressColor : control.Material.flatButtonFocusColor + visible: control.enabled && (control.down || control.activeKeyFocus || control.checked || control.highlighted) } //! [background] } diff --git a/src/imports/controls/universal/Button.qml b/src/imports/controls/universal/Button.qml index cd0d93109a..d0dbcf99f9 100644 --- a/src/imports/controls/universal/Button.qml +++ b/src/imports/controls/universal/Button.qml @@ -71,7 +71,7 @@ T.Button { implicitWidth: 32 implicitHeight: 32 - color: control.pressed ? control.Universal.baseMediumLowColor : + color: control.down ? control.Universal.baseMediumLowColor : control.enabled && (control.highlighted || control.checked) ? control.Universal.accent : control.Universal.baseLowColor } diff --git a/src/imports/controls/universal/CheckDelegate.qml b/src/imports/controls/universal/CheckDelegate.qml index 186f904831..91f57b248a 100644 --- a/src/imports/controls/universal/CheckDelegate.qml +++ b/src/imports/controls/universal/CheckDelegate.qml @@ -81,8 +81,8 @@ T.CheckDelegate { //! [background] background: Rectangle { - visible: control.pressed || control.highlighted || control.activeFocus - color: control.pressed ? control.Universal.listMediumColor : control.Universal.altMediumLowColor + visible: control.down || control.highlighted || control.activeFocus + color: control.down ? control.Universal.listMediumColor : control.Universal.altMediumLowColor Rectangle { width: parent.width height: parent.height diff --git a/src/imports/controls/universal/CheckIndicator.qml b/src/imports/controls/universal/CheckIndicator.qml index f0858a214b..4795ccce80 100644 --- a/src/imports/controls/universal/CheckIndicator.qml +++ b/src/imports/controls/universal/CheckIndicator.qml @@ -43,10 +43,10 @@ Rectangle { implicitHeight: 20 color: !control.enabled ? "transparent" : - control.pressed && control.checkState !== Qt.PartiallyChecked ? control.Universal.baseMediumColor : + control.down && control.checkState !== Qt.PartiallyChecked ? control.Universal.baseMediumColor : control.checkState === Qt.Checked ? control.Universal.accent : "transparent" border.color: !control.enabled ? control.Universal.baseLowColor : - control.pressed ? control.Universal.baseMediumColor : + control.down ? control.Universal.baseMediumColor : control.checked ? control.Universal.accent : control.Universal.baseMediumHighColor border.width: 2 // CheckBoxBorderThemeThickness @@ -68,6 +68,6 @@ Rectangle { visible: control.checkState === Qt.PartiallyChecked color: !control.enabled ? control.Universal.baseLowColor : - control.pressed ? control.Universal.baseMediumColor : control.Universal.baseMediumHighColor + control.down ? control.Universal.baseMediumColor : control.Universal.baseMediumHighColor } } diff --git a/src/imports/controls/universal/ComboBox.qml b/src/imports/controls/universal/ComboBox.qml index 233dc0b056..01ee088387 100644 --- a/src/imports/controls/universal/ComboBox.qml +++ b/src/imports/controls/universal/ComboBox.qml @@ -60,7 +60,7 @@ T.ComboBox { width: control.width text: control.textRole ? (Array.isArray(control.model) ? modelData[control.textRole] : model[control.textRole]) : modelData highlighted: control.highlightedIndex === index - pressed: highlighted && control.pressed + down: highlighted && control.down } //! [delegate] @@ -83,9 +83,9 @@ T.ComboBox { border.width: 2 // ComboBoxBorderThemeThickness border.color: !control.enabled ? control.Universal.baseLowColor : - control.pressed || popup.visible ? control.Universal.baseMediumLowColor : control.Universal.baseMediumLowColor + control.down || popup.visible ? control.Universal.baseMediumLowColor : control.Universal.baseMediumLowColor color: !control.enabled ? control.Universal.baseLowColor : - control.pressed || popup.visible ? control.Universal.listMediumColor : control.Universal.altMediumLowColor + control.down || popup.visible ? control.Universal.listMediumColor : control.Universal.altMediumLowColor Rectangle { x: 2 diff --git a/src/imports/controls/universal/Dial.qml b/src/imports/controls/universal/Dial.qml index cfb325b33b..a55bc19f3d 100644 --- a/src/imports/controls/universal/Dial.qml +++ b/src/imports/controls/universal/Dial.qml @@ -67,7 +67,7 @@ T.Dial { radius: width / 2 color: !control.enabled ? control.Universal.baseLowColor : - control.pressed ? control.Universal.baseMediumColor : control.Universal.baseMediumHighColor + control.down ? control.Universal.baseMediumColor : control.Universal.baseMediumHighColor transform: [ Translate { diff --git a/src/imports/controls/universal/ItemDelegate.qml b/src/imports/controls/universal/ItemDelegate.qml index e01f03682d..7066bb3e97 100644 --- a/src/imports/controls/universal/ItemDelegate.qml +++ b/src/imports/controls/universal/ItemDelegate.qml @@ -73,8 +73,8 @@ T.ItemDelegate { //! [background] background: Rectangle { - visible: control.pressed || control.highlighted || control.activeKeyFocus - color: control.pressed ? control.Universal.listMediumColor : control.Universal.altMediumLowColor + visible: control.down || control.highlighted || control.activeKeyFocus + color: control.down ? control.Universal.listMediumColor : control.Universal.altMediumLowColor Rectangle { width: parent.width height: parent.height diff --git a/src/imports/controls/universal/MenuItem.qml b/src/imports/controls/universal/MenuItem.qml index dbc41eec8c..aef20ff996 100644 --- a/src/imports/controls/universal/MenuItem.qml +++ b/src/imports/controls/universal/MenuItem.qml @@ -75,7 +75,7 @@ T.MenuItem { y: control.topPadding + (control.availableHeight - height) / 2 visible: control.checked - source: !control.checkable ? "" : "image://universal/checkmark/" + (!control.enabled ? control.Universal.baseLowColor : control.pressed ? control.Universal.baseHighColor : control.Universal.baseMediumHighColor) + source: !control.checkable ? "" : "image://universal/checkmark/" + (!control.enabled ? control.Universal.baseLowColor : control.down ? control.Universal.baseHighColor : control.Universal.baseMediumHighColor) } //! [indicator] @@ -85,7 +85,7 @@ T.MenuItem { implicitHeight: 40 color: !control.enabled ? control.Universal.baseLowColor : - control.pressed ? control.Universal.listMediumColor : control.Universal.altMediumLowColor + control.down ? control.Universal.listMediumColor : control.Universal.altMediumLowColor Rectangle { x: 1; y: 1 diff --git a/src/imports/controls/universal/RadioDelegate.qml b/src/imports/controls/universal/RadioDelegate.qml index 623e7e130f..3ea375559f 100644 --- a/src/imports/controls/universal/RadioDelegate.qml +++ b/src/imports/controls/universal/RadioDelegate.qml @@ -83,8 +83,8 @@ T.RadioDelegate { //! [background] background: Rectangle { - visible: control.pressed || control.highlighted || control.activeFocus - color: control.pressed ? control.Universal.listMediumColor : control.Universal.altMediumLowColor + visible: control.down || control.highlighted || control.activeFocus + color: control.down ? control.Universal.listMediumColor : control.Universal.altMediumLowColor Rectangle { width: parent.width height: parent.height diff --git a/src/imports/controls/universal/RadioIndicator.qml b/src/imports/controls/universal/RadioIndicator.qml index d107da96a4..3fd74cbfe0 100644 --- a/src/imports/controls/universal/RadioIndicator.qml +++ b/src/imports/controls/universal/RadioIndicator.qml @@ -45,7 +45,7 @@ Rectangle { border.width: 2 // RadioButtonBorderThemeThickness border.color: control.checked ? "transparent" : !control.enabled ? control.Universal.baseLowColor : - control.pressed ? control.Universal.baseMediumColor : control.Universal.baseMediumHighColor + control.down ? control.Universal.baseMediumColor : control.Universal.baseMediumHighColor property var control @@ -59,7 +59,7 @@ Rectangle { color: "transparent" border.width: 2 // RadioButtonBorderThemeThickness border.color: !control.enabled ? control.Universal.baseLowColor : - control.pressed ? control.Universal.baseMediumColor : control.Universal.accent + control.down ? control.Universal.baseMediumColor : control.Universal.accent } Rectangle { @@ -72,6 +72,6 @@ Rectangle { radius: width / 2 opacity: control.checked ? 1 : 0 color: !control.enabled ? control.Universal.baseLowColor : - control.pressed ? control.Universal.baseMediumColor : control.Universal.baseMediumHighColor + control.down ? control.Universal.baseMediumColor : control.Universal.baseMediumHighColor } } diff --git a/src/imports/controls/universal/SwipeDelegate.qml b/src/imports/controls/universal/SwipeDelegate.qml index 1bcfe083b9..eace3045b3 100644 --- a/src/imports/controls/universal/SwipeDelegate.qml +++ b/src/imports/controls/universal/SwipeDelegate.qml @@ -71,7 +71,7 @@ T.SwipeDelegate { color: !control.enabled ? control.Universal.baseLowColor : control.Universal.baseHighColor Behavior on x { - enabled: !control.pressed + enabled: !control.down NumberAnimation { easing.type: Easing.InOutCubic duration: 400 @@ -83,7 +83,7 @@ T.SwipeDelegate { //! [background] background: Rectangle { color: !control.enabled ? control.Universal.chromeDisabledHighColor : - (control.pressed ? control.Universal.chromeHighColor : + (control.down ? control.Universal.chromeHighColor : (control.activeKeyFocus || control.hovered ? control.Universal.chromeLowColor : control.Universal.chromeMediumColor)) Rectangle { @@ -95,7 +95,7 @@ T.SwipeDelegate { } Behavior on x { - enabled: !control.pressed + enabled: !control.down NumberAnimation { easing.type: Easing.InOutCubic duration: 400 diff --git a/src/imports/controls/universal/TabButton.qml b/src/imports/controls/universal/TabButton.qml index 16ee8fecbd..149de82c44 100644 --- a/src/imports/controls/universal/TabButton.qml +++ b/src/imports/controls/universal/TabButton.qml @@ -54,7 +54,7 @@ T.TabButton { text: control.text font: control.font elide: Text.ElideRight - color: control.checked || control.pressed ? control.Universal.baseHighColor : control.Universal.baseLowColor + color: control.checked || control.down ? control.Universal.baseHighColor : control.Universal.baseLowColor horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter } diff --git a/src/imports/controls/universal/ToolButton.qml b/src/imports/controls/universal/ToolButton.qml index 06eecf178b..14d2d9232b 100644 --- a/src/imports/controls/universal/ToolButton.qml +++ b/src/imports/controls/universal/ToolButton.qml @@ -67,7 +67,7 @@ T.ToolButton { implicitWidth: 68 implicitHeight: 48 // AppBarThemeCompactHeight - color: control.pressed ? control.Universal.listMediumColor : + color: control.down ? control.Universal.listMediumColor : control.enabled && (control.highlighted || control.checked) ? control.Universal.accent : "transparent" } //! [background] diff --git a/src/quicktemplates2/qquickabstractbutton.cpp b/src/quicktemplates2/qquickabstractbutton.cpp index fdcc6fc0b2..ec6b3d639d 100644 --- a/src/quicktemplates2/qquickabstractbutton.cpp +++ b/src/quicktemplates2/qquickabstractbutton.cpp @@ -106,7 +106,8 @@ static const int AUTO_REPEAT_INTERVAL = 100; */ QQuickAbstractButtonPrivate::QQuickAbstractButtonPrivate() : - pressed(false), checked(false), checkable(false), highlighted(false), autoExclusive(false), autoRepeat(false), wasHeld(false), + down(false), explicitDown(false), pressed(false), checked(false), checkable(false), + highlighted(false), autoExclusive(false), autoRepeat(false), wasHeld(false), holdTimer(0), delayTimer(0), repeatTimer(0), repeatButton(Qt::NoButton), indicator(nullptr), group(nullptr) { } @@ -256,9 +257,51 @@ void QQuickAbstractButton::setText(const QString &text) } /*! - \qmlproperty bool Qt.labs.controls::AbstractButton::pressed + \qmlproperty bool Qt.labs.controls::AbstractButton::down - This property holds whether the button is pressed. + This property holds whether the button is visually down. + + Unless explicitly set, this property follows the value of \l pressed. To + return to the default value, set this property to \c undefined. + + \sa pressed +*/ +bool QQuickAbstractButton::isDown() const +{ + Q_D(const QQuickAbstractButton); + return d->down; +} + +void QQuickAbstractButton::setDown(bool down) +{ + Q_D(QQuickAbstractButton); + d->explicitDown = true; + + if (d->down == down) + return; + + d->down = down; + emit downChanged(); +} + +void QQuickAbstractButton::resetDown() +{ + Q_D(QQuickAbstractButton); + if (!d->explicitDown) + return; + + setDown(d->pressed); + d->explicitDown = false; +} + +/*! + \qmlproperty bool Qt.labs.controls::AbstractButton::pressed + \readonly + + This property holds whether the button is physically pressed. A button can + be pressed by either touch or key events. + + \sa down */ bool QQuickAbstractButton::isPressed() const { @@ -275,6 +318,11 @@ void QQuickAbstractButton::setPressed(bool isPressed) d->pressed = isPressed; setAccessibleProperty("pressed", isPressed); emit pressedChanged(); + + if (!d->explicitDown) { + setDown(d->pressed); + d->explicitDown = false; + } } /*! diff --git a/src/quicktemplates2/qquickabstractbutton_p.h b/src/quicktemplates2/qquickabstractbutton_p.h index 49de79daad..c8e6931f0a 100644 --- a/src/quicktemplates2/qquickabstractbutton_p.h +++ b/src/quicktemplates2/qquickabstractbutton_p.h @@ -58,7 +58,8 @@ class Q_QUICKTEMPLATES2_EXPORT QQuickAbstractButton : public QQuickControl { Q_OBJECT Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged FINAL) - Q_PROPERTY(bool pressed READ isPressed WRITE setPressed NOTIFY pressedChanged FINAL) + Q_PROPERTY(bool down READ isDown WRITE setDown NOTIFY downChanged RESET resetDown FINAL) + Q_PROPERTY(bool pressed READ isPressed NOTIFY pressedChanged FINAL) Q_PROPERTY(bool checked READ isChecked WRITE setChecked NOTIFY checkedChanged FINAL) Q_PROPERTY(bool highlighted READ isHighlighted WRITE setHighlighted NOTIFY highlightedChanged FINAL) Q_PROPERTY(bool autoExclusive READ autoExclusive WRITE setAutoExclusive NOTIFY autoExclusiveChanged FINAL) @@ -72,6 +73,10 @@ public: QString text() const; void setText(const QString &text); + bool isDown() const; + void setDown(bool down); + void resetDown(); + bool isPressed() const; void setPressed(bool pressed); @@ -104,6 +109,7 @@ Q_SIGNALS: void pressAndHold(); void doubleClicked(); void textChanged(); + void downChanged(); void pressedChanged(); void checkedChanged(); void highlightedChanged(); diff --git a/src/quicktemplates2/qquickabstractbutton_p_p.h b/src/quicktemplates2/qquickabstractbutton_p_p.h index 23e0b52c79..7aa2c0283f 100644 --- a/src/quicktemplates2/qquickabstractbutton_p_p.h +++ b/src/quicktemplates2/qquickabstractbutton_p_p.h @@ -79,6 +79,8 @@ public: QList findExclusiveButtons() const; QString text; + bool down; + bool explicitDown; bool pressed; bool checked; bool checkable; diff --git a/src/quicktemplates2/qquickcombobox.cpp b/src/quicktemplates2/qquickcombobox.cpp index e10a8b480f..ec75c053d4 100644 --- a/src/quicktemplates2/qquickcombobox.cpp +++ b/src/quicktemplates2/qquickcombobox.cpp @@ -112,6 +112,7 @@ QT_BEGIN_NAMESPACE */ /*! + \readonly \qmlsignal void Qt.labs.controls::ComboBox::highlighted(int index) This signal is emitted when the item at \a index in the popup list is highlighted by the user. @@ -450,7 +451,6 @@ void QQuickComboBox::setPressed(bool pressed) } /*! - \readonly \qmlproperty int Qt.labs.controls::ComboBox::highlightedIndex This property holds the index of the highlighted item in the combo box popup list. diff --git a/tests/auto/controls/data/tst_button.qml b/tests/auto/controls/data/tst_button.qml index 060389940b..4831bdd645 100644 --- a/tests/auto/controls/data/tst_button.qml +++ b/tests/auto/controls/data/tst_button.qml @@ -57,7 +57,7 @@ TestCase { property SignalSequenceSpy spy: SignalSequenceSpy { target: control - signals: ["pressed", "released", "canceled", "clicked", "doubleClicked", "pressedChanged", "checkedChanged"] + signals: ["pressed", "released", "canceled", "clicked", "doubleClicked", "pressedChanged", "downChanged", "checkedChanged"] } } } @@ -80,12 +80,15 @@ TestCase { verify(control) // click - control.spy.expectedSequence = [["pressedChanged", { "pressed": true }], "pressed"] + control.spy.expectedSequence = [["pressedChanged", { "pressed": true }], + ["downChanged", { "down": true }], + "pressed"] mousePress(control, control.width / 2, control.height / 2, Qt.LeftButton) compare(control.pressed, true) verify(control.spy.success) control.spy.expectedSequence = [["pressedChanged", { "pressed": false }], + ["downChanged", { "down": false }], "released", "clicked"] mouseRelease(control, control.width / 2, control.height / 2, Qt.LeftButton) @@ -93,12 +96,15 @@ TestCase { verify(control.spy.success) // release outside - control.spy.expectedSequence = [["pressedChanged", { "pressed": true }], "pressed"] + control.spy.expectedSequence = [["pressedChanged", { "pressed": true }], + ["downChanged", { "down": true }], + "pressed"] mousePress(control, control.width / 2, control.height / 2, Qt.LeftButton) compare(control.pressed, true) verify(control.spy.success) - control.spy.expectedSequence = [["pressedChanged", { "pressed": false }]] + control.spy.expectedSequence = [["pressedChanged", { "pressed": false }], + ["downChanged", { "down": false }]] mouseMove(control, control.width * 2, control.height * 2, 0, Qt.LeftButton) compare(control.pressed, false) verify(control.spy.success) @@ -119,14 +125,18 @@ TestCase { // double click control.spy.expectedSequence = [["pressedChanged", { "pressed": true }], + ["downChanged", { "down": true }], "pressed", ["pressedChanged", { "pressed": false }], + ["downChanged", { "down": false }], "released", "clicked", ["pressedChanged", { "pressed": true }], + ["downChanged", { "down": true }], "pressed", "doubleClicked", ["pressedChanged", { "pressed": false }], + ["downChanged", { "down": false }], "released", "clicked"] mouseDoubleClickSequence(control, control.width / 2, control.height / 2, Qt.LeftButton) @@ -144,8 +154,10 @@ TestCase { // click control.spy.expectedSequence = [["pressedChanged", { "pressed": true }], + ["downChanged", { "down": true }], "pressed", ["pressedChanged", { "pressed": false }], + ["downChanged", { "down": false }], "released", "clicked"] keyClick(Qt.Key_Space) @@ -185,6 +197,7 @@ TestCase { var repeatCount = 2 var repeatSequence = [["pressedChanged", { "pressed": true }], + ["downChanged", { "down": true }], "pressed", "released", "clicked", @@ -201,6 +214,7 @@ TestCase { verify(control.spy.success) control.spy.expectedSequence = [["pressedChanged", { "pressed": false }], + ["downChanged", { "down": false }], "released", "clicked"] mouseRelease(control) @@ -216,6 +230,7 @@ TestCase { verify(control.spy.success) control.spy.expectedSequence = [["pressedChanged", { "pressed": false }], + ["downChanged", { "down": false }], "released", "clicked"] keyRelease(Qt.Key_Space) diff --git a/tests/auto/controls/data/tst_combobox.qml b/tests/auto/controls/data/tst_combobox.qml index 24df675eba..6af82dc525 100644 --- a/tests/auto/controls/data/tst_combobox.qml +++ b/tests/auto/controls/data/tst_combobox.qml @@ -644,7 +644,7 @@ TestCase { autoExclusive: true checked: _combobox.currentIndex === index highlighted: _combobox.highlightedIndex === index - pressed: highlighted && _combobox.pressed + down: highlighted && _combobox.pressed } } } diff --git a/tests/auto/controls/data/tst_toolbutton.qml b/tests/auto/controls/data/tst_toolbutton.qml index 6c03f18c96..ddabb0fc97 100644 --- a/tests/auto/controls/data/tst_toolbutton.qml +++ b/tests/auto/controls/data/tst_toolbutton.qml @@ -55,6 +55,11 @@ TestCase { signalName: "pressedChanged" } + SignalSpy { + id: downSpy + signalName: "downChanged" + } + SignalSpy { id: clickedSpy signalName: "clicked" @@ -97,47 +102,66 @@ TestCase { verify(control) pressedSpy.target = control + downSpy.target = control clickedSpy.target = control verify(pressedSpy.valid) + verify(downSpy.valid) verify(clickedSpy.valid) // check mousePress(control, control.width / 2, control.height / 2, Qt.LeftToolButton) compare(pressedSpy.count, 1) + compare(downSpy.count, 1) compare(control.pressed, true) + compare(control.down, true) mouseRelease(control, control.width / 2, control.height / 2, Qt.LeftToolButton) compare(clickedSpy.count, 1) compare(pressedSpy.count, 2) + compare(downSpy.count, 2) compare(control.pressed, false) + compare(control.down, false) // uncheck mousePress(control, control.width / 2, control.height / 2, Qt.LeftToolButton) compare(pressedSpy.count, 3) + compare(downSpy.count, 3) compare(control.pressed, true) + compare(control.down, true) mouseRelease(control, control.width / 2, control.height / 2, Qt.LeftToolButton) compare(clickedSpy.count, 2) compare(pressedSpy.count, 4) + compare(downSpy.count, 4) compare(control.pressed, false) + compare(control.down, false) // release outside mousePress(control, control.width / 2, control.height / 2, Qt.LeftToolButton) compare(pressedSpy.count, 5) + compare(downSpy.count, 5) compare(control.pressed, true) + compare(control.down, true) mouseMove(control, control.width * 2, control.height * 2, 0, Qt.LeftToolButton) compare(control.pressed, false) + compare(control.down, false) mouseRelease(control, control.width * 2, control.height * 2, Qt.LeftToolButton) compare(clickedSpy.count, 2) compare(pressedSpy.count, 6) + compare(downSpy.count, 6) compare(control.pressed, false) + compare(control.down, false) // right button mousePress(control, control.width / 2, control.height / 2, Qt.RightButton) compare(pressedSpy.count, 6) + compare(downSpy.count, 6) compare(control.pressed, false) + compare(control.down, false) mouseRelease(control, control.width / 2, control.height / 2, Qt.RightButton) compare(clickedSpy.count, 2) compare(pressedSpy.count, 6) + compare(downSpy.count, 6) compare(control.pressed, false) + compare(control.down, false) control.destroy() } diff --git a/tests/manual/testbench/main.qml b/tests/manual/testbench/main.qml index 76d945ba45..8d0fe7a7df 100644 --- a/tests/manual/testbench/main.qml +++ b/tests/manual/testbench/main.qml @@ -96,7 +96,7 @@ ApplicationWindow { } ToolButton { text: "Pressed" - pressed: true + down: true hoverEnabled: true ToolTip.text: text ToolTip.delay: 1000 @@ -141,7 +141,7 @@ ApplicationWindow { } TabButton { text: "Pressed" - pressed: true + down: true } TabButton { text: "Disabled" @@ -169,7 +169,7 @@ ApplicationWindow { } Button { text: "Pressed" - pressed: true + down: true } Button { text: "Checked" @@ -178,7 +178,7 @@ ApplicationWindow { Button { text: "CH + PR" checked: true - pressed: true + down: true } Button { text: "Disabled" @@ -201,7 +201,7 @@ ApplicationWindow { Button { text: "HI + PR" highlighted: true - pressed: true + down: true } Button { text: "HI + CH" @@ -211,7 +211,7 @@ ApplicationWindow { Button { text: "HI+CH+PR" highlighted: true - pressed: true + down: true checked: true } Button { @@ -233,7 +233,7 @@ ApplicationWindow { } CheckBox { text: "Pressed" - pressed: true + down: true } CheckBox { text: "Checked" @@ -242,7 +242,7 @@ ApplicationWindow { CheckBox { text: "CH + PR" checked: true - pressed: true + down: true } CheckBox { text: "Disabled" @@ -261,7 +261,7 @@ ApplicationWindow { } RadioButton { text: "Pressed" - pressed: true + down: true } RadioButton { text: "Checked" @@ -270,7 +270,7 @@ ApplicationWindow { RadioButton { text: "CH + PR" checked: true - pressed: true + down: true } RadioButton { text: "Disabled" @@ -289,7 +289,7 @@ ApplicationWindow { } Switch { text: "Pressed" - pressed: true + down: true } Switch { text: "Checked" @@ -298,7 +298,7 @@ ApplicationWindow { Switch { text: "CH + PR" checked: true - pressed: true + down: true } Switch { text: "Disabled" @@ -452,7 +452,7 @@ ApplicationWindow { implicitHeight: normalComboBox.implicitHeight ComboBox { - pressed: true + down: true model: ListModel { ListElement { text: "Pressed" } }