diff options
author | Frederik Gladhorn <frederik.gladhorn@theqtcompany.com> | 2016-07-12 16:20:50 +0200 |
---|---|---|
committer | Frederik Gladhorn <frederik.gladhorn@qt.io> | 2016-07-13 13:57:06 +0000 |
commit | 6adc36115f4fc658fb907ee8af3013f2609ae761 (patch) | |
tree | 9f58c534650871fe556c8c790aed6bbf04b0baba /src/quick | |
parent | ccc5c54602821761a2f1a42c4bc473afd53439c9 (diff) |
Add pointerTargets to determine list of items at a position
Change-Id: If4e040063f0141ef745a4ee335cdec0640a73c64
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
Diffstat (limited to 'src/quick')
-rw-r--r-- | src/quick/items/qquickwindow.cpp | 30 | ||||
-rw-r--r-- | src/quick/items/qquickwindow_p.h | 1 |
2 files changed, 31 insertions, 0 deletions
diff --git a/src/quick/items/qquickwindow.cpp b/src/quick/items/qquickwindow.cpp index 4a61c91f21..7a9a096c34 100644 --- a/src/quick/items/qquickwindow.cpp +++ b/src/quick/items/qquickwindow.cpp @@ -2114,6 +2114,36 @@ void QQuickWindowPrivate::deliverPointerEvent(QQuickPointerEvent *event) --pointerEventRecursionGuard; } +// 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 *> targets; + auto itemPrivate = QQuickItemPrivate::get(item); + QPointF itemPos = item->mapFromScene(scenePos); + // if the item clips, we can potentially return early + if (itemPrivate->flags & QQuickItem::ItemClipsChildrenToShape) { + if (!item->contains(itemPos)) + return targets; + } + + // recurse for children + QList<QQuickItem *> children = itemPrivate->paintOrderChildItems(); + for (int ii = children.count() - 1; ii >= 0; --ii) { + QQuickItem *child = children.at(ii); + auto childPrivate = QQuickItemPrivate::get(child); + if (!child->isVisible() || !child->isEnabled() || childPrivate->culled) + continue; + targets << pointerTargets(child, scenePos); + } + + if (item->contains(itemPos) && itemPrivate->acceptedMouseButtons()) { + // add this item last - children take precedence + targets << item; + } + return targets; +} + void QQuickWindowPrivate::deliverTouchEvent(QQuickPointerEvent *event) { qCDebug(DBG_TOUCH) << " - delivering" << event->asTouchEvent(); diff --git a/src/quick/items/qquickwindow_p.h b/src/quick/items/qquickwindow_p.h index 2af60ef9a7..7183d17514 100644 --- a/src/quick/items/qquickwindow_p.h +++ b/src/quick/items/qquickwindow_p.h @@ -173,6 +173,7 @@ public: 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; // hover delivery bool deliverHoverEvent(QQuickItem *, const QPointF &scenePos, const QPointF &lastScenePos, Qt::KeyboardModifiers modifiers, bool &accepted); bool sendHoverEvent(QEvent::Type, QQuickItem *, const QPointF &scenePos, const QPointF &lastScenePos, |