diff options
author | J-P Nurmi <jpnurmi@qt.io> | 2017-04-27 15:29:53 +0200 |
---|---|---|
committer | J-P Nurmi <jpnurmi@qt.io> | 2017-04-27 18:44:08 +0000 |
commit | 09b9a551c8eadc4e406468af09b44c14ea6c7b7f (patch) | |
tree | 64836931a529019e2a1dfa488d71e134bae840ee /src | |
parent | f9552a96a7c6f8ea58d8ea90cf3027cc0636bf64 (diff) |
Fix Popup.CloseOnRelease for non-modal popups
Change-Id: I70ac251a02a7856e6770cdb9b3e5b2a2d027d133
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/quicktemplates2/qquickoverlay.cpp | 76 | ||||
-rw-r--r-- | src/quicktemplates2/qquickoverlay_p.h | 1 |
2 files changed, 71 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 diff --git a/src/quicktemplates2/qquickoverlay_p.h b/src/quicktemplates2/qquickoverlay_p.h index 3a535b93..7d1ff143 100644 --- a/src/quicktemplates2/qquickoverlay_p.h +++ b/src/quicktemplates2/qquickoverlay_p.h @@ -92,6 +92,7 @@ protected: void wheelEvent(QWheelEvent *event) override; #endif bool childMouseEventFilter(QQuickItem *item, QEvent *event) override; + bool eventFilter(QObject *object, QEvent *event) override; private: Q_DISABLE_COPY(QQuickOverlay) |