aboutsummaryrefslogtreecommitdiffstats
path: root/src/quicktemplates2/qquickpopup.cpp
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@qt.io>2017-04-20 12:59:28 +0200
committerJ-P Nurmi <jpnurmi@qt.io>2017-04-21 07:52:36 +0000
commitbe10b714ca2233e3312383a91e6d33da31176ae1 (patch)
treebf7701a2dc5b2d1eb042ef8570a3bdc3bbbebfeb /src/quicktemplates2/qquickpopup.cpp
parent7f06ac49129d9048e98afb14b0ff4ebdcb821c35 (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.cpp43
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: