aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@theqtcompany.com>2016-03-17 11:00:50 +0100
committerJ-P Nurmi <jpnurmi@theqtcompany.com>2016-03-17 14:54:45 +0000
commitfec1a78618bae112ff8d1c0e6f078ea890cf283e (patch)
tree6cba021252ce91ee699f24d5a32737eaed8288cc
parent2f476c5818878c7f2ba94522f805cd140e33989e (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.cpp2
-rw-r--r--tests/auto/controls/data/tst_popup.qml40
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()
+ }
}