aboutsummaryrefslogtreecommitdiffstats
path: root/src/quicktemplates2/qquickoverlay.cpp
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@qt.io>2017-04-27 15:29:53 +0200
committerJ-P Nurmi <jpnurmi@qt.io>2017-04-27 18:44:08 +0000
commit09b9a551c8eadc4e406468af09b44c14ea6c7b7f (patch)
tree64836931a529019e2a1dfa488d71e134bae840ee /src/quicktemplates2/qquickoverlay.cpp
parentf9552a96a7c6f8ea58d8ea90cf3027cc0636bf64 (diff)
Fix Popup.CloseOnRelease for non-modal popups
Change-Id: I70ac251a02a7856e6770cdb9b3e5b2a2d027d133 Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
Diffstat (limited to 'src/quicktemplates2/qquickoverlay.cpp')
-rw-r--r--src/quicktemplates2/qquickoverlay.cpp76
1 files changed, 70 insertions, 6 deletions
diff --git a/src/quicktemplates2/qquickoverlay.cpp b/src/quicktemplates2/qquickoverlay.cpp
index 308eda86..60f2a36f 100644
--- a/src/quicktemplates2/qquickoverlay.cpp
+++ b/src/quicktemplates2/qquickoverlay.cpp
@@ -200,9 +200,6 @@ bool QQuickOverlayPrivate::startDrag(QEvent *event)
bool QQuickOverlayPrivate::handlePress(QQuickItem *source, QEvent *event, QQuickPopup *target)
{
- Q_Q(QQuickOverlay);
- emit q->pressed();
-
if (target) {
if (target->overlayEvent(source, event)) {
setMouseGrabberPopup(target);
@@ -234,9 +231,6 @@ bool QQuickOverlayPrivate::handleMove(QQuickItem *source, QEvent *event, QQuickP
bool QQuickOverlayPrivate::handleRelease(QQuickItem *source, QEvent *event, QQuickPopup *target)
{
- Q_Q(QQuickOverlay);
- emit q->released();
-
if (target) {
setMouseGrabberPopup(nullptr);
if (target->overlayEvent(source, event)) {
@@ -350,6 +344,10 @@ QQuickOverlay::QQuickOverlay(QQuickItem *parent)
if (parent) {
setSize(QSizeF(parent->width(), parent->height()));
QQuickItemPrivate::get(parent)->addItemChangeListener(d, QQuickItemPrivate::Geometry);
+ parent->setAcceptedMouseButtons(Qt::AllButtons);
+ parent->installEventFilter(this);
+ if (QQuickWindow *window = parent->window())
+ window->installEventFilter(this);
}
}
@@ -535,4 +533,70 @@ bool QQuickOverlay::childMouseEventFilter(QQuickItem *item, QEvent *event)
return false;
}
+bool QQuickOverlay::eventFilter(QObject *object, QEvent *event)
+{
+ Q_D(QQuickOverlay);
+ if (!isVisible() || !d->window)
+ return false;
+
+ if (object == d->window) {
+ switch (event->type()) {
+ case QEvent::TouchBegin:
+ case QEvent::TouchUpdate:
+ case QEvent::TouchEnd:
+ if (static_cast<QTouchEvent *>(event)->touchPointStates() & Qt::TouchPointPressed)
+ emit pressed();
+ if (static_cast<QTouchEvent *>(event)->touchPointStates() & Qt::TouchPointReleased)
+ emit released();
+
+ // allow non-modal popups to close on touch release outside
+ if (!d->mouseGrabberPopup) {
+ for (const QTouchEvent::TouchPoint &point : static_cast<QTouchEvent *>(event)->touchPoints()) {
+ if (point.state() == Qt::TouchPointReleased) {
+ if (d->handleRelease(d->window->contentItem(), event, nullptr))
+ break;
+ }
+ }
+ }
+ break;
+
+ case QEvent::MouseButtonPress:
+ // do not emit pressed() twice when mouse events have been synthesized from touch events
+ if (static_cast<QMouseEvent *>(event)->source() == Qt::MouseEventNotSynthesized)
+ emit pressed();
+ break;
+
+ case QEvent::MouseButtonRelease:
+ // do not emit released() twice when mouse events have been synthesized from touch events
+ if (static_cast<QMouseEvent *>(event)->source() == Qt::MouseEventNotSynthesized)
+ emit released();
+
+ // allow non-modal popups to close on mouse release outside
+ if (!d->mouseGrabberPopup)
+ d->handleRelease(d->window->contentItem(), event, nullptr);
+ break;
+
+ default:
+ break;
+ }
+ } else if (object == d->window->contentItem()) {
+ // A touch or mouse press has reached the content item of the window,
+ // meaning that nothing at the press point was interested in touch or
+ // mouse events. Make sure to accept the press in order to receive the
+ // consequent move and release events to be able to close non-modal
+ // popups on release outside.
+ switch (event->type()) {
+ case QEvent::TouchBegin:
+ case QEvent::TouchUpdate:
+ case QEvent::MouseButtonPress:
+ event->accept();
+ break;
+ default:
+ break;
+ }
+ }
+
+ return false;
+}
+
QT_END_NAMESPACE