aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew den Exter <andrew.den-exter@nokia.com>2011-06-21 17:00:46 +1000
committerAndrew den Exter <andrew.den-exter@nokia.com>2011-06-21 17:00:46 +1000
commitfad0a10d48f6d8c2cc485d9265c49792a3893eb4 (patch)
treeba9fe1bd5d4b46fa9835b6d5bbaa474c174072ad
parent576ba2e1c5b7867545ea25feff3354c61c485f8a (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.cpp14
-rw-r--r--src/declarative/items/qsgmousearea_p_p.h3
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;