From: Andrew den Exter Date: Tue, 21 Jun 2011 07:00:46 +0000 (+1000) Subject: Drag items relative to their scene position. X-Git-Url: http://git.silmor.de/gitweb/?a=commitdiff_plain;h=fad0a10d48f6d8c2cc485d9265c49792a3893eb4;p=konrad%2Fqtdeclarative.git Drag items relative to their scene position. This preserves the absolute position of a dragged item when its parent is changed. --- diff --git a/src/declarative/items/qsgmousearea.cpp b/src/declarative/items/qsgmousearea.cpp index 8ed7219..6886ccc 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 11f7089..0eb0444 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 lastScenePos; Qt::MouseButton lastButton;