Fixed some cases for resizing items.

preferencesAboutTextFull
Aleksei Kanash 12 years ago
parent c556535e67
commit e0c2fdc3e2
  1. 143
      src/domain/UBGraphicsDelegateFrame.cpp
  2. 3
      src/domain/UBGraphicsItemDelegate.cpp

@ -291,13 +291,18 @@ void UBGraphicsDelegateFrame::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
if (None == mCurrentTool) if (None == mCurrentTool)
return; 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 moveX = move.length() * cos((move.angle() - mAngle) * PI / 180);
qreal moveY = -move.length() * sin((move.angle() - mAngle) * PI / 180); qreal moveY = -move.length() * sin((move.angle() - mAngle) * PI / 180);
qreal width = delegated()->boundingRect().width() * mTotalScaleX; qreal width = delegated()->boundingRect().width() * mTotalScaleX;
qreal height = delegated()->boundingRect().height() * mTotalScaleY; qreal height = delegated()->boundingRect().height() * mTotalScaleY;
if(mOperationMode == Scaling) if(!rotating())
{ {
mTranslateX = moveX; mTranslateX = moveX;
// Perform the resize // Perform the resize
@ -398,44 +403,7 @@ void UBGraphicsDelegateFrame::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
} }
} }
} }
else if (mOperationMode == Resizing || mOperationMode == ResizingHorizontally)
{
mTranslateX = moveX;
UBResizableGraphicsItem* resizableItem = dynamic_cast<UBResizableGraphicsItem*>(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()) if (rotating())
{ {
mTranslateX = 0; 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. // we just detects coordinates of corner before and after scaling and then moves object at diff between them.
if (resizingBottomRight() && mMirrorX) if (resizingBottomRight() && mMirrorX)
{
mTranslateX += mInitialTransform.map(delegated()->boundingRect().bottomRight()).x() - tr.map(delegated()->boundingRect().bottomRight()).x(); 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(); mTranslateY += mInitialTransform.map(delegated()->boundingRect().bottomRight()).y() - tr.map(delegated()->boundingRect().bottomRight()).y();
}
else 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(); 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(); tr = buildTransform();
delegated()->setTransform(tr);
} }
else if (resizingTop() || resizingLeft()) else if (mOperationMode == Resizing)
{ {
if (mOperationMode == Scaling) QSizeF originalSize = delegated()->boundingRect().size();
{ // QSizeF originalSize = delegated()->sceneBoundingRect().size(); //
QPointF bottomRight = tr.map(delegated()->boundingRect().bottomRight());
QPointF fixedPoint = mInitialTransform.map(delegated()->boundingRect().bottomRight()); mScaleX = 1;
mTranslateX += fixedPoint.x() - bottomRight.x(); mScaleY = 1;
mTranslateY += fixedPoint.y() - bottomRight.y();
} tr = buildTransform().translate(moveX, moveY);
else 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)); dPosX = moveX;
QPointF topRight2 = mInitialTransform.map(QPointF(delegated()->boundingRect().width(), 0)); dPosY = moveY;
vector.setPoints(topRight1, topRight2);
} }
else else
{ {
QPointF bottomLeft1 = mInitialTransform.map(QPointF(0, delegated()->boundingRect().height() - moveY)); dPosX = mMirrorX ? -moveX :moveX;
QPointF bottomLeft2 = mInitialTransform.map(QPointF(0, delegated()->boundingRect().height())); dPosY = mMirrorY ? -moveY : moveY;
vector.setPoints(bottomLeft1, bottomLeft2); }
QPointF oldPos;
if (mMirrorX)
oldPos = delegated()->sceneBoundingRect().topLeft();
else
oldPos = delegated()->sceneBoundingRect().bottomRight();
delegated()->setTransform(tr);
UBResizableGraphicsItem* resizableItem = dynamic_cast<UBResizableGraphicsItem*>(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(); event->accept();
} }

@ -166,7 +166,8 @@ void UBGraphicsItemDelegate::init()
UBGraphicsItemDelegate::~UBGraphicsItemDelegate() 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. // do not release mMimeData.
// the mMimeData is owned by QDrag since the setMimeData call as specified in the documentation // the mMimeData is owned by QDrag since the setMimeData call as specified in the documentation
} }

Loading…
Cancel
Save