aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/handlers/qquickpointerhandler.cpp
diff options
context:
space:
mode:
authorJan Arve Saether <jan-arve.saether@qt.io>2016-12-23 15:30:33 +0100
committerJan Arve Sæther <jan-arve.saether@qt.io>2016-12-29 10:27:49 +0000
commit70113ef66b245e58ce12e2a9d26268e2eaeb3a42 (patch)
treec3882090db4e76aac1e5c5e7c8da13b41db4806c /src/quick/handlers/qquickpointerhandler.cpp
parent953b5070160a3a1bed7aaf986a1bb1c3b33b0dca (diff)
Don't assume that target is the parent item
To summarize: A pointer handler always gets its pointer events from its parent item. It applies its effect (drag, pinch, ...) on the item referenced to by the target property. By default, target refers to the parent, but that is not always the case. In addition to this we also have to handle the case when the target is null Change-Id: If62108abf0aeb713906bf88472ad9a32a74efff6 Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
Diffstat (limited to 'src/quick/handlers/qquickpointerhandler.cpp')
-rw-r--r--src/quick/handlers/qquickpointerhandler.cpp42
1 files changed, 25 insertions, 17 deletions
diff --git a/src/quick/handlers/qquickpointerhandler.cpp b/src/quick/handlers/qquickpointerhandler.cpp
index 6225d2a24a..d51835a24b 100644
--- a/src/quick/handlers/qquickpointerhandler.cpp
+++ b/src/quick/handlers/qquickpointerhandler.cpp
@@ -60,9 +60,19 @@ QQuickPointerHandler::QQuickPointerHandler(QObject *parent)
, m_target(nullptr)
, m_enabled(true)
, m_active(false)
+ , m_targetExplicitlySet(false)
{
}
+QQuickPointerHandler::~QQuickPointerHandler()
+{
+ QQuickItem *parItem = parentItem();
+ if (parItem) {
+ QQuickItemPrivate *p = QQuickItemPrivate::get(parItem);
+ p->extra.value().pointerHandlers.removeOne(this);
+ }
+}
+
void QQuickPointerHandler::setGrab(QQuickEventPoint *point, bool grab)
{
if (grab) {
@@ -81,14 +91,16 @@ void QQuickPointerHandler::setGrab(QQuickEventPoint *point, bool grab)
QPointF QQuickPointerHandler::eventPos(const QQuickEventPoint *point) const
{
- return (m_target ? m_target->mapFromScene(point->scenePos()) : point->scenePos());
+ return (target() ? target()->mapFromScene(point->scenePos()) : point->scenePos());
}
-bool QQuickPointerHandler::targetContains(const QQuickEventPoint *point) const
+bool QQuickPointerHandler::parentContains(const QQuickEventPoint *point) const
{
- if (!m_target || !point)
- return false;
- return m_target->contains(m_target->mapFromScene(point->scenePos()));
+ if (point) {
+ if (QQuickItem *par = parentItem())
+ return par->contains(par->mapFromScene(point->scenePos()));
+ }
+ return false;
}
/*!
@@ -111,25 +123,21 @@ void QQuickPointerHandler::setEnabled(bool enabled)
void QQuickPointerHandler::setTarget(QQuickItem *target)
{
+ m_targetExplicitlySet = true;
if (m_target == target)
return;
- if (m_target) {
- QQuickItemPrivate *p = QQuickItemPrivate::get(m_target);
- p->extra.value().pointerHandlers.removeOne(this);
- }
-
m_target = target;
- if (m_target) {
- QQuickItemPrivate *p = QQuickItemPrivate::get(m_target);
- p->extra.value().pointerHandlers.append(this);
- // Accept all buttons, and leave filtering to pointerEvent() and/or user JS,
- // because there can be multiple handlers...
- m_target->setAcceptedMouseButtons(Qt::AllButtons);
- }
emit targetChanged();
}
+QQuickItem *QQuickPointerHandler::target() const
+{
+ if (!m_targetExplicitlySet)
+ return parentItem();
+ return m_target;
+}
+
void QQuickPointerHandler::handlePointerEvent(QQuickPointerEvent *event)
{
const bool wants = wantsPointerEvent(event);