aboutsummaryrefslogtreecommitdiffstats
path: root/src/quicktemplates2/qquickoverlay.cpp
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@qt.io>2016-09-22 13:00:54 +0200
committerJ-P Nurmi <jpnurmi@qt.io>2016-09-23 05:15:09 +0000
commit6ed3b0f10fb6b72819b58e9558aa191830aadfcd (patch)
treec528c96fa953c62630020a493e969a7ad0a6f418 /src/quicktemplates2/qquickoverlay.cpp
parent0e8cee6087f060667565029753ba48becf4b4d25 (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.cpp16
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();