diff options
author | J-P Nurmi <jpnurmi@qt.io> | 2016-09-22 13:00:54 +0200 |
---|---|---|
committer | J-P Nurmi <jpnurmi@qt.io> | 2016-09-23 05:15:09 +0000 |
commit | 6ed3b0f10fb6b72819b58e9558aa191830aadfcd (patch) | |
tree | c528c96fa953c62630020a493e969a7ad0a6f418 /src/quicktemplates2/qquickoverlay.cpp | |
parent | 0e8cee6087f060667565029753ba48becf4b4d25 (diff) |
Fix nested popups
Task-number: QTBUG-56136
Change-Id: I3ed7fae09c342c2c456b94fc0cfed781d8edf6aa
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
Diffstat (limited to 'src/quicktemplates2/qquickoverlay.cpp')
-rw-r--r-- | src/quicktemplates2/qquickoverlay.cpp | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/src/quicktemplates2/qquickoverlay.cpp b/src/quicktemplates2/qquickoverlay.cpp index 2855ba8b..ba0dfc46 100644 --- a/src/quicktemplates2/qquickoverlay.cpp +++ b/src/quicktemplates2/qquickoverlay.cpp @@ -388,9 +388,19 @@ void QQuickOverlay::wheelEvent(QWheelEvent *event) bool QQuickOverlay::childMouseEventFilter(QQuickItem *item, QEvent *event) { Q_D(QQuickOverlay); - for (QQuickPopup *popup : qAsConst(d->allPopups)) { - QQuickItem *dimmer = QQuickPopupPrivate::get(popup)->dimmer; - if (item == dimmer) { + const auto popups = d->stackingOrderPopups(); + for (QQuickPopup *popup : popups) { + QQuickPopupPrivate *p = QQuickPopupPrivate::get(popup); + + // Stop filtering overlay events when reaching a popup item or an item + // that is inside the popup. Let the popup content handle its events. + if (item == p->popupItem || p->popupItem->isAncestorOf(item)) + break; + + // Let the popup try closing itself when pressing or releasing over its + // background dimming OR over another popup underneath, in case the popup + // does not have background dimming. + if (item == p->dimmer || !p->popupItem->isAncestorOf(item)) { switch (event->type()) { case QEvent::MouseButtonPress: emit pressed(); |