aboutsummaryrefslogtreecommitdiffstats
path: root/src/quicktemplates2/qquickoverlay.cpp
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@qt.io>2017-04-27 11:53:54 +0200
committerJ-P Nurmi <jpnurmi@qt.io>2017-04-27 14:33:39 +0000
commitc96cdc8728361864f24c0f4612a9eee2215927f6 (patch)
treefd048e65b399144997c0e4c6f210f95395f88f9d /src/quicktemplates2/qquickoverlay.cpp
parent6060986368fcd14559141233719c767b97992590 (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.cpp146
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;
}