diff options
author | J-P Nurmi <jpnurmi@qt.io> | 2017-04-27 11:53:54 +0200 |
---|---|---|
committer | J-P Nurmi <jpnurmi@qt.io> | 2017-04-27 14:33:39 +0000 |
commit | c96cdc8728361864f24c0f4612a9eee2215927f6 (patch) | |
tree | fd048e65b399144997c0e4c6f210f95395f88f9d /src/quicktemplates2/qquickoverlay.cpp | |
parent | 6060986368fcd14559141233719c767b97992590 (diff) |
QQuickOverlay: add handleMouseEvent() and handleTouchEvent()
To unify overlay event delivery from the child event filter and
the event handlers in QQuickOverlay itself.
Change-Id: I0e867baeda3a8b829fe1d1992ea8289d466afc85
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
Diffstat (limited to 'src/quicktemplates2/qquickoverlay.cpp')
-rw-r--r-- | src/quicktemplates2/qquickoverlay.cpp | 146 |
1 files changed, 88 insertions, 58 deletions
diff --git a/src/quicktemplates2/qquickoverlay.cpp b/src/quicktemplates2/qquickoverlay.cpp index 985c8f3d..308eda86 100644 --- a/src/quicktemplates2/qquickoverlay.cpp +++ b/src/quicktemplates2/qquickoverlay.cpp @@ -198,20 +198,23 @@ bool QQuickOverlayPrivate::startDrag(QEvent *event) return false; } -bool QQuickOverlayPrivate::handlePress(QEvent *event) +bool QQuickOverlayPrivate::handlePress(QQuickItem *source, QEvent *event, QQuickPopup *target) { Q_Q(QQuickOverlay); emit q->pressed(); - if (startDrag(event)) - return true; - - if (!mouseGrabberPopup) { + if (target) { + if (target->overlayEvent(source, event)) { + setMouseGrabberPopup(target); + return true; + } + return false; + } else if (!mouseGrabberPopup) { // allow non-modal popups to close themselves, // and non-dimming modal popups to block the event const auto popups = stackingOrderPopups(); for (QQuickPopup *popup : popups) { - if (popup->overlayEvent(q, event)) { + if (popup->overlayEvent(source, event)) { setMouseGrabberPopup(popup); return true; } @@ -222,34 +225,94 @@ bool QQuickOverlayPrivate::handlePress(QEvent *event) return false; } -bool QQuickOverlayPrivate::handleMove(QEvent *event) +bool QQuickOverlayPrivate::handleMove(QQuickItem *source, QEvent *event, QQuickPopup *target) { - Q_Q(QQuickOverlay); - if (mouseGrabberPopup) - return mouseGrabberPopup->overlayEvent(q, event); + if (target) + return target->overlayEvent(source, event); return false; } -bool QQuickOverlayPrivate::handleRelease(QEvent *event) +bool QQuickOverlayPrivate::handleRelease(QQuickItem *source, QEvent *event, QQuickPopup *target) { Q_Q(QQuickOverlay); emit q->released(); - if (mouseGrabberPopup) { - if (mouseGrabberPopup->overlayEvent(q, event)) { + if (target) { + setMouseGrabberPopup(nullptr); + if (target->overlayEvent(source, event)) { setMouseGrabberPopup(nullptr); return true; } } else { const auto popups = stackingOrderPopups(); for (QQuickPopup *popup : popups) { - if (popup->overlayEvent(q, event)) + if (popup->overlayEvent(source, event)) return true; } } return false; } +bool QQuickOverlayPrivate::handleMouseEvent(QQuickItem *source, QMouseEvent *event, QQuickPopup *target) +{ + switch (event->type()) { + case QEvent::MouseButtonPress: + if (!target && startDrag(event)) + return true; + return handlePress(source, event, target); + case QEvent::MouseMove: + return handleMove(source, event, target ? target : mouseGrabberPopup.data()); + case QEvent::MouseButtonRelease: + return handleRelease(source, event, target ? target : mouseGrabberPopup.data()); + default: + break; + } + return false; +} + +bool QQuickOverlayPrivate::handleTouchEvent(QQuickItem *source, QTouchEvent *event, QQuickPopup *target) +{ + bool handled = false; + switch (event->type()) { + case QEvent::TouchBegin: + if (!target && startDrag(event)) + handled = true; + else + handled = handlePress(source, event, target); + break; + + case QEvent::TouchUpdate: + for (const QTouchEvent::TouchPoint &point : event->touchPoints()) { + switch (point.state()) { + case Qt::TouchPointPressed: + if (!target && startDrag(event)) + handled = true; + else + handled |= handlePress(source, event, target); + break; + case Qt::TouchPointMoved: + handled |= handleMove(source, event, target ? target : mouseGrabberPopup.data()); + break; + case Qt::TouchPointReleased: + handled |= handleRelease(source, event, target ? target : mouseGrabberPopup.data()); + break; + default: + break; + } + } + break; + + case QEvent::TouchEnd: + handled = handleRelease(source, event, target ? target : mouseGrabberPopup.data()); + break; + + default: + break; + } + + return handled; +} + void QQuickOverlayPrivate::addPopup(QQuickPopup *popup) { Q_Q(QQuickOverlay); @@ -398,55 +461,25 @@ void QQuickOverlay::geometryChanged(const QRectF &newGeometry, const QRectF &old void QQuickOverlay::mousePressEvent(QMouseEvent *event) { Q_D(QQuickOverlay); - d->handlePress(event); + d->handleMouseEvent(this, event); } void QQuickOverlay::mouseMoveEvent(QMouseEvent *event) { Q_D(QQuickOverlay); - d->handleMove(event); + d->handleMouseEvent(this, event); } void QQuickOverlay::mouseReleaseEvent(QMouseEvent *event) { Q_D(QQuickOverlay); - d->handleRelease(event); + d->handleMouseEvent(this, event); } void QQuickOverlay::touchEvent(QTouchEvent *event) { Q_D(QQuickOverlay); - switch (event->type()) { - case QEvent::TouchBegin: - d->handlePress(event); - break; - - case QEvent::TouchUpdate: - for (const QTouchEvent::TouchPoint &point : event->touchPoints()) { - switch (point.state()) { - case Qt::TouchPointPressed: - d->handlePress(event); - break; - case Qt::TouchPointMoved: - d->handleMove(event); - break; - case Qt::TouchPointReleased: - d->handleRelease(event); - break; - default: - break; - } - } - break; - - case QEvent::TouchEnd: - d->handleRelease(event); - break; - - default: - QQuickItem::touchEvent(event); - break; - } + d->handleTouchEvent(this, event); } #if QT_CONFIG(wheelevent) @@ -484,19 +517,16 @@ bool QQuickOverlay::childMouseEventFilter(QQuickItem *item, QEvent *event) // does not have background dimming. if (item == p->dimmer || !p->popupItem->isAncestorOf(item)) { switch (event->type()) { + case QEvent::TouchBegin: + case QEvent::TouchUpdate: + case QEvent::TouchEnd: + return d->handleTouchEvent(item, static_cast<QTouchEvent *>(event), popup); + case QEvent::MouseButtonPress: - emit pressed(); - if (popup->overlayEvent(item, event)) { - d->setMouseGrabberPopup(popup); - return true; - } - break; case QEvent::MouseMove: - return popup->overlayEvent(item, event); case QEvent::MouseButtonRelease: - emit released(); - d->setMouseGrabberPopup(nullptr); - return popup->overlayEvent(item, event); + return d->handleMouseEvent(item, static_cast<QMouseEvent *>(event), popup); + default: break; } |