aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMitch Curtis <mitch.curtis@qt.io>2020-08-06 11:12:35 +0200
committerMitch Curtis <mitch.curtis@qt.io>2020-08-19 15:16:43 +0200
commitf3a64b13725081eb94b05dbeb5f68a2298c9163e (patch)
tree03a48c5f4e419b0f00c809bef399d7a03bdd56a3
parent1a5a0a591c35dcf498a232a802087683f2244ecb (diff)
SwipeDelegate: don't emit closed() when already closed
If the mouse is released while our position is 0, it means we were clicked, and we don't need to begin any transitions to close. Fixes: QTBUG-85806 Pick-to: 5.15 Change-Id: Ic521f48e2977c1a99dbecaa585792a7798b9d749 Reviewed-by: Andy Shaw <andy.shaw@qt.io>
-rw-r--r--src/quicktemplates2/qquickswipedelegate.cpp6
-rw-r--r--tests/auto/controls/data/tst_swipedelegate.qml21
2 files changed, 25 insertions, 2 deletions
diff --git a/src/quicktemplates2/qquickswipedelegate.cpp b/src/quicktemplates2/qquickswipedelegate.cpp
index a28d8ecf..3669ce05 100644
--- a/src/quicktemplates2/qquickswipedelegate.cpp
+++ b/src/quicktemplates2/qquickswipedelegate.cpp
@@ -889,7 +889,11 @@ bool QQuickSwipeDelegatePrivate::handleMouseReleaseEvent(QQuickItem *item, QMous
swipePrivate->beginTransition(-1.0);
swipePrivate->wasComplete = true;
} else if (!swipePrivate->isTransitioning()) {
- swipePrivate->beginTransition(0.0);
+ // The position is either <= 0.5 or >= -0.5, so the position should go to 0.
+ // However, if the position was already 0 or close to it, we were just clicked,
+ // and we don't need to start a transition.
+ if (!qFuzzyIsNull(swipePrivate->position))
+ swipePrivate->beginTransition(0.0);
swipePrivate->wasComplete = false;
}
diff --git a/tests/auto/controls/data/tst_swipedelegate.qml b/tests/auto/controls/data/tst_swipedelegate.qml
index 71eb0b99..e5221b54 100644
--- a/tests/auto/controls/data/tst_swipedelegate.qml
+++ b/tests/auto/controls/data/tst_swipedelegate.qml
@@ -196,7 +196,8 @@ TestCase {
mousePress(control, control.width / 2, control.height / 2, Qt.LeftButton);
mouseMove(control, control.width / 2 + distance, control.height / 2);
mouseRelease(control, control.width / 2 + distance, control.height / 2, Qt.LeftButton);
- compare(control.swipe.position, to);
+ compare(control.swipe.position, to, "Expected swipe.position to be " + to
+ + " after swiping from " + from + ", but it's " + control.swipe.position);
if (control.swipe.position === -1.0) {
if (control.swipe.right)
@@ -1110,6 +1111,24 @@ TestCase {
swipe(control, 0.0, -1.0);
}
+ function test_callCloseWhenAlreadyClosed() {
+ let control = createTemporaryObject(swipeDelegateComponent, testCase)
+ verify(control)
+
+ let closedSpy = signalSpyComponent.createObject(control, { target: control.swipe, signalName: "closed" })
+ verify(closedSpy)
+ verify(closedSpy.valid)
+
+ // Calling close() when it's already closed should have no effect.
+ control.swipe.close()
+ compare(closedSpy.count, 0)
+
+ // The game goes for calling close() in response to a click.
+ control.clicked.connect(function() { control.swipe.close() })
+ mouseClick(control)
+ compare(closedSpy.count, 0)
+ }
+
Component {
id: multiActionSwipeDelegateComponent