aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/quicktemplates2/qquickoverlay.cpp21
-rw-r--r--tests/auto/controls/data/tst_popup.qml11
-rw-r--r--tests/auto/popup/tst_popup.cpp3
3 files changed, 13 insertions, 22 deletions
diff --git a/src/quicktemplates2/qquickoverlay.cpp b/src/quicktemplates2/qquickoverlay.cpp
index 67eb3ceb..1aec823e 100644
--- a/src/quicktemplates2/qquickoverlay.cpp
+++ b/src/quicktemplates2/qquickoverlay.cpp
@@ -53,7 +53,6 @@ public:
void popupAboutToShow();
void popupAboutToHide();
- void popupClosed();
void createOverlay(QQuickPopup *popup);
void destroyOverlay(QQuickPopup *popup);
@@ -74,8 +73,6 @@ void QQuickOverlayPrivate::popupAboutToShow()
if (!popup || !popup->dim())
return;
- createOverlay(popup);
-
// use QQmlProperty instead of QQuickItem::setOpacity() to trigger QML Behaviors
QQuickPopupPrivate *p = QQuickPopupPrivate::get(popup);
if (p->dimmer)
@@ -95,16 +92,6 @@ void QQuickOverlayPrivate::popupAboutToHide()
QQmlProperty::write(p->dimmer, QStringLiteral("opacity"), 0.0);
}
-void QQuickOverlayPrivate::popupClosed()
-{
- Q_Q(QQuickOverlay);
- QQuickPopup *popup = qobject_cast<QQuickPopup *>(q->sender());
- if (!popup || !popup->dim())
- return;
-
- destroyOverlay(popup);
-}
-
static QQuickItem *createDimmer(QQmlComponent *component, QQuickPopup *popup, QQuickItem *parent)
{
if (!component)
@@ -139,6 +126,7 @@ void QQuickOverlayPrivate::destroyOverlay(QQuickPopup *popup)
{
QQuickPopupPrivate *p = QQuickPopupPrivate::get(popup);
if (p->dimmer) {
+ p->dimmer->setParentItem(nullptr);
p->dimmer->deleteLater();
p->dimmer = nullptr;
}
@@ -218,33 +206,32 @@ void QQuickOverlay::itemChange(ItemChange change, const ItemChangeData &data)
if (change == ItemChildAddedChange) {
d->popups.append(popup);
+ if (popup->dim())
+ d->createOverlay(popup);
QQuickDrawer *drawer = qobject_cast<QQuickDrawer *>(popup);
if (drawer) {
d->drawers.append(drawer);
- d->createOverlay(drawer);
} else {
if (popup->isModal())
++d->modalPopups;
QObjectPrivate::connect(popup, &QQuickPopup::aboutToShow, d, &QQuickOverlayPrivate::popupAboutToShow);
QObjectPrivate::connect(popup, &QQuickPopup::aboutToHide, d, &QQuickOverlayPrivate::popupAboutToHide);
- QObjectPrivate::connect(popup, &QQuickPopup::closed, d, &QQuickOverlayPrivate::popupClosed);
}
} else if (change == ItemChildRemovedChange) {
d->popups.removeOne(popup);
+ d->destroyOverlay(popup);
QQuickDrawer *drawer = qobject_cast<QQuickDrawer *>(popup);
if (drawer) {
d->drawers.removeOne(drawer);
- d->destroyOverlay(drawer);
} else {
if (popup->isModal())
--d->modalPopups;
QObjectPrivate::disconnect(popup, &QQuickPopup::aboutToShow, d, &QQuickOverlayPrivate::popupAboutToShow);
QObjectPrivate::disconnect(popup, &QQuickPopup::aboutToHide, d, &QQuickOverlayPrivate::popupAboutToHide);
- QObjectPrivate::disconnect(popup, &QQuickPopup::closed, d, &QQuickOverlayPrivate::popupClosed);
}
}
}
diff --git a/tests/auto/controls/data/tst_popup.qml b/tests/auto/controls/data/tst_popup.qml
index 50933c20..ecdd1bf2 100644
--- a/tests/auto/controls/data/tst_popup.qml
+++ b/tests/auto/controls/data/tst_popup.qml
@@ -1033,7 +1033,9 @@ TestCase {
window.requestActivate()
tryCompare(window, "active", true)
- compare(window.overlay.children.length, 6) // 3 drawers + 3 overlays
+
+ var countBefore = window.overlay.children.length
+ compare(countBefore, 6) // 3 drawers + 3 overlays
var firstOverlay = findOverlay(window, window.firstDrawer)
verify(firstOverlay)
@@ -1087,6 +1089,7 @@ TestCase {
compare(modalOverlay.z, window.modalPopup.z)
compare(window.modalPopup.visible, true)
tryCompare(modalOverlay, "opacity", 1.0)
+ compare(window.overlay.children.length, countBefore + 2) // 1 popup + 1 overlay
var modelessOverlay = findOverlay(window, window.modelessPopup)
verify(!modelessOverlay)
@@ -1096,23 +1099,23 @@ TestCase {
compare(modelessOverlay.z, window.modelessPopup.z)
compare(window.modelessPopup.visible, true)
tryCompare(modelessOverlay, "opacity", 1.0)
+ compare(window.overlay.children.length, countBefore + 4) // 2 popups + 2 overlays
window.modelessPopup.close()
- tryCompare(modelessOverlay, "opacity", 0.0)
tryCompare(window.modelessPopup, "visible", false)
modelessOverlay = findOverlay(window, window.modelessPopup)
verify(!modelessOverlay)
+ compare(window.overlay.children.length, countBefore + 2) // 1 popup + 1 overlay
compare(window.modalPopup.visible, true)
compare(modalOverlay.opacity, 1.0)
window.modalPopup.close()
- tryCompare(modalOverlay, "opacity", 0.0)
tryCompare(window.modalPopup, "visible", false)
modalOverlay = findOverlay(window, window.modalPopup)
verify(!modalOverlay)
+ compare(window.overlay.children.length, countBefore)
- var countBefore = window.overlay.children.length
window.plainPopup.open()
tryCompare(window.plainPopup, "visible", true)
compare(window.overlay.children.length, countBefore + 1) // only popup added, no overlays involved
diff --git a/tests/auto/popup/tst_popup.cpp b/tests/auto/popup/tst_popup.cpp
index 3da32407..abebc5d0 100644
--- a/tests/auto/popup/tst_popup.cpp
+++ b/tests/auto/popup/tst_popup.cpp
@@ -134,6 +134,7 @@ void tst_popup::overlay()
QVERIFY(!overlay->isVisible());
popup->setModal(true);
+ popup->setClosePolicy(QQuickPopup::CloseOnReleaseOutside);
popup->open();
QVERIFY(popup->isVisible());
@@ -148,7 +149,7 @@ void tst_popup::overlay()
QCOMPARE(overlayReleasedSignal.count(), 1);
QVERIFY(!popup->isVisible());
- QVERIFY(overlay->isVisible());
+ QVERIFY(!overlay->isVisible());
}
void tst_popup::windowChange()