From e95dc3b4853c1736aef0ef2cc5248ec0aa46e3ff Mon Sep 17 00:00:00 2001 From: Mitch Curtis Date: Fri, 30 Sep 2016 22:47:34 +0200 Subject: Cancel exit transition when the same tooltip is shown again Task-number: QTBUG-54206 Task-number: QTBUG-54532 Change-Id: I7e4d993e3b1e30d7d7956629604f948dd1c85e32 Reviewed-by: J-P Nurmi --- src/quicktemplates2/qquickpopup.cpp | 7 +++-- src/quicktemplates2/qquicktooltip.cpp | 2 +- tests/auto/controls/data/tst_tooltip.qml | 48 ++++++++++++++++++++++++++++++++ 3 files changed, 54 insertions(+), 3 deletions(-) diff --git a/src/quicktemplates2/qquickpopup.cpp b/src/quicktemplates2/qquickpopup.cpp index a3d68266..e4e9cc11 100644 --- a/src/quicktemplates2/qquickpopup.cpp +++ b/src/quicktemplates2/qquickpopup.cpp @@ -770,6 +770,9 @@ QQuickPopupTransitionManager::QQuickPopupTransitionManager(QQuickPopupPrivate *p void QQuickPopupTransitionManager::transitionEnter() { + if (popup->transitionState == QQuickPopupPrivate::ExitTransition) + cancel(); + if (!popup->prepareEnterTransition()) return; @@ -829,7 +832,7 @@ QQuickPopup::~QQuickPopup() void QQuickPopup::open() { Q_D(QQuickPopup); - if (d->visible) + if (d->visible && d->transitionState != QQuickPopupPrivate::ExitTransition) return; if (d->complete) @@ -1767,7 +1770,7 @@ bool QQuickPopup::isVisible() const void QQuickPopup::setVisible(bool visible) { Q_D(QQuickPopup); - if (d->visible == visible) + if (d->visible == visible && d->transitionState != QQuickPopupPrivate::ExitTransition) return; d->visible = visible; diff --git a/src/quicktemplates2/qquicktooltip.cpp b/src/quicktemplates2/qquicktooltip.cpp index 6b025fe5..b793ada5 100644 --- a/src/quicktemplates2/qquicktooltip.cpp +++ b/src/quicktemplates2/qquicktooltip.cpp @@ -256,7 +256,7 @@ QQuickToolTipAttached *QQuickToolTip::qmlAttachedProperties(QObject *object) void QQuickToolTip::open() { Q_D(QQuickToolTip); - if (d->delay > 0) + if (!d->visible && d->delay > 0) d->startDelay(); else QQuickPopup::open(); diff --git a/tests/auto/controls/data/tst_tooltip.qml b/tests/auto/controls/data/tst_tooltip.qml index b80a2cae..82ad01f1 100644 --- a/tests/auto/controls/data/tst_tooltip.qml +++ b/tests/auto/controls/data/tst_tooltip.qml @@ -188,4 +188,52 @@ TestCase { ignoreWarning(":1:30: QML ToolTip: cannot find any window to open popup in.") object.ToolTip.show("") // don't crash (QTBUG-56243) } + + Component { + id: toolTipWithExitTransition + + ToolTip { + enter: Transition { + NumberAnimation { property: "opacity"; from: 0.0; to: 1.0; duration: 100 } + } + exit: Transition { + NumberAnimation { property: "opacity"; from: 1.0; to: 0.0; duration: 1000 } + } + } + } + + function test_makeVisibleWhileExitTransitionRunning_data() { + return [ + { tag: "imperative", imperative: true }, + { tag: "declarative", imperative: false } + ] + } + + function test_makeVisibleWhileExitTransitionRunning(data) { + var control = toolTipWithExitTransition.createObject(testCase) + + // Show, hide, and show the tooltip again. Its exit transition should + // start and get cancelled, and then its enter transition should run. + if (data.imperative) + control.open() + else + control.visible = true + tryCompare(control, "opacity", 1) + + if (data.imperative) + control.close() + else + control.visible = false + verify(control.exit.running) + wait(100) // TODO: replace with tryVerify() in 5.8 + verify(control.opacity < 1) + + if (data.imperative) + control.open() + else + control.visible = true + tryCompare(control, "opacity", 1) + + control.destroy() + } } -- cgit v1.2.3