aboutsummaryrefslogtreecommitdiffstats
path: root/src/templates/qquickoverlay.cpp
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@theqtcompany.com>2016-01-27 17:27:39 +0100
committerJ-P Nurmi <jpnurmi@theqtcompany.com>2016-01-28 09:29:25 +0000
commit39af88a8da473afe039201164a4c2a7980f7c2f9 (patch)
tree7457eca707ac31e0522bcaf1530ae0064742935b /src/templates/qquickoverlay.cpp
parentde74c0ee3eab435f2a95849216129ac8e7043972 (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.cpp51
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;