From e0c2fdc3e2ad26443a82b2459de6dd48b544ac34 Mon Sep 17 00:00:00 2001 From: Aleksei Kanash Date: Fri, 7 Sep 2012 15:42:42 +0300 Subject: [PATCH] Fixed some cases for resizing items. --- src/domain/UBGraphicsDelegateFrame.cpp | 143 +++++++++++++------------ src/domain/UBGraphicsItemDelegate.cpp | 3 +- 2 files changed, 79 insertions(+), 67 deletions(-) diff --git a/src/domain/UBGraphicsDelegateFrame.cpp b/src/domain/UBGraphicsDelegateFrame.cpp index de40ab43..5c6284be 100644 --- a/src/domain/UBGraphicsDelegateFrame.cpp +++ b/src/domain/UBGraphicsDelegateFrame.cpp @@ -291,13 +291,18 @@ void UBGraphicsDelegateFrame::mouseMoveEvent(QGraphicsSceneMouseEvent *event) if (None == mCurrentTool) return; - QLineF move(mStartingPoint, event->scenePos()); + QLineF move; + if(rotating() || moving() || mOperationMode == Scaling) + move = QLineF(mStartingPoint, event->scenePos()); + else + move = QLineF(event->lastScenePos(), event->scenePos()); + qreal moveX = move.length() * cos((move.angle() - mAngle) * PI / 180); qreal moveY = -move.length() * sin((move.angle() - mAngle) * PI / 180); qreal width = delegated()->boundingRect().width() * mTotalScaleX; qreal height = delegated()->boundingRect().height() * mTotalScaleY; - if(mOperationMode == Scaling) + if(!rotating()) { mTranslateX = moveX; // Perform the resize @@ -398,44 +403,7 @@ void UBGraphicsDelegateFrame::mouseMoveEvent(QGraphicsSceneMouseEvent *event) } } } - else if (mOperationMode == Resizing || mOperationMode == ResizingHorizontally) - { - mTranslateX = moveX; - UBResizableGraphicsItem* resizableItem = dynamic_cast(delegated()); - - if (resizableItem) - { - QLineF mousePosDelta(delegated()->mapFromScene(event->lastScenePos()) - , delegated()->mapFromScene(event->scenePos())); - QSizeF incVector(0, 0); - - if (resizingBottomRight()) - { - incVector = QSizeF(mousePosDelta.dx(), mousePosDelta.dy()); - } - else if (resizingRight()) - { - incVector = QSizeF(mousePosDelta.dx(), 0); - } - else if (resizingBottom()) - { - incVector = QSizeF(0, mousePosDelta.dy()); - } - else if (resizingLeft()) - { - incVector = QSizeF(- mousePosDelta.dx(), 0); - } - else if (resizingTop()) - { - incVector = QSizeF(0, - mousePosDelta.dy()); - } - - QSizeF newSize = resizableItem->size() + incVector; - - resizableItem->resize(newSize); - } - } - + if (rotating()) { mTranslateX = 0; @@ -483,49 +451,92 @@ void UBGraphicsDelegateFrame::mouseMoveEvent(QGraphicsSceneMouseEvent *event) // we just detects coordinates of corner before and after scaling and then moves object at diff between them. if (resizingBottomRight() && mMirrorX) + { mTranslateX += mInitialTransform.map(delegated()->boundingRect().bottomRight()).x() - tr.map(delegated()->boundingRect().bottomRight()).x(); - else - mTranslateX += mInitialTransform.map(delegated()->boundingRect().topLeft()).x() - tr.map(delegated()->boundingRect().topLeft()).x(); - - if (resizingBottomRight() && mMirrorY) mTranslateY += mInitialTransform.map(delegated()->boundingRect().bottomRight()).y() - tr.map(delegated()->boundingRect().bottomRight()).y(); + } else + { + mTranslateX += mInitialTransform.map(delegated()->boundingRect().topLeft()).x() - tr.map(delegated()->boundingRect().topLeft()).x(); mTranslateY += mInitialTransform.map(delegated()->boundingRect().topLeft()).y() - tr.map(delegated()->boundingRect().topLeft()).y(); + } + } + else if (mOperationMode == Scaling && (resizingTop() || resizingLeft())) + { + QPointF bottomRight = tr.map(delegated()->boundingRect().bottomRight()); + QPointF fixedPoint = mInitialTransform.map(delegated()->boundingRect().bottomRight()); + mTranslateX += fixedPoint.x() - bottomRight.x(); + mTranslateY += fixedPoint.y() - bottomRight.y(); + } - // Update the transform + + if (mOperationMode == Scaling || moving() || rotating()) + { tr = buildTransform(); + delegated()->setTransform(tr); } - else if (resizingTop() || resizingLeft()) + else if (mOperationMode == Resizing) { - if (mOperationMode == Scaling) - { - QPointF bottomRight = tr.map(delegated()->boundingRect().bottomRight()); - QPointF fixedPoint = mInitialTransform.map(delegated()->boundingRect().bottomRight()); - mTranslateX += fixedPoint.x() - bottomRight.x(); - mTranslateY += fixedPoint.y() - bottomRight.y(); - } - else + QSizeF originalSize = delegated()->boundingRect().size(); + // QSizeF originalSize = delegated()->sceneBoundingRect().size(); // + + mScaleX = 1; + mScaleY = 1; + + tr = buildTransform().translate(moveX, moveY); + if (resizingRight() || resizingBottom() || resizingBottomRight() || resizingTop() || resizingLeft()) { - QLineF vector; - if (resizingLeft()) + + + qreal dPosX; + qreal dPosY; + + if (resizingTop() || resizingLeft()) + { + dPosX = mMirrorX ? moveX : -moveX; + dPosY = mMirrorY ? moveY : -moveY; + } + else if (resizingBottomRight()) { - QPointF topRight1 = mInitialTransform.map(QPointF(delegated()->boundingRect().width() - moveX, 0)); - QPointF topRight2 = mInitialTransform.map(QPointF(delegated()->boundingRect().width(), 0)); - vector.setPoints(topRight1, topRight2); + dPosX = moveX; + dPosY = moveY; } else { - QPointF bottomLeft1 = mInitialTransform.map(QPointF(0, delegated()->boundingRect().height() - moveY)); - QPointF bottomLeft2 = mInitialTransform.map(QPointF(0, delegated()->boundingRect().height())); - vector.setPoints(bottomLeft1, bottomLeft2); + dPosX = mMirrorX ? -moveX :moveX; + dPosY = mMirrorY ? -moveY : moveY; + } + + + QPointF oldPos; + if (mMirrorX) + oldPos = delegated()->sceneBoundingRect().topLeft(); + else + oldPos = delegated()->sceneBoundingRect().bottomRight(); + + delegated()->setTransform(tr); + + UBResizableGraphicsItem* resizableItem = dynamic_cast(delegated()); + if (resizableItem) + { + + resizableItem->resize(originalSize.width() + dPosX, originalSize.height() + dPosY); + if (resizingTop() || resizingLeft() || (mMirrorX && resizingBottomRight())) + { + QPointF newPos; + + if (mMirrorX) + newPos = delegated()->sceneBoundingRect().topLeft(); + else + newPos = delegated()->sceneBoundingRect().bottomRight(); + + delegated()->setPos(delegated()->pos()-newPos+oldPos); + + } } - mTranslateX = vector.dx(); - mTranslateY = vector.dy(); } - tr = buildTransform(); } - delegated()->setTransform(tr); event->accept(); } diff --git a/src/domain/UBGraphicsItemDelegate.cpp b/src/domain/UBGraphicsItemDelegate.cpp index d5620d12..9419774e 100644 --- a/src/domain/UBGraphicsItemDelegate.cpp +++ b/src/domain/UBGraphicsItemDelegate.cpp @@ -166,7 +166,8 @@ void UBGraphicsItemDelegate::init() UBGraphicsItemDelegate::~UBGraphicsItemDelegate() { - disconnect(UBApplication::boardController, SIGNAL(zoomChanged(qreal)), this, SLOT(onZoomChanged())); + if (UBApplication::boardController) + disconnect(UBApplication::boardController, SIGNAL(zoomChanged(qreal)), this, SLOT(onZoomChanged())); // do not release mMimeData. // the mMimeData is owned by QDrag since the setMimeData call as specified in the documentation }