aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/imports/controls/doc/src/includes/qquickswitch.qdocinc4
-rw-r--r--src/quickcontrols2/qquickstyle.cpp20
-rw-r--r--src/quicktemplates2/qquickabstractbutton.cpp2
-rw-r--r--src/quicktemplates2/qquickdial.cpp4
-rw-r--r--src/quicktemplates2/qquickprogressbar.cpp4
-rw-r--r--src/quicktemplates2/qquickrangeslider.cpp16
-rw-r--r--src/quicktemplates2/qquickslider.cpp10
-rw-r--r--src/quicktemplates2/qquickspinbox.cpp3
-rw-r--r--tests/auto/controls/data/tst_button.qml163
-rw-r--r--tests/auto/controls/data/tst_checkbox.qml126
-rw-r--r--tests/auto/controls/data/tst_radiobutton.qml80
-rw-r--r--tests/auto/controls/data/tst_spinbox.qml62
12 files changed, 309 insertions, 185 deletions
diff --git a/src/imports/controls/doc/src/includes/qquickswitch.qdocinc b/src/imports/controls/doc/src/includes/qquickswitch.qdocinc
index 32ccbb89..985f85d9 100644
--- a/src/imports/controls/doc/src/includes/qquickswitch.qdocinc
+++ b/src/imports/controls/doc/src/includes/qquickswitch.qdocinc
@@ -2,7 +2,7 @@
This property holds the logical position of the thumb indicator.
-The position is defined as a percentage of the indicator's size, scaled to
+The position is expressed as a fraction of the indicator's size, in the range
\c 0.0 - \c 1.0. The position can be used for example to determine whether
the thumb has been dragged past the halfway point. For visualizing a thumb
indicator, the right-to-left aware \l visualPosition should be used instead.
@@ -16,7 +16,7 @@ indicator, the right-to-left aware \l visualPosition should be used instead.
This property holds the visual position of the thumb indicator.
-The position is defined as a percentage of the indicator's size, scaled to
+The position is expressed as a fraction of the indicator's size, in the range
\c 0.0 - \c 1.0. When the control is \l {Control::mirrored}{mirrored}, the
value is equal to \c {1.0 - position}. This makes the value suitable for
visualizing the thumb indicator taking right-to-left support into account.
diff --git a/src/quickcontrols2/qquickstyle.cpp b/src/quickcontrols2/qquickstyle.cpp
index f4fc1764..d7143be7 100644
--- a/src/quickcontrols2/qquickstyle.cpp
+++ b/src/quickcontrols2/qquickstyle.cpp
@@ -41,6 +41,7 @@
#include <QtCore/qdir.h>
#include <QtCore/qdebug.h>
#include <QtCore/qsettings.h>
+#include <QtCore/qlibraryinfo.h>
#include <QtGui/private/qguiapplication_p.h>
#include <QtQml/private/qqmlmetatype_p.h>
#include <QtQml/qqmlengine.h>
@@ -96,6 +97,23 @@ QT_BEGIN_NAMESPACE
\sa {Styling Qt Quick Controls 2}
*/
+// TODO: QQmlImportDatabase::defaultImportPathList()
+static QStringList defaultImportPathList()
+{
+ QStringList importPaths;
+ importPaths.reserve(3);
+ importPaths += QLibraryInfo::location(QLibraryInfo::Qml2ImportsPath);
+
+ if (Q_UNLIKELY(!qEnvironmentVariableIsEmpty("QML2_IMPORT_PATH"))) {
+ const QByteArray envImportPath = qgetenv("QML2_IMPORT_PATH");
+ importPaths += QString::fromLatin1(envImportPath).split(QDir::listSeparator(), QString::SkipEmptyParts);
+ }
+
+ importPaths += QStringLiteral("qrc:/qt-project.org/imports");
+ importPaths += QCoreApplication::applicationDirPath();
+ return importPaths;
+}
+
struct QQuickStyleSpec
{
QQuickStyleSpec() : custom(false), resolved(false) { }
@@ -179,7 +197,7 @@ struct QQuickStyleSpec
if (QGuiApplication::instance()) {
if (!custom) {
const QString targetPath = QStringLiteral("QtQuick/Controls.2");
- const QStringList importPaths = QQmlEngine().importPathList();
+ const QStringList importPaths = defaultImportPathList();
for (const QString &importPath : importPaths) {
QString stylePath = findStyle(importPath + QLatin1Char('/') + targetPath, style);
diff --git a/src/quicktemplates2/qquickabstractbutton.cpp b/src/quicktemplates2/qquickabstractbutton.cpp
index 2615608f..bee45554 100644
--- a/src/quicktemplates2/qquickabstractbutton.cpp
+++ b/src/quicktemplates2/qquickabstractbutton.cpp
@@ -540,7 +540,7 @@ void QQuickAbstractButton::mouseMoveEvent(QMouseEvent *event)
QQuickControl::mouseMoveEvent(event);
setPressed(d->keepPressed || contains(event->pos()));
- if (d->autoRepeat)
+ if (!d->pressed && d->autoRepeat)
d->stopPressRepeat();
else if (d->holdTimer > 0 && (!d->pressed || QLineF(d->pressPoint, event->localPos()).length() > QGuiApplication::styleHints()->startDragDistance()))
d->stopPressAndHold();
diff --git a/src/quicktemplates2/qquickdial.cpp b/src/quicktemplates2/qquickdial.cpp
index 22c1133b..79aff781 100644
--- a/src/quicktemplates2/qquickdial.cpp
+++ b/src/quicktemplates2/qquickdial.cpp
@@ -280,8 +280,8 @@ void QQuickDial::setValue(qreal value)
This property holds the logical position of the handle.
- The position is defined as a percentage of the control's angle range (the
- range within which the handle can be moved) scaled to \c {0.0 - 1.0}.
+ The position is expressed as a fraction of the control's angle range (the
+ range within which the handle can be moved) in the range \c {0.0 - 1.0}.
Unlike the \l value property, the \c position is continuously updated while
the handle is dragged.
diff --git a/src/quicktemplates2/qquickprogressbar.cpp b/src/quicktemplates2/qquickprogressbar.cpp
index 5d5503e6..d8ada6f4 100644
--- a/src/quicktemplates2/qquickprogressbar.cpp
+++ b/src/quicktemplates2/qquickprogressbar.cpp
@@ -192,7 +192,7 @@ void QQuickProgressBar::setValue(qreal value)
This property holds the logical position of the progress.
- The position is defined as a percentage of the value, scaled to
+ The position is expressed as a fraction of the value, in the range
\c {0.0 - 1.0}. For visualizing the progress, the right-to-left
aware \l visualPosition should be used instead.
@@ -212,7 +212,7 @@ qreal QQuickProgressBar::position() const
This property holds the visual position of the progress.
- The position is defined as a percentage of the value, scaled to \c {0.0 - 1.0}.
+ The position is expressed as a fraction of the value, in the range \c {0.0 - 1.0}.
When the control is \l {Control::mirrored}{mirrored}, \c visuaPosition is equal
to \c {1.0 - position}. This makes \c visualPosition suitable for visualizing
the progress, taking right-to-left support into account.
diff --git a/src/quicktemplates2/qquickrangeslider.cpp b/src/quicktemplates2/qquickrangeslider.cpp
index 219292c8..2f2b621c 100644
--- a/src/quicktemplates2/qquickrangeslider.cpp
+++ b/src/quicktemplates2/qquickrangeslider.cpp
@@ -68,8 +68,8 @@ QT_BEGIN_NAMESPACE
}
\endcode
- The \l {first.position} and \l {second.position} properties are defined as a
- percentage of the control's size, scaled within the range \c {0.0 - 1.0}.
+ The \l {first.position} and \l {second.position} properties are expressed as
+ fractions of the control's size, in the range \c {0.0 - 1.0}.
The \l {first.visualPosition} and \l {second.visualPosition} properties are
the same, except that they are reversed in a
\l {Right-to-left User Interfaces}{right-to-left} application.
@@ -485,7 +485,7 @@ void QQuickRangeSlider::setTo(qreal to)
\li visualPosition
\li This property holds the visual position of the first handle.
- The position is defined as a percentage of the control's size, scaled to
+ The position is expressed as a fraction of the control's size, in the range
\c {0.0 - 1.0}. When the control is \l {Control::mirrored}{mirrored}, the
value is equal to \c {1.0 - position}. This makes the value suitable for
visualizing the slider, taking right-to-left support into account.
@@ -493,8 +493,8 @@ void QQuickRangeSlider::setTo(qreal to)
\li position
\li This property holds the logical position of the first handle.
- The position is defined as a percentage of the control's size, scaled
- to \c {0.0 - 1.0}. Unlike \l {first.value}{value}, position is
+ The position is expressed as a fraction of the control's size, in the range
+ \c {0.0 - 1.0}. Unlike \l {first.value}{value}, position is
continuously updated while the handle is dragged. For visualizing a
slider, the right-to-left aware
\l {first.visualPosition}{visualPosition} should be used instead.
@@ -547,7 +547,7 @@ QQuickRangeSliderNode *QQuickRangeSlider::first() const
\li visualPosition
\li This property holds the visual position of the second handle.
- The position is defined as a percentage of the control's size, scaled to
+ The position is expressed as a fraction of the control's size, in the range
\c {0.0 - 1.0}. When the control is \l {Control::mirrored}{mirrored}, the
value is equal to \c {1.0 - position}. This makes the value suitable for
visualizing the slider, taking right-to-left support into account.
@@ -555,8 +555,8 @@ QQuickRangeSliderNode *QQuickRangeSlider::first() const
\li position
\li This property holds the logical position of the second handle.
- The position is defined as a percentage of the control's size, scaled
- to \c {0.0 - 1.0}. Unlike \l {second.value}{value}, position is
+ The position is expressed as a fraction of the control's size, in the range
+ \c {0.0 - 1.0}. Unlike \l {second.value}{value}, position is
continuously updated while the handle is dragged. For visualizing a
slider, the right-to-left aware
\l {second.visualPosition}{visualPosition} should be used instead.
diff --git a/src/quicktemplates2/qquickslider.cpp b/src/quicktemplates2/qquickslider.cpp
index 30910906..c0680725 100644
--- a/src/quicktemplates2/qquickslider.cpp
+++ b/src/quicktemplates2/qquickslider.cpp
@@ -64,8 +64,8 @@ QT_BEGIN_NAMESPACE
}
\endcode
- The \l position property is defined as a percentage of the control's size,
- scaled within the range \c {0.0 - 1.0}. The \l visualPosition property is
+ The \l position property is expressed as a fraction of the control's size,
+ in the range \c {0.0 - 1.0}. The \l visualPosition property is
the same, except that it is reversed in a
\l {Right-to-left User Interfaces}{right-to-left} application. The
visualPosition is useful for positioning the handle when styling Slider.
@@ -258,8 +258,8 @@ void QQuickSlider::setValue(qreal value)
This property holds the logical position of the handle.
- The position is defined as a percentage of the control's size, scaled
- to \c {0.0 - 1.0}. Unlike the \l value property, the \c position is
+ The position is expressed as a fraction of the control's size, in the range
+ \c {0.0 - 1.0}. Unlike the \l value property, the \c position is
continuously updated while the handle is dragged. For visualizing a
slider, the right-to-left aware \l visualPosition should be used instead.
@@ -277,7 +277,7 @@ qreal QQuickSlider::position() const
This property holds the visual position of the handle.
- The position is defined as a percentage of the control's size, scaled to
+ The position is expressed as a fraction of the control's size, in the range
\c {0.0 - 1.0}. When the control is \l {Control::mirrored}{mirrored}, the
value is equal to \c {1.0 - position}. This makes the value suitable for
visualizing the slider, taking right-to-left support into account.
diff --git a/src/quicktemplates2/qquickspinbox.cpp b/src/quicktemplates2/qquickspinbox.cpp
index 957200a4..506405fe 100644
--- a/src/quicktemplates2/qquickspinbox.cpp
+++ b/src/quicktemplates2/qquickspinbox.cpp
@@ -252,7 +252,8 @@ bool QQuickSpinBoxPrivate::handleMouseMoveEvent(QQuickItem *child, QMouseEvent *
bool pressed = up->isPressed() || down->isPressed();
q->setAccessibleProperty("pressed", pressed);
- stopPressRepeat();
+ if (!pressed)
+ stopPressRepeat();
return pressed;
}
diff --git a/tests/auto/controls/data/tst_button.qml b/tests/auto/controls/data/tst_button.qml
index 16d1bb94..dcce20d7 100644
--- a/tests/auto/controls/data/tst_button.qml
+++ b/tests/auto/controls/data/tst_button.qml
@@ -52,13 +52,13 @@ TestCase {
Component {
id: button
- Button {
- id: control
+ Button { }
+ }
- property SignalSequenceSpy spy: SignalSequenceSpy {
- target: control
- signals: ["pressed", "released", "canceled", "clicked", "doubleClicked", "pressedChanged", "downChanged", "checkedChanged"]
- }
+ Component {
+ id: signalSequenceSpy
+ SignalSequenceSpy {
+ signals: ["pressed", "released", "canceled", "clicked", "doubleClicked", "pressedChanged", "downChanged", "checkedChanged"]
}
}
@@ -84,52 +84,54 @@ TestCase {
var control = button.createObject(testCase)
verify(control)
+ var sequenceSpy = signalSequenceSpy.createObject(control, {target: control})
+
// click
- control.spy.expectedSequence = [["pressedChanged", { "pressed": true }],
+ sequenceSpy.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)
+ verify(sequenceSpy.success)
- control.spy.expectedSequence = [["pressedChanged", { "pressed": false }],
+ sequenceSpy.expectedSequence = [["pressedChanged", { "pressed": false }],
["downChanged", { "down": false }],
"released",
"clicked"]
mouseRelease(control, control.width / 2, control.height / 2, Qt.LeftButton)
compare(control.pressed, false)
- verify(control.spy.success)
+ verify(sequenceSpy.success)
// release outside
- control.spy.expectedSequence = [["pressedChanged", { "pressed": true }],
+ sequenceSpy.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)
+ verify(sequenceSpy.success)
- control.spy.expectedSequence = [["pressedChanged", { "pressed": false }],
+ sequenceSpy.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)
+ verify(sequenceSpy.success)
- control.spy.expectedSequence = [["canceled", { "pressed": false }]]
+ sequenceSpy.expectedSequence = [["canceled", { "pressed": false }]]
mouseRelease(control, control.width * 2, control.height * 2, Qt.LeftButton)
compare(control.pressed, false)
- verify(control.spy.success)
+ verify(sequenceSpy.success)
// right button
- control.spy.expectedSequence = []
+ sequenceSpy.expectedSequence = []
mousePress(control, control.width / 2, control.height / 2, Qt.RightButton)
compare(control.pressed, false)
mouseRelease(control, control.width / 2, control.height / 2, Qt.RightButton)
compare(control.pressed, false)
- verify(control.spy.success)
+ verify(sequenceSpy.success)
// double click
- control.spy.expectedSequence = [["pressedChanged", { "pressed": true }],
+ sequenceSpy.expectedSequence = [["pressedChanged", { "pressed": true }],
["downChanged", { "down": true }],
"pressed",
["pressedChanged", { "pressed": false }],
@@ -145,7 +147,7 @@ TestCase {
"released",
"clicked"]
mouseDoubleClickSequence(control, control.width / 2, control.height / 2, Qt.LeftButton)
- verify(control.spy.success)
+ verify(sequenceSpy.success)
control.destroy()
}
@@ -157,8 +159,10 @@ TestCase {
control.forceActiveFocus()
verify(control.activeFocus)
+ var sequenceSpy = signalSequenceSpy.createObject(control, {target: control})
+
// click
- control.spy.expectedSequence = [["pressedChanged", { "pressed": true }],
+ sequenceSpy.expectedSequence = [["pressedChanged", { "pressed": true }],
["downChanged", { "down": true }],
"pressed",
["pressedChanged", { "pressed": false }],
@@ -166,15 +170,15 @@ TestCase {
"released",
"clicked"]
keyClick(Qt.Key_Space)
- verify(control.spy.success)
+ verify(sequenceSpy.success)
// no change
- control.spy.expectedSequence = []
+ sequenceSpy.expectedSequence = []
var keys = [Qt.Key_Enter, Qt.Key_Return, Qt.Key_Escape, Qt.Key_Tab]
for (var i = 0; i < keys.length; ++i) {
- control.spy.reset()
+ sequenceSpy.reset()
keyClick(keys[i])
- verify(control.spy.success)
+ verify(sequenceSpy.success)
}
control.destroy()
@@ -197,54 +201,75 @@ TestCase {
var clickSpy = signalSpy.createObject(control, {target: control, signalName: "clicked"})
verify(clickSpy.valid)
+ var pressSpy = signalSpy.createObject(control, {target: control, signalName: "pressed"})
+ verify(pressSpy.valid)
+ var releaseSpy = signalSpy.createObject(control, {target: control, signalName: "released"})
+ verify(releaseSpy.valid)
- var repeatCount = 2
- var repeatSequence = [["pressedChanged", { "pressed": true }],
- ["downChanged", { "down": true }],
- "pressed",
- "released",
- "clicked",
- "pressed",
- "released",
- "clicked",
- "pressed"]
-
- // auto-repeat a couple of mouse clicks
- control.spy.expectedSequence = repeatSequence
+ // auto-repeat mouse click
mousePress(control)
compare(control.pressed, true)
- tryVerify(function() { return clickSpy.count >= repeatCount })
- if (clickSpy.count > repeatCount)
- warn("Expected auto-repeat count " + repeatCount + " exceeded (" + clickSpy.count + ") - busy CI?")
- else
- verify(control.spy.success)
-
- control.spy.expectedSequence = [["pressedChanged", { "pressed": false }],
- ["downChanged", { "down": false }],
- "released",
- "clicked"]
+ clickSpy.wait()
+ clickSpy.wait()
+ compare(pressSpy.count, clickSpy.count + 1)
+ compare(releaseSpy.count, clickSpy.count)
mouseRelease(control)
compare(control.pressed, false)
- verify(control.spy.success)
+ compare(clickSpy.count, pressSpy.count)
+ compare(releaseSpy.count, pressSpy.count)
- // auto-repeat a couple of key clicks
clickSpy.clear()
- control.spy.expectedSequence = repeatSequence
+ pressSpy.clear()
+ releaseSpy.clear()
+
+ // auto-repeat key click
keyPress(Qt.Key_Space)
compare(control.pressed, true)
- tryVerify(function() { return clickSpy.count >= repeatCount })
- if (clickSpy.count > repeatCount)
- warn("Expected auto-repeat count " + repeatCount + " exceeded (" + clickSpy.count + ") - busy CI?")
- else
- verify(control.spy.success)
-
- control.spy.expectedSequence = [["pressedChanged", { "pressed": false }],
- ["downChanged", { "down": false }],
- "released",
- "clicked"]
+ clickSpy.wait()
+ clickSpy.wait()
+ compare(pressSpy.count, clickSpy.count + 1)
+ compare(releaseSpy.count, clickSpy.count)
keyRelease(Qt.Key_Space)
compare(control.pressed, false)
- verify(control.spy.success)
+ compare(clickSpy.count, pressSpy.count)
+ compare(releaseSpy.count, pressSpy.count)
+
+ clickSpy.clear()
+ pressSpy.clear()
+ releaseSpy.clear()
+
+ mousePress(control)
+ compare(control.pressed, true)
+ clickSpy.wait()
+ compare(pressSpy.count, clickSpy.count + 1)
+ compare(releaseSpy.count, clickSpy.count)
+
+ // move inside during repeat -> continue repeat
+ mouseMove(control, control.width / 4, control.height / 4)
+ clickSpy.wait()
+ compare(pressSpy.count, clickSpy.count + 1)
+ compare(releaseSpy.count, clickSpy.count)
+
+ clickSpy.clear()
+ pressSpy.clear()
+ releaseSpy.clear()
+
+ // move outside during repeat -> stop repeat
+ mouseMove(control, -1, -1)
+ // NOTE: The following wait() is NOT a reliable way to test that the
+ // auto-repeat timer is not running, but there's no way dig into the
+ // private APIs from QML. If this test ever fails in the future, it
+ // indicates that the auto-repeat timer logic is broken.
+ wait(125)
+ compare(clickSpy.count, 0)
+ compare(pressSpy.count, 0)
+ compare(releaseSpy.count, 0)
+
+ mouseRelease(control, -1, -1)
+ compare(control.pressed, false)
+ compare(clickSpy.count, 0)
+ compare(pressSpy.count, 0)
+ compare(releaseSpy.count, 0)
control.destroy()
}
@@ -262,7 +287,9 @@ TestCase {
verify(control.hasOwnProperty("checkable"))
verify(!control.checkable)
- control.spy.expectedSequence = [["pressedChanged", { "pressed": true }],
+ var sequenceSpy = signalSequenceSpy.createObject(control, {target: control})
+
+ sequenceSpy.expectedSequence = [["pressedChanged", { "pressed": true }],
["downChanged", { "down": true }],
"pressed",
["pressedChanged", { "pressed": false }],
@@ -271,9 +298,9 @@ TestCase {
"clicked"]
mouseClick(control)
verify(!control.checked)
- verify(control.spy.success)
+ verify(sequenceSpy.success)
- control.spy.expectedSequence = [["pressedChanged", { "pressed": true }],
+ sequenceSpy.expectedSequence = [["pressedChanged", { "pressed": true }],
["downChanged", { "down": true }],
"pressed",
["pressedChanged", { "pressed": false }],
@@ -284,9 +311,9 @@ TestCase {
control.checkable = true
mouseClick(control)
verify(control.checked)
- verify(control.spy.success)
+ verify(sequenceSpy.success)
- control.spy.expectedSequence = [["pressedChanged", { "pressed": true }],
+ sequenceSpy.expectedSequence = [["pressedChanged", { "pressed": true }],
["downChanged", { "down": true }],
"pressed",
["pressedChanged", { "pressed": false }],
@@ -296,7 +323,7 @@ TestCase {
"clicked"]
mouseClick(control)
verify(!control.checked)
- verify(control.spy.success)
+ verify(sequenceSpy.success)
control.destroy()
}
diff --git a/tests/auto/controls/data/tst_checkbox.qml b/tests/auto/controls/data/tst_checkbox.qml
index d1b590e4..b88e6deb 100644
--- a/tests/auto/controls/data/tst_checkbox.qml
+++ b/tests/auto/controls/data/tst_checkbox.qml
@@ -52,13 +52,13 @@ TestCase {
Component {
id: checkBox
- CheckBox {
- id: control
+ CheckBox { }
+ }
- property SignalSequenceSpy spy: SignalSequenceSpy {
- target: control
- signals: ["pressed", "released", "canceled", "clicked", "pressedChanged", "checkedChanged", "checkStateChanged"]
- }
+ Component {
+ id: signalSequenceSpy
+ SignalSequenceSpy {
+ signals: ["pressed", "released", "canceled", "clicked", "pressedChanged", "checkedChanged", "checkStateChanged"]
}
}
@@ -79,24 +79,26 @@ TestCase {
var control = checkBox.createObject(testCase)
verify(control)
- control.spy.expectedSequence = []
+ var sequenceSpy = signalSequenceSpy.createObject(control, {target: control})
+
+ sequenceSpy.expectedSequence = []
compare(control.checked, false)
compare(control.checkState, Qt.Unchecked)
- verify(control.spy.success)
+ verify(sequenceSpy.success)
- control.spy.expectedSequence = [["checkStateChanged", { "checked": true, "checkState": Qt.Checked }],
+ sequenceSpy.expectedSequence = [["checkStateChanged", { "checked": true, "checkState": Qt.Checked }],
["checkedChanged", { "checked": true, "checkState": Qt.Checked }]]
control.checked = true
compare(control.checked, true)
compare(control.checkState, Qt.Checked)
- verify(control.spy.success)
+ verify(sequenceSpy.success)
- control.spy.expectedSequence = [["checkStateChanged", { "checked": false, "checkState": Qt.Unchecked }],
+ sequenceSpy.expectedSequence = [["checkStateChanged", { "checked": false, "checkState": Qt.Unchecked }],
["checkedChanged", { "checked": false, "checkState": Qt.Unchecked }]]
control.checked = false
compare(control.checked, false)
compare(control.checkState, Qt.Unchecked)
- verify(control.spy.success)
+ verify(sequenceSpy.success)
control.destroy()
}
@@ -105,24 +107,26 @@ TestCase {
var control = checkBox.createObject(testCase)
verify(control)
- control.spy.expectedSequence = []
+ var sequenceSpy = signalSequenceSpy.createObject(control, {target: control})
+
+ sequenceSpy.expectedSequence = []
compare(control.checked, false)
compare(control.checkState, Qt.Unchecked)
- verify(control.spy.success)
+ verify(sequenceSpy.success)
- control.spy.expectedSequence = [["checkStateChanged", { "checked": true, "checkState": Qt.Checked }],
+ sequenceSpy.expectedSequence = [["checkStateChanged", { "checked": true, "checkState": Qt.Checked }],
["checkedChanged", { "checked": true, "checkState": Qt.Checked }]]
control.checkState = Qt.Checked
compare(control.checked, true)
compare(control.checkState, Qt.Checked)
- verify(control.spy.success)
+ verify(sequenceSpy.success)
- control.spy.expectedSequence = [["checkStateChanged", { "checked": false, "checkState": Qt.Unchecked }],
+ sequenceSpy.expectedSequence = [["checkStateChanged", { "checked": false, "checkState": Qt.Unchecked }],
["checkedChanged", { "checked": false, "checkState": Qt.Unchecked }]]
control.checkState = Qt.Unchecked
compare(control.checked, false)
compare(control.checkState, Qt.Unchecked)
- verify(control.spy.success)
+ verify(sequenceSpy.success)
control.destroy()
}
@@ -131,14 +135,16 @@ TestCase {
var control = checkBox.createObject(testCase)
verify(control)
+ var sequenceSpy = signalSequenceSpy.createObject(control, {target: control})
+
// check
- control.spy.expectedSequence = [["pressedChanged", { "pressed": true, "checked": false, "checkState": Qt.Unchecked }],
+ sequenceSpy.expectedSequence = [["pressedChanged", { "pressed": true, "checked": false, "checkState": Qt.Unchecked }],
"pressed"]
mousePress(control, control.width / 2, control.height / 2, Qt.LeftButton)
compare(control.pressed, true)
- verify(control.spy.success)
+ verify(sequenceSpy.success)
- control.spy.expectedSequence = [["pressedChanged", { "pressed": false, "checked": false, "checkState": Qt.Unchecked }],
+ sequenceSpy.expectedSequence = [["pressedChanged", { "pressed": false, "checked": false, "checkState": Qt.Unchecked }],
["checkStateChanged", { "pressed": false, "checked": true, "checkState": Qt.Checked }],
["checkedChanged", { "pressed": false, "checked": true, "checkState": Qt.Checked }],
"released",
@@ -147,15 +153,15 @@ TestCase {
compare(control.checked, true)
compare(control.checkState, Qt.Checked)
compare(control.pressed, false)
- verify(control.spy.success)
+ verify(sequenceSpy.success)
// uncheck
- control.spy.expectedSequence = [["pressedChanged", { "pressed": true, "checked": true, "checkState": Qt.Checked }],
+ sequenceSpy.expectedSequence = [["pressedChanged", { "pressed": true, "checked": true, "checkState": Qt.Checked }],
"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, "checked": true, "checkState": Qt.Checked }],
+ verify(sequenceSpy.success)
+ sequenceSpy.expectedSequence = [["pressedChanged", { "pressed": false, "checked": true, "checkState": Qt.Checked }],
["checkStateChanged", { "pressed": false, "checked": false, "checkState": Qt.Unchecked }],
["checkedChanged", { "pressed": false, "checked": false, "checkState": Qt.Unchecked }],
"released",
@@ -164,34 +170,34 @@ TestCase {
compare(control.checked, false)
compare(control.checkState, Qt.Unchecked)
compare(control.pressed, false)
- verify(control.spy.success)
+ verify(sequenceSpy.success)
// release outside
- control.spy.expectedSequence = [["pressedChanged", { "pressed": true, "checked": false, "checkState": Qt.Unchecked }],
+ sequenceSpy.expectedSequence = [["pressedChanged", { "pressed": true, "checked": false, "checkState": Qt.Unchecked }],
"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, "checked": false, "checkState": Qt.Unchecked }]]
+ verify(sequenceSpy.success)
+ sequenceSpy.expectedSequence = [["pressedChanged", { "pressed": false, "checked": false, "checkState": Qt.Unchecked }]]
mouseMove(control, control.width * 2, control.height * 2, 0, Qt.LeftButton)
compare(control.pressed, false)
- verify(control.spy.success)
- control.spy.expectedSequence = [["canceled", { "pressed": false, "checked": false, "checkState": Qt.Unchecked }]]
+ verify(sequenceSpy.success)
+ sequenceSpy.expectedSequence = [["canceled", { "pressed": false, "checked": false, "checkState": Qt.Unchecked }]]
mouseRelease(control, control.width * 2, control.height * 2, Qt.LeftButton)
compare(control.checked, false)
compare(control.checkState, Qt.Unchecked)
compare(control.pressed, false)
- verify(control.spy.success)
+ verify(sequenceSpy.success)
// right button
- control.spy.expectedSequence = []
+ sequenceSpy.expectedSequence = []
mousePress(control, control.width / 2, control.height / 2, Qt.RightButton)
compare(control.pressed, false)
mouseRelease(control, control.width / 2, control.height / 2, Qt.RightButton)
compare(control.checked, false)
compare(control.checkState, Qt.Unchecked)
compare(control.pressed, false)
- verify(control.spy.success)
+ verify(sequenceSpy.success)
control.destroy()
}
@@ -200,13 +206,15 @@ TestCase {
var control = checkBox.createObject(testCase)
verify(control)
- control.spy.expectedSequence = []
+ var sequenceSpy = signalSequenceSpy.createObject(control, {target: control})
+
+ sequenceSpy.expectedSequence = []
control.forceActiveFocus()
verify(control.activeFocus)
- verify(control.spy.success)
+ verify(sequenceSpy.success)
// check
- control.spy.expectedSequence = [["pressedChanged", { "pressed": true, "checked": false, "checkState": Qt.Unchecked }],
+ sequenceSpy.expectedSequence = [["pressedChanged", { "pressed": true, "checked": false, "checkState": Qt.Unchecked }],
"pressed",
["pressedChanged", { "pressed": false, "checked": false, "checkState": Qt.Unchecked }],
["checkStateChanged", { "pressed": false, "checked": true, "checkState": Qt.Checked }],
@@ -216,10 +224,10 @@ TestCase {
keyClick(Qt.Key_Space)
compare(control.checked, true)
compare(control.checkState, Qt.Checked)
- verify(control.spy.success)
+ verify(sequenceSpy.success)
// uncheck
- control.spy.expectedSequence = [["pressedChanged", { "pressed": true, "checked": true, "checkState": Qt.Checked }],
+ sequenceSpy.expectedSequence = [["pressedChanged", { "pressed": true, "checked": true, "checkState": Qt.Checked }],
"pressed",
["pressedChanged", { "pressed": false, "checked": true, "checkState": Qt.Checked }],
["checkStateChanged", { "pressed": false, "checked": false, "checkState": Qt.Unchecked }],
@@ -229,16 +237,16 @@ TestCase {
keyClick(Qt.Key_Space)
compare(control.checked, false)
compare(control.checkState, Qt.Unchecked)
- verify(control.spy.success)
+ verify(sequenceSpy.success)
// no change
- control.spy.expectedSequence = []
+ sequenceSpy.expectedSequence = []
var keys = [Qt.Key_Enter, Qt.Key_Return, Qt.Key_Escape, Qt.Key_Tab]
for (var i = 0; i < keys.length; ++i) {
- control.spy.reset()
+ sequenceSpy.reset()
keyClick(keys[i])
compare(control.checked, false)
- verify(control.spy.success)
+ verify(sequenceSpy.success)
}
control.destroy()
@@ -323,7 +331,9 @@ TestCase {
function test_tristate() {
var control = checkBox.createObject(testCase)
- control.spy.expectedSequence = []
+ var sequenceSpy = signalSequenceSpy.createObject(control, {target: control})
+
+ sequenceSpy.expectedSequence = []
control.forceActiveFocus()
verify(control.activeFocus)
@@ -331,16 +341,16 @@ TestCase {
compare(control.checked, false)
compare(control.checkState, Qt.Unchecked)
- control.spy.expectedSequence = [["checkStateChanged", { "pressed": false, "checked": true, "checkState": Qt.PartiallyChecked }],
+ sequenceSpy.expectedSequence = [["checkStateChanged", { "pressed": false, "checked": true, "checkState": Qt.PartiallyChecked }],
["checkedChanged", { "pressed": false, "checked": true, "checkState": Qt.PartiallyChecked }]]
control.checkState = Qt.PartiallyChecked
compare(control.tristate, true)
compare(control.checked, true)
compare(control.checkState, Qt.PartiallyChecked)
- verify(control.spy.success)
+ verify(sequenceSpy.success)
// key: partial -> checked
- control.spy.expectedSequence = [["pressedChanged", { "pressed": true, "checked": true, "checkState": Qt.PartiallyChecked }],
+ sequenceSpy.expectedSequence = [["pressedChanged", { "pressed": true, "checked": true, "checkState": Qt.PartiallyChecked }],
"pressed",
["pressedChanged", { "pressed": false, "checked": true, "checkState": Qt.PartiallyChecked }],
["checkStateChanged", { "pressed": false, "checked": true, "checkState": Qt.Checked }],
@@ -349,10 +359,10 @@ TestCase {
keyClick(Qt.Key_Space)
compare(control.checked, true)
compare(control.checkState, Qt.Checked)
- verify(control.spy.success)
+ verify(sequenceSpy.success)
// key: checked -> unchecked
- control.spy.expectedSequence = [["pressedChanged", { "pressed": true, "checked": true, "checkState": Qt.Checked }],
+ sequenceSpy.expectedSequence = [["pressedChanged", { "pressed": true, "checked": true, "checkState": Qt.Checked }],
"pressed",
["pressedChanged", { "pressed": false, "checked": true, "checkState": Qt.Checked }],
["checkStateChanged", { "pressed": false, "checked": false, "checkState": Qt.Unchecked }],
@@ -362,10 +372,10 @@ TestCase {
keyClick(Qt.Key_Space)
compare(control.checked, false)
compare(control.checkState, Qt.Unchecked)
- verify(control.spy.success)
+ verify(sequenceSpy.success)
// key: unchecked -> partial
- control.spy.expectedSequence = [["pressedChanged", { "pressed": true, "checked": false, "checkState": Qt.Unchecked }],
+ sequenceSpy.expectedSequence = [["pressedChanged", { "pressed": true, "checked": false, "checkState": Qt.Unchecked }],
"pressed",
["pressedChanged", { "pressed": false, "checked": false, "checkState": Qt.Unchecked }],
["checkStateChanged", { "pressed": false, "checked": true, "checkState": Qt.PartiallyChecked }],
@@ -375,10 +385,10 @@ TestCase {
keyClick(Qt.Key_Space)
compare(control.checked, true)
compare(control.checkState, Qt.PartiallyChecked)
- verify(control.spy.success)
+ verify(sequenceSpy.success)
// mouse: partial -> checked
- control.spy.expectedSequence = [["pressedChanged", { "pressed": true, "checked": true, "checkState": Qt.PartiallyChecked }],
+ sequenceSpy.expectedSequence = [["pressedChanged", { "pressed": true, "checked": true, "checkState": Qt.PartiallyChecked }],
"pressed",
["pressedChanged", { "pressed": false, "checked": true, "checkState": Qt.PartiallyChecked }],
["checkStateChanged", { "pressed": false, "checked": true, "checkState": Qt.Checked }],
@@ -387,10 +397,10 @@ TestCase {
mouseClick(control)
compare(control.checked, true)
compare(control.checkState, Qt.Checked)
- verify(control.spy.success)
+ verify(sequenceSpy.success)
// mouse: checked -> unchecked
- control.spy.expectedSequence = [["pressedChanged", { "pressed": true, "checked": true, "checkState": Qt.Checked }],
+ sequenceSpy.expectedSequence = [["pressedChanged", { "pressed": true, "checked": true, "checkState": Qt.Checked }],
"pressed",
["pressedChanged", { "pressed": false, "checked": true, "checkState": Qt.Checked }],
["checkStateChanged", { "pressed": false, "checked": false, "checkState": Qt.Unchecked }],
@@ -400,10 +410,10 @@ TestCase {
mouseClick(control)
compare(control.checked, false)
compare(control.checkState, Qt.Unchecked)
- verify(control.spy.success)
+ verify(sequenceSpy.success)
// mouse: unchecked -> partial
- control.spy.expectedSequence = [["pressedChanged", { "pressed": true, "checked": false, "checkState": Qt.Unchecked }],
+ sequenceSpy.expectedSequence = [["pressedChanged", { "pressed": true, "checked": false, "checkState": Qt.Unchecked }],
"pressed",
["pressedChanged", { "pressed": false, "checked": false, "checkState": Qt.Unchecked }],
["checkStateChanged", { "pressed": false, "checked": true, "checkState": Qt.PartiallyChecked }],
@@ -413,7 +423,7 @@ TestCase {
mouseClick(control)
compare(control.checked, true)
compare(control.checkState, Qt.PartiallyChecked)
- verify(control.spy.success)
+ verify(sequenceSpy.success)
control.destroy()
}
diff --git a/tests/auto/controls/data/tst_radiobutton.qml b/tests/auto/controls/data/tst_radiobutton.qml
index 94e3a2cb..9b6a2ae5 100644
--- a/tests/auto/controls/data/tst_radiobutton.qml
+++ b/tests/auto/controls/data/tst_radiobutton.qml
@@ -52,13 +52,13 @@ TestCase {
Component {
id: radioButton
- RadioButton {
- id: control
+ RadioButton { }
+ }
- property SignalSequenceSpy spy: SignalSequenceSpy {
- target: control
- signals: ["pressed", "released", "canceled", "clicked", "pressedChanged", "checkedChanged"]
- }
+ Component {
+ id: signalSequenceSpy
+ SignalSequenceSpy {
+ signals: ["pressed", "released", "canceled", "clicked", "pressedChanged", "checkedChanged"]
}
}
@@ -79,19 +79,21 @@ TestCase {
var control = radioButton.createObject(testCase)
verify(control)
- control.spy.expectedSequence = [] // No change expected
+ var sequenceSpy = signalSequenceSpy.createObject(control, {target: control})
+
+ sequenceSpy.expectedSequence = [] // No change expected
compare(control.checked, false)
- verify(control.spy.success)
+ verify(sequenceSpy.success)
- control.spy.expectedSequence = ["checkedChanged"]
+ sequenceSpy.expectedSequence = ["checkedChanged"]
control.checked = true
compare(control.checked, true)
- verify(control.spy.success)
+ verify(sequenceSpy.success)
- control.spy.reset()
+ sequenceSpy.reset()
control.checked = false
compare(control.checked, false)
- verify(control.spy.success)
+ verify(sequenceSpy.success)
control.destroy()
}
@@ -100,59 +102,61 @@ TestCase {
var control = radioButton.createObject(testCase)
verify(control)
+ var sequenceSpy = signalSequenceSpy.createObject(control, {target: control})
+
// check
- control.spy.expectedSequence = [["pressedChanged", { "pressed": true, "checked": false }],
+ sequenceSpy.expectedSequence = [["pressedChanged", { "pressed": true, "checked": false }],
"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, "checked": false }],
+ verify(sequenceSpy.success)
+ sequenceSpy.expectedSequence = [["pressedChanged", { "pressed": false, "checked": false }],
["checkedChanged", { "pressed": false, "checked": true }],
"released",
"clicked"]
mouseRelease(control, control.width / 2, control.height / 2, Qt.LeftButton)
compare(control.checked, true)
compare(control.pressed, false)
- verify(control.spy.success)
+ verify(sequenceSpy.success)
// attempt uncheck
- control.spy.expectedSequence = [["pressedChanged", { "pressed": true, "checked": true }],
+ sequenceSpy.expectedSequence = [["pressedChanged", { "pressed": true, "checked": 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, "checked": true }],
+ verify(sequenceSpy.success)
+ sequenceSpy.expectedSequence = [["pressedChanged", { "pressed": false, "checked": true }],
"released",
"clicked"]
mouseRelease(control, control.width / 2, control.height / 2, Qt.LeftButton)
compare(control.checked, true)
compare(control.pressed, false)
- verify(control.spy.success)
+ verify(sequenceSpy.success)
// release outside
- control.spy.expectedSequence = [["pressedChanged", { "pressed": true, "checked": true }],
+ sequenceSpy.expectedSequence = [["pressedChanged", { "pressed": true, "checked": 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, "checked": true }]]
+ verify(sequenceSpy.success)
+ sequenceSpy.expectedSequence = [["pressedChanged", { "pressed": false, "checked": true }]]
mouseMove(control, control.width * 2, control.height * 2, 0, Qt.LeftButton)
compare(control.pressed, false)
- control.spy.expectedSequence = [["canceled", { "pressed": false, "checked": true }]]
+ sequenceSpy.expectedSequence = [["canceled", { "pressed": false, "checked": true }]]
mouseRelease(control, control.width * 2, control.height * 2, Qt.LeftButton)
compare(control.checked, true)
compare(control.pressed, false)
- verify(control.spy.success)
+ verify(sequenceSpy.success)
// right button
- control.spy.expectedSequence = []
+ sequenceSpy.expectedSequence = []
mousePress(control, control.width / 2, control.height / 2, Qt.RightButton)
compare(control.pressed, false)
- verify(control.spy.success)
+ verify(sequenceSpy.success)
mouseRelease(control, control.width / 2, control.height / 2, Qt.RightButton)
compare(control.checked, true)
compare(control.pressed, false)
- verify(control.spy.success)
+ verify(sequenceSpy.success)
control.destroy()
}
@@ -161,13 +165,15 @@ TestCase {
var control = radioButton.createObject(testCase)
verify(control)
- control.spy.expectedSequence = []
+ var sequenceSpy = signalSequenceSpy.createObject(control, {target: control})
+
+ sequenceSpy.expectedSequence = []
control.forceActiveFocus()
verify(control.activeFocus)
- verify(control.spy.success)
+ verify(sequenceSpy.success)
// check
- control.spy.expectedSequence = [["pressedChanged", { "pressed": true, "checked": false }],
+ sequenceSpy.expectedSequence = [["pressedChanged", { "pressed": true, "checked": false }],
"pressed",
["pressedChanged", { "pressed": false, "checked": false }],
["checkedChanged", { "pressed": false, "checked": true }],
@@ -175,26 +181,26 @@ TestCase {
"clicked"]
keyClick(Qt.Key_Space)
compare(control.checked, true)
- verify(control.spy.success)
+ verify(sequenceSpy.success)
// attempt uncheck
- control.spy.expectedSequence = [["pressedChanged", { "pressed": true, "checked": true }],
+ sequenceSpy.expectedSequence = [["pressedChanged", { "pressed": true, "checked": true }],
"pressed",
["pressedChanged", { "pressed": false, "checked": true }],
"released",
"clicked"]
keyClick(Qt.Key_Space)
compare(control.checked, true)
- verify(control.spy.success)
+ verify(sequenceSpy.success)
// no change
- control.spy.expectedSequence = []
+ sequenceSpy.expectedSequence = []
var keys = [Qt.Key_Enter, Qt.Key_Return, Qt.Key_Escape, Qt.Key_Tab]
for (var i = 0; i < keys.length; ++i) {
- control.spy.reset()
+ sequenceSpy.reset()
keyClick(keys[i])
compare(control.checked, true)
- verify(control.spy.success)
+ verify(sequenceSpy.success)
}
control.destroy()
diff --git a/tests/auto/controls/data/tst_spinbox.qml b/tests/auto/controls/data/tst_spinbox.qml
index 30db246f..de44415d 100644
--- a/tests/auto/controls/data/tst_spinbox.qml
+++ b/tests/auto/controls/data/tst_spinbox.qml
@@ -520,4 +520,66 @@ TestCase {
control.destroy()
}
+
+ function test_autoRepeat() {
+ var control = spinBox.createObject(testCase)
+ verify(control)
+
+ compare(control.value, 0)
+
+ var valueSpy = signalSpy.createObject(control, {target: control, signalName: "valueChanged"})
+ verify(valueSpy.valid)
+
+ var countBefore = 0
+
+ // repeat up
+ mousePress(control.up.indicator)
+ verify(control.up.pressed)
+ compare(valueSpy.count, 0)
+ valueSpy.wait()
+ valueSpy.wait()
+ countBefore = valueSpy.count
+ mouseRelease(control.up.indicator)
+ verify(!control.up.pressed)
+ compare(valueSpy.count, countBefore)
+
+ valueSpy.clear()
+
+ // repeat down
+ mousePress(control.down.indicator)
+ verify(control.down.pressed)
+ compare(valueSpy.count, 0)
+ valueSpy.wait()
+ valueSpy.wait()
+ countBefore = valueSpy.count
+ mouseRelease(control.down.indicator)
+ verify(!control.down.pressed)
+ compare(valueSpy.count, countBefore)
+
+ mousePress(control.up.indicator)
+ verify(control.up.pressed)
+ valueSpy.wait()
+
+ // move inside during repeat -> continue repeat (QTBUG-57085)
+ mouseMove(control.up.indicator, control.up.indicator.width / 4, control.up.indicator.height / 4)
+ verify(control.up.pressed)
+ valueSpy.wait()
+
+ valueSpy.clear()
+
+ // move outside during repeat -> stop repeat
+ mouseMove(control.up.indicator, -1, -1)
+ verify(!control.up.pressed)
+ // NOTE: The following wait() is NOT a reliable way to test that the
+ // auto-repeat timer is not running, but there's no way dig into the
+ // private APIs from QML. If this test ever fails in the future, it
+ // indicates that the auto-repeat timer logic is broken.
+ wait(125)
+ compare(valueSpy.count, 0)
+
+ mouseRelease(control.up.indicator, -1, -1)
+ verify(!control.up.pressed)
+
+ control.destroy()
+ }
}