aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick
diff options
context:
space:
mode:
authorFrederik Gladhorn <frederik.gladhorn@theqtcompany.com>2016-07-12 16:20:50 +0200
committerFrederik Gladhorn <frederik.gladhorn@qt.io>2016-07-13 13:57:06 +0000
commit6adc36115f4fc658fb907ee8af3013f2609ae761 (patch)
tree9f58c534650871fe556c8c790aed6bbf04b0baba /src/quick
parentccc5c54602821761a2f1a42c4bc473afd53439c9 (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.cpp30
-rw-r--r--src/quick/items/qquickwindow_p.h1
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,