diff options
author | J-P Nurmi <jpnurmi@qt.io> | 2017-04-20 12:59:28 +0200 |
---|---|---|
committer | J-P Nurmi <jpnurmi@qt.io> | 2017-04-21 07:52:36 +0000 |
commit | be10b714ca2233e3312383a91e6d33da31176ae1 (patch) | |
tree | bf7701a2dc5b2d1eb042ef8570a3bdc3bbbebfeb /src/quicktemplates2/qquickpopup.cpp | |
parent | 7f06ac49129d9048e98afb14b0ff4ebdcb821c35 (diff) |
QQuickPopup: implement tryClose() for touch events
Task-number: QTBUG-58389
Change-Id: I40aef785cabda228f19c74a064187df509aa9916
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
Diffstat (limited to 'src/quicktemplates2/qquickpopup.cpp')
-rw-r--r-- | src/quicktemplates2/qquickpopup.cpp | 43 |
1 files changed, 38 insertions, 5 deletions
diff --git a/src/quicktemplates2/qquickpopup.cpp b/src/quicktemplates2/qquickpopup.cpp index cc62db10..1598bb1b 100644 --- a/src/quicktemplates2/qquickpopup.cpp +++ b/src/quicktemplates2/qquickpopup.cpp @@ -44,6 +44,7 @@ #include "qquickdialog_p.h" #include <QtQml/qqmlinfo.h> +#include <QtQml/private/qqmlnullablevalue_p.h> #include <QtQuick/qquickitem.h> #include <QtQuick/private/qquicktransition_p.h> #include <QtQuick/private/qquickitem_p.h> @@ -272,17 +273,46 @@ void QQuickPopupPrivate::closeOrReject() q->close(); } -bool QQuickPopupPrivate::tryClose(QQuickItem *item, QMouseEvent *event) +bool QQuickPopupPrivate::tryClose(QQuickItem *item, QEvent *event) { if (!interactive) return false; - const bool isPress = event->type() == QEvent::MouseButtonPress; + bool isPress = false; + QQmlNullableValue<QPointF> pos; + + switch (event->type()) { + case QEvent::MouseButtonPress: + case QEvent::MouseButtonRelease: + pos = static_cast<QMouseEvent *>(event)->pos(); + isPress = event->type() == QEvent::MouseButtonPress; + break; + + case QEvent::TouchBegin: + case QEvent::TouchUpdate: + case QEvent::TouchEnd: + for (const QTouchEvent::TouchPoint &point : static_cast<QTouchEvent *>(event)->touchPoints()) { + if (point.state() == Qt::TouchPointMoved) + continue; + + pos = point.pos(); + isPress = point.state() == Qt::TouchPointPressed; + break; // TODO: multiple touch points + } + break; + + default: + break; + } + + if (pos.isNull) // ignore touch moves + return false; + const bool onOutside = closePolicy.testFlag(isPress ? QQuickPopup::CloseOnPressOutside : QQuickPopup::CloseOnReleaseOutside); const bool onOutsideParent = closePolicy.testFlag(isPress ? QQuickPopup::CloseOnPressOutsideParent : QQuickPopup::CloseOnReleaseOutsideParent); if (onOutside || onOutsideParent) { - if (!popupItem->contains(item->mapToItem(popupItem, event->pos()))) { - if (!onOutsideParent || !parentItem || !parentItem->contains(item->mapToItem(parentItem, event->pos()))) { + if (!popupItem->contains(item->mapToItem(popupItem, pos))) { + if (!onOutsideParent || !parentItem || !parentItem->contains(item->mapToItem(parentItem, pos))) { closeOrReject(); return true; } @@ -1881,11 +1911,14 @@ bool QQuickPopup::overlayEvent(QQuickItem *item, QEvent *event) event->accept(); return d->modal; + case QEvent::TouchBegin: + case QEvent::TouchUpdate: + case QEvent::TouchEnd: case QEvent::MouseButtonPress: case QEvent::MouseButtonRelease: if (d->modal) event->accept(); - d->tryClose(item, static_cast<QMouseEvent *>(event)); + d->tryClose(item, event); return d->modal; default: |