diff options
author | J-P Nurmi <jpnurmi@theqtcompany.com> | 2016-01-28 17:20:42 +0100 |
---|---|---|
committer | J-P Nurmi <jpnurmi@theqtcompany.com> | 2016-01-28 17:22:53 +0100 |
commit | 8318deb165047d592523ec0b2fd10510d4953b37 (patch) | |
tree | e80c082fbe6918e489f61d4f06deb29bbc12fa32 /src/templates/qquickoverlay.cpp | |
parent | 85dc3eb5d0e19d024083a9776d1ac8cf31d708ca (diff) | |
parent | 135b5cdecaeaecb1f3afe01103eac5970399efa7 (diff) |
Merge remote-tracking branch 'origin/5.6' into dev
Conflicts:
src/imports/controls/material/qtlabsmaterialstyleplugin.cpp
src/templates/qquickapplicationwindow_p.h
src/templates/qquickcombobox.cpp
src/templates/qquickcombobox_p.h
src/templates/qquickpopup.cpp
Change-Id: Ibd87e907bc8abf1f675147761ea8bb0b40722478
Diffstat (limited to 'src/templates/qquickoverlay.cpp')
-rw-r--r-- | src/templates/qquickoverlay.cpp | 39 |
1 files changed, 34 insertions, 5 deletions
diff --git a/src/templates/qquickoverlay.cpp b/src/templates/qquickoverlay.cpp index 8b19e8e9..23895d9c 100644 --- a/src/templates/qquickoverlay.cpp +++ b/src/templates/qquickoverlay.cpp @@ -52,6 +52,7 @@ public: void popupAboutToShow(); void popupAboutToHide(); + void closePopup(QQuickPopup *popup, QMouseEvent *event); void drawerPositionChange(); void resizeBackground(); @@ -89,6 +90,30 @@ void QQuickOverlayPrivate::popupAboutToHide() QQmlProperty::write(background, QStringLiteral("opacity"), 0.0); } +void QQuickOverlayPrivate::closePopup(QQuickPopup *popup, QMouseEvent *event) +{ + Q_Q(QQuickOverlay); + const bool isPress = event->type() == QEvent::MouseButtonPress; + const bool onOutside = popup->closePolicy().testFlag(isPress ? QQuickPopup::OnPressOutside : QQuickPopup::OnReleaseOutside); + const bool onOutsideParent = popup->closePolicy().testFlag(isPress ? QQuickPopup::OnPressOutsideParent : QQuickPopup::OnReleaseOutsideParent); + if (onOutside || onOutsideParent) { + QQuickItem *popupItem = popup->popupItem(); + QQuickItem *parentItem = popup->parentItem(); + + if (onOutside && onOutsideParent) { + if (!popupItem->contains(q->mapToItem(popupItem, event->pos())) && + (!parentItem || !parentItem->contains(q->mapToItem(parentItem, event->pos())))) + popup->close(); + } else if (onOutside) { + if (!popupItem->contains(q->mapToItem(popupItem, event->pos()))) + popup->close(); + } else if (onOutsideParent) { + if (!parentItem || !parentItem->contains(q->mapToItem(parentItem, event->pos()))) + popup->close(); + } + } +} + void QQuickOverlayPrivate::drawerPositionChange() { Q_Q(QQuickOverlay); @@ -182,15 +207,11 @@ void QQuickOverlay::itemChange(ItemChange change, const ItemChangeData &data) if (popup->isModal()) ++d->modalPopups; - connect(this, &QQuickOverlay::pressed, popup, &QQuickPopup::pressedOutside); - connect(this, &QQuickOverlay::released, popup, &QQuickPopup::releasedOutside); QObjectPrivate::connect(popup, &QQuickPopup::aboutToShow, d, &QQuickOverlayPrivate::popupAboutToShow); QObjectPrivate::connect(popup, &QQuickPopup::aboutToHide, d, &QQuickOverlayPrivate::popupAboutToHide); } else if (change == ItemChildRemovedChange) { Q_ASSERT(popup == d->popups.value(data.item)); - disconnect(this, &QQuickOverlay::pressed, popup, &QQuickPopup::pressedOutside); - disconnect(this, &QQuickOverlay::released, popup, &QQuickPopup::releasedOutside); QObjectPrivate::disconnect(popup, &QQuickPopup::aboutToShow, d, &QQuickOverlayPrivate::popupAboutToShow); QObjectPrivate::disconnect(popup, &QQuickPopup::aboutToHide, d, &QQuickOverlayPrivate::popupAboutToHide); @@ -225,6 +246,9 @@ void QQuickOverlay::mousePressEvent(QMouseEvent *event) Q_D(QQuickOverlay); event->setAccepted(d->modalPopups > 0); emit pressed(); + + foreach (QQuickPopup *popup, d->popups) + d->closePopup(popup, event); } void QQuickOverlay::mouseMoveEvent(QMouseEvent *event) @@ -238,6 +262,9 @@ void QQuickOverlay::mouseReleaseEvent(QMouseEvent *event) Q_D(QQuickOverlay); event->setAccepted(d->modalPopups > 0); emit released(); + + foreach (QQuickPopup *popup, d->popups) + d->closePopup(popup, event); } void QQuickOverlay::wheelEvent(QWheelEvent *event) @@ -267,7 +294,9 @@ bool QQuickOverlay::childMouseEventFilter(QQuickItem *item, QEvent *event) QQuickPopup *popup = d->popups.value(popupItem); if (popup) { - emit popup->pressedOutside(); + QQuickPopup::ClosePolicy policy = popup->closePolicy(); + if (policy.testFlag(QQuickPopup::OnPressOutside) || policy.testFlag(QQuickPopup::OnPressOutsideParent)) + popup->close(); if (!modalBlocked && popup->isModal()) modalBlocked = true; |