diff options
-rw-r--r-- | src/quicktemplates2/qquickoverlay.cpp | 21 | ||||
-rw-r--r-- | tests/auto/controls/data/tst_popup.qml | 11 | ||||
-rw-r--r-- | tests/auto/popup/tst_popup.cpp | 3 |
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() |