summaryrefslogtreecommitdiffstats
path: root/src/compositor/compositor_api/qwaylandquickoutput.cpp
diff options
context:
space:
mode:
authorJohan Klokkhammer Helsing <johan.helsing@qt.io>2016-06-02 16:12:23 +0200
committerJohan Helsing <johan.helsing@qt.io>2016-06-06 08:51:35 +0000
commit728eb92ee89525d014eb67f3f4cab7f10ef85f28 (patch)
tree49ece5e948117e217be25123e46bd9e60b66de24 /src/compositor/compositor_api/qwaylandquickoutput.cpp
parentc1e28e6e3bcbe36eb63c348bb58990dcd6cbcba5 (diff)
Add QWaylandQuickOutput::pickClickableItem
A way to get the topmost item at the given position that accepts mouse buttons. Change-Id: I518a8ae15d12ea4c464f06ee437d4cffe3e61115 Reviewed-by: Paul Olav Tvete <paul.tvete@theqtcompany.com> Reviewed-by: Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
Diffstat (limited to 'src/compositor/compositor_api/qwaylandquickoutput.cpp')
-rw-r--r--src/compositor/compositor_api/qwaylandquickoutput.cpp39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/compositor/compositor_api/qwaylandquickoutput.cpp b/src/compositor/compositor_api/qwaylandquickoutput.cpp
index 8abf6cbb1..0e25362fc 100644
--- a/src/compositor/compositor_api/qwaylandquickoutput.cpp
+++ b/src/compositor/compositor_api/qwaylandquickoutput.cpp
@@ -37,6 +37,7 @@
#include "qwaylandquickoutput.h"
#include "qwaylandquickcompositor.h"
+#include "qwaylandquickitem_p.h"
QT_BEGIN_NAMESPACE
@@ -102,6 +103,44 @@ void QWaylandQuickOutput::setAutomaticFrameCallback(bool automatic)
automaticFrameCallbackChanged();
}
+static QQuickItem* clickableItemAtPosition(QQuickItem *rootItem, const QPointF &position)
+{
+ if (!rootItem->isEnabled() || !rootItem->isVisible())
+ return nullptr;
+
+ QList<QQuickItem *> paintOrderItems = QQuickItemPrivate::get(rootItem)->paintOrderChildItems();
+ auto negativeZStart = paintOrderItems.crend();
+ for (auto it = paintOrderItems.crbegin(); it != paintOrderItems.crend(); ++it) {
+ if ((*it)->z() < 0) {
+ negativeZStart = it;
+ break;
+ }
+ QQuickItem *item = clickableItemAtPosition(*it, rootItem->mapToItem(*it, position));
+ if (item)
+ return item;
+ }
+
+ if (rootItem->contains(position) && rootItem->acceptedMouseButtons() != Qt::NoButton)
+ return rootItem;
+
+ for (auto it = negativeZStart; it != paintOrderItems.crend(); ++it) {
+ QQuickItem *item = clickableItemAtPosition(*it, rootItem->mapToItem(*it, position));
+ if (item)
+ return item;
+ }
+
+ return nullptr;
+}
+
+QQuickItem *QWaylandQuickOutput::pickClickableItem(const QPointF &position)
+{
+ QQuickWindow *quickWindow = qobject_cast<QQuickWindow *>(window());
+ if (!quickWindow)
+ return nullptr;
+
+ return clickableItemAtPosition(quickWindow->contentItem(), position);
+}
+
/*!
* \internal
*/