diff options
author | J-P Nurmi <jpnurmi@theqtcompany.com> | 2016-03-17 11:00:50 +0100 |
---|---|---|
committer | J-P Nurmi <jpnurmi@theqtcompany.com> | 2016-03-17 14:54:45 +0000 |
commit | fec1a78618bae112ff8d1c0e6f078ea890cf283e (patch) | |
tree | 6cba021252ce91ee699f24d5a32737eaed8288cc | |
parent | 2f476c5818878c7f2ba94522f805cd140e33989e (diff) |
QQuickOverlay: fix background visibility for multiple modal popups
The idea of the "modalPopups > 1" check was to avoid calling QQmlProperty::write(),
but it missed the fact that one modal popup might be still closing while a new modal
popup is already opened. Thus, there's temporarily 2 modal popups visible, and we
must transition the overlay background according to the state of the last shown modal
popup.
Change-Id: If25d83ccaa5adc29a9bc8d660f41fb66f90fb167
Task-number: QTBUG-51916
Reviewed-by: Mitch Curtis <mitch.curtis@theqtcompany.com>
-rw-r--r-- | src/templates/qquickoverlay.cpp | 2 | ||||
-rw-r--r-- | tests/auto/controls/data/tst_popup.qml | 40 |
2 files changed, 41 insertions, 1 deletions
diff --git a/src/templates/qquickoverlay.cpp b/src/templates/qquickoverlay.cpp index dd9d2c5d..cce10e46 100644 --- a/src/templates/qquickoverlay.cpp +++ b/src/templates/qquickoverlay.cpp @@ -64,7 +64,7 @@ public: void QQuickOverlayPrivate::popupAboutToShow() { Q_Q(QQuickOverlay); - if (!background || modalPopups > 1) + if (!background) return; QQuickPopup *popup = qobject_cast<QQuickPopup *>(q->sender()); diff --git a/tests/auto/controls/data/tst_popup.qml b/tests/auto/controls/data/tst_popup.qml index 29eef716..67d9ceac 100644 --- a/tests/auto/controls/data/tst_popup.qml +++ b/tests/auto/controls/data/tst_popup.qml @@ -708,4 +708,44 @@ TestCase { control.destroy() } + + Component { + id: overlayTest + ApplicationWindow { + property alias popup1: popup1 + property alias popup2: popup2 + visible: true + Popup { + id: popup1 + modal: true + exit: Transition { PauseAnimation { duration: 200 } } + } + Popup { + id: popup2 + modal: true + } + } + } + + function test_overlay() { + var window = overlayTest.createObject(testCase) + verify(window) + + window.requestActivate() + tryCompare(window, "active", true) + compare(window.overlay.background.opacity, 0.0) + + window.popup1.open() + compare(window.popup1.visible, true) + compare(window.popup2.visible, false) + tryCompare(window.overlay.background, "opacity", 1.0) + + window.popup1.close() + window.popup2.open() + compare(window.popup2.visible, true) + tryCompare(window.popup1, "visible", false) + compare(window.overlay.background.opacity, 1.0) + + window.destroy() + } } |