diff options
author | J-P Nurmi <jpnurmi@theqtcompany.com> | 2016-01-27 17:27:39 +0100 |
---|---|---|
committer | J-P Nurmi <jpnurmi@theqtcompany.com> | 2016-01-28 09:29:25 +0000 |
commit | 39af88a8da473afe039201164a4c2a7980f7c2f9 (patch) | |
tree | 7457eca707ac31e0522bcaf1530ae0064742935b /src/templates/qquickoverlay.cpp | |
parent | de74c0ee3eab435f2a95849216129ac8e7043972 (diff) |
Replace Popup::pressed|releasedOutside with close policy flags
Change-Id: I3e09c4e2b6cbbe39bdf9e943905664e5dc1fe954
Reviewed-by: Mitch Curtis <mitch.curtis@theqtcompany.com>
Diffstat (limited to 'src/templates/qquickoverlay.cpp')
-rw-r--r-- | src/templates/qquickoverlay.cpp | 51 |
1 files changed, 32 insertions, 19 deletions
diff --git a/src/templates/qquickoverlay.cpp b/src/templates/qquickoverlay.cpp index ab32d118..09fa05b4 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 = QQuickPopupPrivate::get(popup)->popupItem; + QQuickItem *parentItem = QQuickPopupPrivate::get(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); @@ -226,13 +247,8 @@ void QQuickOverlay::mousePressEvent(QMouseEvent *event) event->setAccepted(d->modalPopups > 0); emit pressed(); - foreach (QQuickPopup *popup, d->popups) { - if (popup->closePolicy().testFlag(QQuickPopup::OnPressOutside)) { - QQuickItem *popupItem = QQuickPopupPrivate::get(popup)->popupItem; - if (!popupItem->contains(mapToItem(popupItem, event->pos()))) - popup->close(); - } - } + foreach (QQuickPopup *popup, d->popups) + d->closePopup(popup, event); } void QQuickOverlay::mouseMoveEvent(QMouseEvent *event) @@ -247,13 +263,8 @@ void QQuickOverlay::mouseReleaseEvent(QMouseEvent *event) event->setAccepted(d->modalPopups > 0); emit released(); - foreach (QQuickPopup *popup, d->popups) { - if (popup->closePolicy().testFlag(QQuickPopup::OnReleaseOutside)) { - QQuickItem *popupItem = QQuickPopupPrivate::get(popup)->popupItem; - if (!popupItem->contains(mapToItem(popupItem, event->pos()))) - popup->close(); - } - } + foreach (QQuickPopup *popup, d->popups) + d->closePopup(popup, event); } void QQuickOverlay::wheelEvent(QWheelEvent *event) @@ -283,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; |