From be10b714ca2233e3312383a91e6d33da31176ae1 Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Thu, 20 Apr 2017 12:59:28 +0200 Subject: QQuickPopup: implement tryClose() for touch events Task-number: QTBUG-58389 Change-Id: I40aef785cabda228f19c74a064187df509aa9916 Reviewed-by: Mitch Curtis --- src/quicktemplates2/qquickdrawer.cpp | 4 ++-- src/quicktemplates2/qquickpopup.cpp | 43 +++++++++++++++++++++++++++++++---- src/quicktemplates2/qquickpopup_p_p.h | 2 +- 3 files changed, 41 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/quicktemplates2/qquickdrawer.cpp b/src/quicktemplates2/qquickdrawer.cpp index ca1df07e..a149eb54 100644 --- a/src/quicktemplates2/qquickdrawer.cpp +++ b/src/quicktemplates2/qquickdrawer.cpp @@ -653,12 +653,12 @@ bool QQuickDrawer::overlayEvent(QQuickItem *item, QEvent *event) return false; case QEvent::MouseButtonPress: - d->tryClose(item, static_cast(event)); + d->tryClose(item, event); return d->handleMousePressEvent(item, static_cast(event)); case QEvent::MouseMove: return d->handleMouseMoveEvent(item, static_cast(event)); case QEvent::MouseButtonRelease: - d->tryClose(item, static_cast(event)); + d->tryClose(item, event); return d->handleMouseReleaseEvent(item, static_cast(event)); default: return QQuickPopup::overlayEvent(item, event); 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 +#include #include #include #include @@ -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 pos; + + switch (event->type()) { + case QEvent::MouseButtonPress: + case QEvent::MouseButtonRelease: + pos = static_cast(event)->pos(); + isPress = event->type() == QEvent::MouseButtonPress; + break; + + case QEvent::TouchBegin: + case QEvent::TouchUpdate: + case QEvent::TouchEnd: + for (const QTouchEvent::TouchPoint &point : static_cast(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(event)); + d->tryClose(item, event); return d->modal; default: diff --git a/src/quicktemplates2/qquickpopup_p_p.h b/src/quicktemplates2/qquickpopup_p_p.h index 8490532c..b68f18f6 100644 --- a/src/quicktemplates2/qquickpopup_p_p.h +++ b/src/quicktemplates2/qquickpopup_p_p.h @@ -95,7 +95,7 @@ public: void init(); void closeOrReject(); - bool tryClose(QQuickItem *item, QMouseEvent *event); + bool tryClose(QQuickItem *item, QEvent *event); virtual bool acceptTouch(const QTouchEvent::TouchPoint &point); virtual void handlePress(const QPointF &point); -- cgit v1.2.3