diff options
-rw-r--r-- | examples/quick/controls/touch/content/ButtonPage.qml | 60 | ||||
-rw-r--r-- | src/controls/Styles/Base/SwitchStyle.qml | 162 | ||||
-rw-r--r-- | src/controls/Styles/Desktop/SwitchStyle.qml | 46 | ||||
-rw-r--r-- | src/controls/Styles/qmldir | 1 | ||||
-rw-r--r-- | src/controls/Styles/styles.pri | 2 | ||||
-rw-r--r-- | src/controls/Switch.qml | 153 | ||||
-rw-r--r-- | src/controls/controls.pro | 1 | ||||
-rw-r--r-- | src/controls/plugin.cpp | 1 | ||||
-rw-r--r-- | tests/auto/controls/controls.pro | 1 | ||||
-rw-r--r-- | tests/auto/controls/data/tst_switch.qml | 257 |
10 files changed, 682 insertions, 2 deletions
diff --git a/examples/quick/controls/touch/content/ButtonPage.qml b/examples/quick/controls/touch/content/ButtonPage.qml index 95b99a83..8cf1dad5 100644 --- a/examples/quick/controls/touch/content/ButtonPage.qml +++ b/examples/quick/controls/touch/content/ButtonPage.qml @@ -71,13 +71,11 @@ Item { anchors.centerIn: parent Button { - anchors.margins: 20 text: "Press me" style: touchStyle } Button { - anchors.margins: 20 style: touchStyle text: "Press me too" } @@ -89,6 +87,16 @@ Item { onClicked: if (stackView) stackView.pop() } + Row { + spacing: 20 + Switch { + style: switchStyle + } + Switch { + style: switchStyle + } + } + } Component { @@ -117,4 +125,52 @@ Item { } } } + + Component { + id: switchStyle + SwitchStyle { + + groove: Rectangle { + implicitHeight: 50 + implicitWidth: 152 + Rectangle { + anchors.top: parent.top + anchors.left: parent.left + anchors.bottom: parent.bottom + width: parent.width/2 - 2 + height: 20 + anchors.margins: 2 + color: control.checked ? "#468bb7" : "#222" + Behavior on color {ColorAnimation {}} + Text { + font.pixelSize: 23 + color: "white" + anchors.centerIn: parent + text: "ON" + } + } + Item { + width: parent.width/2 + height: parent.height + anchors.right: parent.right + Text { + font.pixelSize: 23 + color: "white" + anchors.centerIn: parent + text: "OFF" + } + } + color: "#222" + border.color: "#444" + border.width: 2 + } + handle: Rectangle { + width: parent.parent.width/2 + height: control.height + color: "#444" + border.color: "#555" + border.width: 2 + } + } + } } diff --git a/src/controls/Styles/Base/SwitchStyle.qml b/src/controls/Styles/Base/SwitchStyle.qml new file mode 100644 index 00000000..a17fb505 --- /dev/null +++ b/src/controls/Styles/Base/SwitchStyle.qml @@ -0,0 +1,162 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Quick Controls module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.2 +import QtQuick.Controls 1.1 +import QtQuick.Controls.Private 1.0 + +/*! + \qmltype SwitchStyle + \inqmlmodule QtQuick.Controls.Styles + \since QtQuick.Controls.Styles 1.1 + \ingroup controlsstyling + \brief Provides custom styling for Switch + + Example: + \qml + Switch { + style: SwitchStyle { + groove: Rectangle { + implicitWidth: 100 + implicitHeight: 20 + radius: 9 + border.color: control.activeFocus ? "darkblue" : "gray" + border.width: 1 + } + } + } + \endqml +*/ +Style { + id: switchstyle + + /*! The content padding. */ + padding { + top: 0 + left: 0 + right: 0 + bottom: 0 + } + + /*! This defines the switch handle. */ + property Component handle: Rectangle { + implicitWidth: 32 + implicitHeight: 18 + + border.color: control.activeFocus ? Qt.darker(__syspal.highlight, 2) : Qt.darker(__syspal.button, 2) + property color bg: control.activeFocus ? Qt.darker(__syspal.highlight, 1.2) : __syspal.button + gradient: Gradient { + GradientStop {color: Qt.lighter(bg, 1.4) ; position: 0} + GradientStop {color: bg ; position: 1} + } + + radius: 2 + } + + /*! This property holds the background groove of the switch. */ + property Component groove: Rectangle { + property color shadow: control.checked ? Qt.darker(__syspal.highlight, 1.2): "#999" + property color bg: control.checked ? __syspal.highlight:"#bbb" + + implicitWidth: 60 + implicitHeight: 18 + + border.color: "gray" + color: "red" + + radius: 2 + Behavior on shadow {ColorAnimation{ duration: 80 }} + Behavior on bg {ColorAnimation{ duration: 80 }} + gradient: Gradient { + GradientStop {color: shadow; position: 0} + GradientStop {color: bg ; position: 0.2} + GradientStop {color: bg ; position: 1} + } + Rectangle { + color: "#44ffffff" + height: 1 + anchors.bottom: parent.bottom + anchors.bottomMargin: -1 + width: parent.width - 2 + x: 1 + } + } + + /*! \internal */ + property Component panel: Item { + + implicitWidth: Math.round(grooveLoader.width + padding.left + padding.right) + implicitHeight: grooveLoader.implicitHeight + padding.top + padding.bottom + + property var __groove: grooveLoader + property var __handle: handleLoader + property bool enableAnimation: false + + Loader { + id: grooveLoader + y: padding.top + x: padding.left + + sourceComponent: groove + anchors.verticalCenter: parent.verticalCenter + + + Loader { + id: handleLoader + + z:1 + anchors.top: grooveLoader.top + anchors.bottom: grooveLoader.bottom + anchors.topMargin: padding.top + anchors.bottomMargin: padding.bottom + + Behavior on x { + id: behavior + enabled: enableAnimation + NumberAnimation { + duration: 150 + easing.type: Easing.OutCubic + } + } + + sourceComponent: handle + } + } + } +} diff --git a/src/controls/Styles/Desktop/SwitchStyle.qml b/src/controls/Styles/Desktop/SwitchStyle.qml new file mode 100644 index 00000000..df9dd5bf --- /dev/null +++ b/src/controls/Styles/Desktop/SwitchStyle.qml @@ -0,0 +1,46 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Quick Controls module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.1 +import QtQuick.Controls 1.1 +import QtQuick.Controls.Private 1.0 +import QtQuick.Controls.Styles 1.1 + +SwitchStyle { +} diff --git a/src/controls/Styles/qmldir b/src/controls/Styles/qmldir index f291f3ff..1688f662 100644 --- a/src/controls/Styles/qmldir +++ b/src/controls/Styles/qmldir @@ -8,6 +8,7 @@ RadioButtonStyle 1.0 Base/RadioButtonStyle.qml ScrollViewStyle 1.0 Base/ScrollViewStyle.qml SliderStyle 1.0 Base/SliderStyle.qml SpinBoxStyle 1.1 Base/SpinBoxStyle.qml +SwitchStyle 1.1 Base/SwitchStyle.qml TabViewStyle 1.0 Base/TabViewStyle.qml TableViewStyle 1.0 Base/TableViewStyle.qml TextFieldStyle 1.0 Base/TextFieldStyle.qml diff --git a/src/controls/Styles/styles.pri b/src/controls/Styles/styles.pri index 9cdd9c95..77f99892 100644 --- a/src/controls/Styles/styles.pri +++ b/src/controls/Styles/styles.pri @@ -14,6 +14,7 @@ STYLES_QML_FILES = \ $$PWD/Base/ScrollViewStyle.qml\ $$PWD/Base/SliderStyle.qml \ $$PWD/Base/SpinBoxStyle.qml \ + $$PWD/Base/SwitchStyle.qml \ $$PWD/Base/StatusBarStyle.qml \ $$PWD/Base/TableViewStyle.qml \ $$PWD/Base/TabViewStyle.qml \ @@ -36,6 +37,7 @@ STYLES_QML_FILES += \ $$PWD/Desktop/ScrollViewStyle.qml \ $$PWD/Desktop/SliderStyle.qml \ $$PWD/Desktop/SpinBoxStyle.qml \ + $$PWD/Desktop/SwitchStyle.qml \ $$PWD/Desktop/StatusBarStyle.qml\ $$PWD/Desktop/TabViewStyle.qml \ $$PWD/Desktop/TableViewStyle.qml \ diff --git a/src/controls/Switch.qml b/src/controls/Switch.qml new file mode 100644 index 00000000..87cdc0c3 --- /dev/null +++ b/src/controls/Switch.qml @@ -0,0 +1,153 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Quick Controls module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.1 +import QtQuick.Controls 1.1 +import QtQuick.Controls.Private 1.0 + +/*! + \qmltype Switch + \inqmlmodule QtQuick.Controls + \since QtQuick.Controls 1.1 + \ingroup controls + \brief A switch. + + A Switch is an option button that can be switched on (checked) or off + (unchecked). Switches are typically used to represent features in an + application that can be enabled or disabled without affecting others. + + On mobile platforms, switches are commonly used to enable or disable + features. + + \qml + Column { + Switch { checked: true } + Switch { checked: false } + } + \endqml + + You can create a custom appearance for a Switch by + assigning a \l SwitchStyle. +*/ + +Control { + id: root + + /*! + This property is \c true if the control is checked. + The default value is \c false. + */ + property bool checked: false + + /*! + This property is \c true if the control takes the focus when it is + pressed; \l{QQuickItem::forceActiveFocus()}{forceActiveFocus()} will be + called on the control. + */ + property bool activeFocusOnPress: false + + /*! + This property stores the ExclusiveGroup that the control belongs to. + */ + property ExclusiveGroup exclusiveGroup: null + + Keys.onPressed: { + if (event.key === Qt.Key_Space && !event.isAutoRepeat) + checked = !checked; + } + + /*! \internal */ + onExclusiveGroupChanged: { + if (exclusiveGroup) + exclusiveGroup.bindCheckable(root) + } + + MouseArea { + id: internal + + property Item handle: __panel ? __panel.__handle : null + property int min: __style ? __style.padding.left : 0 + property int max: handle.parent.width - (handle ? handle.width : 0) - + ( __style ? __style.padding.right : 0) + focus: true + anchors.fill: parent + drag.threshold: 0 + drag.target: handle + drag.axis: Drag.XAxis + drag.minimumX: min + drag.maximumX: max + + onPressed: { + if (activeFocusOnPress) + root.forceActiveFocus() + } + + onReleased: { + if (drag.active) { + checked = (handle.x < max/2) ? false : true; + internal.handle.x = checked ? internal.max : internal.min + } else { + checked = (handle.x === max) ? false : true + } + } + } + + Component.onCompleted: { + internal.handle.x = checked ? internal.max : internal.min + __panel.enableAnimation = true + } + + onCheckedChanged: { + if (internal.handle) + internal.handle.x = checked ? internal.max : internal.min + } + + activeFocusOnTab: true + Accessible.role: Accessible.CheckBox + Accessible.name: "switch" + + /*! + The style that should be applied to the switch. Custom style + components can be created with: + + \codeline Qt.createComponent("path/to/style.qml", switchId); + */ + style: Qt.createComponent(Settings.style + "/SwitchStyle.qml", root) +} diff --git a/src/controls/controls.pro b/src/controls/controls.pro index bf2b38d7..3de8aece 100644 --- a/src/controls/controls.pro +++ b/src/controls/controls.pro @@ -26,6 +26,7 @@ CONTROLS_QML_FILES = \ StackViewDelegate.qml \ StackViewTransition.qml \ StatusBar.qml \ + Switch.qml \ Tab.qml \ TabView.qml \ TableView.qml \ diff --git a/src/controls/plugin.cpp b/src/controls/plugin.cpp index 64386e72..0c7f8966 100644 --- a/src/controls/plugin.cpp +++ b/src/controls/plugin.cpp @@ -84,6 +84,7 @@ static const struct { { "StackViewDelegate", 1, 0 }, { "StackViewTransition", 1, 0 }, { "StatusBar", 1, 0 }, + { "Switch", 1, 1 }, { "Tab", 1, 0 }, { "TabView", 1, 0 }, { "TableView", 1, 0 }, diff --git a/tests/auto/controls/controls.pro b/tests/auto/controls/controls.pro index f4a7cc96..99cc0bcc 100644 --- a/tests/auto/controls/controls.pro +++ b/tests/auto/controls/controls.pro @@ -33,6 +33,7 @@ OTHER_FILES += \ $$PWD/data/tst_gridlayout.qml \ $$PWD/data/tst_slider.qml \ $$PWD/data/tst_statusbar.qml \ + $$PWD/data/tst_switch.qml \ $$PWD/data/tst_tab.qml \ $$PWD/data/tst_tabview.qml \ $$PWD/data/tst_tableviewcolumn.qml \ diff --git a/tests/auto/controls/data/tst_switch.qml b/tests/auto/controls/data/tst_switch.qml new file mode 100644 index 00000000..27d66934 --- /dev/null +++ b/tests/auto/controls/data/tst_switch.qml @@ -0,0 +1,257 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Quick Controls module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.1 +import QtTest 1.0 +import QtQuickControlsTests 1.0 + +Item { + id: container + width: 200 + height: 200 + + TestCase { + id: testCase + name: "Tests_Switch" + when: windowShown + width: 200 + height: 200 + + property var aSwitch + + SignalSpy { + id: signalSpy + } + + function init() { + aSwitch = Qt.createQmlObject("import QtQuick.Controls 1.1; Switch { }", container, ""); + } + + function cleanup() { + if (aSwitch !== null) { + aSwitch.destroy() + } + signalSpy.clear(); + } + + function test_defaultConstructed() { + compare(aSwitch.checked, false); + } + + function test_checked() { + signalSpy.signalName = "checkedChanged" + signalSpy.target = aSwitch; + compare(signalSpy.count, 0); + + compare(aSwitch.checked, false); + aSwitch.checked = true; + compare(aSwitch.checked, true); + + mouseClick(aSwitch, aSwitch.x + 1, aSwitch.y + 1, Qt.LeftButton); + compare(signalSpy.count, 1); + compare(aSwitch.checked, true); + + // Clicking outside should do nothing. + mouseClick(aSwitch, aSwitch.x - 1, aSwitch.y, Qt.LeftButton); + compare(signalSpy.count, 1); + compare(aSwitch.checked, true); + + mouseClick(aSwitch, aSwitch.x, aSwitch.y - 1, Qt.LeftButton); + compare(signalSpy.count, 1); + compare(aSwitch.checked, true); + + mouseClick(aSwitch, aSwitch.x - 1, aSwitch.y - 1, Qt.LeftButton); + compare(signalSpy.count, 1); + compare(aSwitch.checked, true); + } + + function test_keyPressed() { + aSwitch.forceActiveFocus(); + signalSpy.signalName = "checkedChanged"; + signalSpy.target = aSwitch; + compare(signalSpy.count, 0); + signalSpy.clear(); + aSwitch.forceActiveFocus() + keyPress(Qt.Key_Space); + keyRelease(Qt.Key_Space); + compare(signalSpy.count, 1); + } + + function test_exclusiveGroup() { + var root = Qt.createQmlObject("import QtQuick 2.1; import QtQuick.Controls 1.1; \n" + + "Row { \n" + + " property alias aSwitch1: aSwitch1 \n" + + " property alias aSwitch2: aSwitch2 \n" + + " property alias aSwitch3: aSwitch3 \n" + + " property alias group: group \n" + + " ExclusiveGroup { id: group } \n" + + " Switch { id: aSwitch1; checked: true; exclusiveGroup: group } \n" + + " Switch { id: aSwitch2; exclusiveGroup: group } \n" + + " Switch { id: aSwitch3; exclusiveGroup: group } \n" + + "}", container, ""); + + root.forceActiveFocus(); + signalSpy.signalName = "checkedChanged"; + signalSpy.target = root.aSwitch1; + compare(signalSpy.count, 0); + + compare(root.aSwitch1.exclusiveGroup, root.group); + compare(root.aSwitch2.exclusiveGroup, root.group); + compare(root.aSwitch3.exclusiveGroup, root.group); + + compare(root.aSwitch1.checked, true); + compare(root.aSwitch2.checked, false); + compare(root.aSwitch3.checked, false); + + root.aSwitch2.forceActiveFocus(); + keyPress(Qt.Key_Space); + compare(signalSpy.count, 1); + + compare(root.aSwitch1.checked, false); + compare(root.aSwitch2.checked, true); + compare(root.aSwitch3.checked, false); + + root.aSwitch3.forceActiveFocus(); + keyPress(Qt.Key_Space); + compare(signalSpy.count, 1); + + compare(root.aSwitch1.checked, false); + compare(root.aSwitch2.checked, false); + compare(root.aSwitch3.checked, true); + + root.aSwitch3.forceActiveFocus(); + keyPress(Qt.Key_Space); + + compare(root.aSwitch1.checked, false); + compare(root.aSwitch2.checked, false); + compare(root.aSwitch3.checked, false); + + // Shouldn't be any warnings, since we're not setting a group. + root.aSwitch1.exclusiveGroup = null; + root.aSwitch2.exclusiveGroup = null; + root.aSwitch3.exclusiveGroup = null; + } + + function test_activeFocusOnPress(){ + aSwitch.activeFocusOnPress = false + verify(!aSwitch.activeFocus) + mouseClick(aSwitch, aSwitch.x + 1, aSwitch.y + 1) + verify(!aSwitch.activeFocus) + aSwitch.activeFocusOnPress = true + verify(!aSwitch.activeFocus) + mouseClick(aSwitch, aSwitch.x + 1, aSwitch.y + 1) + verify(aSwitch.activeFocus) + } + + function test_activeFocusOnTab() { + aSwitch.destroy() + wait(0) //QTBUG-30523 so processEvents is called + + if (!SystemInfo.tabAllWidgets) + skip("This function doesn't support NOT iterating all.") + + var test_control = 'import QtQuick 2.1; \ + import QtQuick.Controls 1.1; \ + Item { \ + width: 200; \ + height: 200; \ + property alias control1: _control1; \ + property alias control2: _control2; \ + property alias control3: _control3; \ + Switch { \ + y: 20; \ + id: _control1; \ + activeFocusOnTab: true; \ + } \ + Switch { \ + y: 70; \ + id: _control2; \ + activeFocusOnTab: false; \ + } \ + Switch { \ + y: 120; \ + id: _control3; \ + activeFocusOnTab: true; \ + } \ + } ' + + var control = Qt.createQmlObject(test_control, container, '') + control.control1.forceActiveFocus() + verify(control.control1.activeFocus) + verify(!control.control2.activeFocus) + verify(!control.control3.activeFocus) + keyPress(Qt.Key_Tab) + verify(!control.control1.activeFocus) + verify(!control.control2.activeFocus) + verify(control.control3.activeFocus) + keyPress(Qt.Key_Tab) + verify(control.control1.activeFocus) + verify(!control.control2.activeFocus) + verify(!control.control3.activeFocus) + keyPress(Qt.Key_Tab, Qt.ShiftModifier) + verify(!control.control1.activeFocus) + verify(!control.control2.activeFocus) + verify(control.control3.activeFocus) + keyPress(Qt.Key_Tab, Qt.ShiftModifier) + verify(control.control1.activeFocus) + verify(!control.control2.activeFocus) + verify(!control.control3.activeFocus) + control.control2.activeFocusOnTab = true + control.control3.activeFocusOnTab = false + keyPress(Qt.Key_Tab) + verify(!control.control1.activeFocus) + verify(control.control2.activeFocus) + verify(!control.control3.activeFocus) + keyPress(Qt.Key_Tab) + verify(control.control1.activeFocus) + verify(!control.control2.activeFocus) + verify(!control.control3.activeFocus) + keyPress(Qt.Key_Tab, Qt.ShiftModifier) + verify(!control.control1.activeFocus) + verify(control.control2.activeFocus) + verify(!control.control3.activeFocus) + keyPress(Qt.Key_Tab, Qt.ShiftModifier) + verify(control.control1.activeFocus) + verify(!control.control2.activeFocus) + verify(!control.control3.activeFocus) + control.destroy() + } + } +} |