aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/quick/items/qquickwindow.cpp42
-rw-r--r--src/quick/items/qquickwindow_p.h4
2 files changed, 16 insertions, 30 deletions
diff --git a/src/quick/items/qquickwindow.cpp b/src/quick/items/qquickwindow.cpp
index 339e770910..cc422361f8 100644
--- a/src/quick/items/qquickwindow.cpp
+++ b/src/quick/items/qquickwindow.cpp
@@ -1626,7 +1626,7 @@ bool QQuickWindowPrivate::deliverInitialMousePressEvent(QMouseEvent *event)
{
Q_Q(QQuickWindow);
- QVector<QQuickItem *> targets = pointerTargets(contentItem, event->windowPos());
+ QVector<QQuickItem *> targets = pointerTargets(contentItem, event->windowPos(), true);
for (QQuickItem *item: qAsConst(targets)) {
QQuickItemPrivate *itemPrivate = QQuickItemPrivate::get(item);
if (itemPrivate->acceptedMouseButtons() & event->button()) {
@@ -2141,7 +2141,7 @@ void QQuickWindowPrivate::deliverPointerEvent(QQuickPointerEvent *event)
// check if item or any of its child items contain the point
// FIXME: should this be iterative instead of recursive?
-QVector<QQuickItem *> QQuickWindowPrivate::pointerTargets(QQuickItem *item, const QPointF &scenePos) const
+QVector<QQuickItem *> QQuickWindowPrivate::pointerTargets(QQuickItem *item, const QPointF &scenePos, bool checkMouseButtons) const
{
QVector<QQuickItem *> targets;
auto itemPrivate = QQuickItemPrivate::get(item);
@@ -2159,10 +2159,10 @@ QVector<QQuickItem *> QQuickWindowPrivate::pointerTargets(QQuickItem *item, cons
auto childPrivate = QQuickItemPrivate::get(child);
if (!child->isVisible() || !child->isEnabled() || childPrivate->culled)
continue;
- targets << pointerTargets(child, scenePos);
+ targets << pointerTargets(child, scenePos, false);
}
- if (item->contains(itemPos) && itemPrivate->acceptedMouseButtons()) {
+ if (item->contains(itemPos) && (!checkMouseButtons || itemPrivate->acceptedMouseButtons())) {
// add this item last - children take precedence
targets << item;
}
@@ -2197,7 +2197,7 @@ void QQuickWindowPrivate::deliverTouchEvent(QQuickPointerTouchEvent *event)
QSet<QQuickItem *> hasFiltered;
if (event->isPressEvent())
- deliverNewTouchPoints(contentItem, event, &hasFiltered);
+ deliverNewTouchPoints(event, &hasFiltered);
if (!event->allPointsAccepted())
deliverUpdatedTouchPoints(event, &hasFiltered);
@@ -2236,33 +2236,19 @@ bool QQuickWindowPrivate::deliverUpdatedTouchPoints(QQuickPointerTouchEvent *eve
return false;
}
-// This function recurses and sends the events to the individual items
-bool QQuickWindowPrivate::deliverNewTouchPoints(QQuickItem *item, QQuickPointerTouchEvent *event, QSet<QQuickItem *> *hasFiltered)
+// Deliver newly pressed touch points
+bool QQuickWindowPrivate::deliverNewTouchPoints(QQuickPointerTouchEvent *event, QSet<QQuickItem *> *hasFiltered)
{
- QQuickItemPrivate *itemPrivate = QQuickItemPrivate::get(item);
-
- // Check if our children want the event (or parts of it)
- // This is the only point where touch event delivery recurses!
- QList<QQuickItem *> children = itemPrivate->paintOrderChildItems();
- for (int ii = children.count() - 1; ii >= 0; --ii) {
- QQuickItem *child = children.at(ii);
- if (!child->isEnabled() || !child->isVisible() || QQuickItemPrivate::get(child)->culled)
- continue;
- if (deliverNewTouchPoints(child, event, hasFiltered))
- return true;
+ const QVector<QPointF> points = event->unacceptedPressedPointScenePositions();
+ QVector<QQuickItem *> targetItems;
+ for (QPointF point: points) {
+ QVector<QQuickItem *> targetItemsForPoint = pointerTargets(contentItem, point, false);
+ targetItems = mergePointerTargets(targetItems, targetItemsForPoint);
}
- // None of the children accepted the event, so check the given item itself.
- // First, construct matchingPoints as a list of TouchPoints which the
- // given item might be interested in. Any newly-pressed point which is
- // inside the item's bounds will be interesting, and also any updated point
- // which was already accepted by that item when it was first pressed.
- // (A point which was already accepted is effectively "grabbed" by the item.)
-
- // This item might be interested in the event.
- deliverMatchingPointsToItem(item, event, hasFiltered);
+ for (QQuickItem *item: targetItems)
+ deliverMatchingPointsToItem(item, event, hasFiltered);
- // recursion is done only if ALL touch points have been delivered
return event->allPointsAccepted();
}
diff --git a/src/quick/items/qquickwindow_p.h b/src/quick/items/qquickwindow_p.h
index 51804653f7..cd63f5a8f6 100644
--- a/src/quick/items/qquickwindow_p.h
+++ b/src/quick/items/qquickwindow_p.h
@@ -167,14 +167,14 @@ public:
void deliverPointerEvent(QQuickPointerEvent *);
void deliverTouchEvent(QQuickPointerTouchEvent *);
bool deliverTouchCancelEvent(QTouchEvent *);
- bool deliverNewTouchPoints(QQuickItem *, QQuickPointerTouchEvent *, QSet<QQuickItem *> *);
+ bool deliverNewTouchPoints(QQuickPointerTouchEvent *, QSet<QQuickItem *> *);
bool deliverUpdatedTouchPoints(QQuickPointerTouchEvent *event, QSet<QQuickItem *> *hasFiltered);
bool deliverMatchingPointsToItem(QQuickItem *item, const QQuickPointerTouchEvent *event, QSet<QQuickItem*> *filtered);
static QTouchEvent *touchEventForItem(QQuickItem *target, const QTouchEvent &originalEvent);
static QTouchEvent *touchEventWithPoints(const QTouchEvent &event, const QList<QTouchEvent::TouchPoint> &newPoints);
bool sendFilteredTouchEvent(QQuickItem *target, QQuickItem *item, QTouchEvent *event, QSet<QQuickItem*> *filtered);
- QVector<QQuickItem *> pointerTargets(QQuickItem *, const QPointF &) const;
+ QVector<QQuickItem *> pointerTargets(QQuickItem *, const QPointF &, bool checkMouseButtons) const;
QVector<QQuickItem *> mergePointerTargets(const QVector<QQuickItem *> &list1, const QVector<QQuickItem *> &list2) const;
// hover delivery