diff options
author | Andrew den Exter <andrew.den-exter@nokia.com> | 2011-06-21 17:00:46 +1000 |
---|---|---|
committer | Andrew den Exter <andrew.den-exter@nokia.com> | 2011-06-21 17:00:46 +1000 |
commit | fad0a10d48f6d8c2cc485d9265c49792a3893eb4 (patch) | |
tree | ba9fe1bd5d4b46fa9835b6d5bbaa474c174072ad | |
parent | 576ba2e1c5b7867545ea25feff3354c61c485f8a (diff) |
Drag items relative to their scene position.
This preserves the absolute position of a dragged item when its parent
is changed.
-rw-r--r-- | src/declarative/items/qsgmousearea.cpp | 14 | ||||
-rw-r--r-- | src/declarative/items/qsgmousearea_p_p.h | 3 |
2 files changed, 11 insertions, 6 deletions
diff --git a/src/declarative/items/qsgmousearea.cpp b/src/declarative/items/qsgmousearea.cpp index 8ed72190f8..6886ccca35 100644 --- a/src/declarative/items/qsgmousearea.cpp +++ b/src/declarative/items/qsgmousearea.cpp @@ -501,9 +501,11 @@ void QSGMouseArea::mouseMoveEvent(QGraphicsSceneMouseEvent *event) setHovered(true); if (d->drag && d->drag->target()) { + if (!d->moved) { - d->startX = drag()->target()->x(); - d->startY = drag()->target()->y(); + d->targetStartPos = d->drag->target()->parentItem() + ? d->drag->target()->parentItem()->mapToScene(d->drag->target()->pos()) + : d->drag->target()->pos(); } QPointF startLocalPos; @@ -539,8 +541,12 @@ void QSGMouseArea::mouseMoveEvent(QGraphicsSceneMouseEvent *event) } } + QPointF startPos = d->drag->target()->parentItem() + ? d->drag->target()->parentItem()->mapFromScene(d->targetStartPos) + : d->targetStartPos; + if (d->dragX && d->drag->active()) { - qreal x = (curLocalPos.x() - startLocalPos.x()) + d->startX; + qreal x = (curLocalPos.x() - startLocalPos.x()) + startPos.x(); if (x < drag()->xmin()) x = drag()->xmin(); else if (x > drag()->xmax()) @@ -548,7 +554,7 @@ void QSGMouseArea::mouseMoveEvent(QGraphicsSceneMouseEvent *event) drag()->target()->setX(x); } if (d->dragY && d->drag->active()) { - qreal y = (curLocalPos.y() - startLocalPos.y()) + d->startY; + qreal y = (curLocalPos.y() - startLocalPos.y()) + startPos.y(); if (y < drag()->ymin()) y = drag()->ymin(); else if (y > drag()->ymax()) diff --git a/src/declarative/items/qsgmousearea_p_p.h b/src/declarative/items/qsgmousearea_p_p.h index 11f7089503..0eb0444224 100644 --- a/src/declarative/items/qsgmousearea_p_p.h +++ b/src/declarative/items/qsgmousearea_p_p.h @@ -99,8 +99,7 @@ public: bool dragRejected : 1; QSGDrag *drag; QPointF startScene; - qreal startX; - qreal startY; + QPointF targetStartPos; QPointF lastPos; QDeclarativeNullableValue<QPointF> lastScenePos; Qt::MouseButton lastButton; |