|
|
@ -48,6 +48,8 @@ UBGraphicsDelegateFrame::UBGraphicsDelegateFrame(UBGraphicsItemDelegate* pDelega |
|
|
|
, mTotalTranslateX(0) |
|
|
|
, mTotalTranslateX(0) |
|
|
|
, mTotalTranslateY(0) |
|
|
|
, mTotalTranslateY(0) |
|
|
|
, mOperationMode(Scaling) |
|
|
|
, mOperationMode(Scaling) |
|
|
|
|
|
|
|
, mMirrorX(false) |
|
|
|
|
|
|
|
, mMirrorY(false) |
|
|
|
{ |
|
|
|
{ |
|
|
|
setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); |
|
|
|
setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); |
|
|
|
|
|
|
|
|
|
|
@ -156,14 +158,37 @@ void UBGraphicsDelegateFrame::initializeTransform() |
|
|
|
QPointF topRight = itemTransform.map(itemRect.topRight()); |
|
|
|
QPointF topRight = itemTransform.map(itemRect.topRight()); |
|
|
|
QPointF bottomLeft = itemTransform.map(itemRect.bottomLeft()); |
|
|
|
QPointF bottomLeft = itemTransform.map(itemRect.bottomLeft()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
qreal horizontalFlip = (topLeft.x() > topRight.x()) ? -1 : 1; |
|
|
|
|
|
|
|
if(horizontalFlip < 0){ |
|
|
|
|
|
|
|
// why this is because of the way of calculating the translations that checks which side is the most is the
|
|
|
|
|
|
|
|
// nearest instead of checking which one is the left side.
|
|
|
|
|
|
|
|
QPointF tmp = topLeft; |
|
|
|
|
|
|
|
topLeft = topRight; |
|
|
|
|
|
|
|
topRight = tmp; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// because of the calculation of the height is done by lenght and not deltaY
|
|
|
|
|
|
|
|
bottomLeft = itemTransform.map(itemRect.bottomRight()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
qreal verticalFlip = (bottomLeft.y() < topLeft.y()) ? -1 : 1; |
|
|
|
|
|
|
|
// not sure that is usefull
|
|
|
|
|
|
|
|
if(verticalFlip < 0){ |
|
|
|
|
|
|
|
topLeft = itemTransform.map(itemRect.bottomLeft()); |
|
|
|
|
|
|
|
topRight = itemTransform.map(itemRect.bottomRight()); |
|
|
|
|
|
|
|
bottomLeft = itemTransform.map(itemRect.topLeft()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
QLineF topLine(topLeft, topRight); |
|
|
|
QLineF topLine(topLeft, topRight); |
|
|
|
QLineF leftLine(topLeft, bottomLeft); |
|
|
|
QLineF leftLine(topLeft, bottomLeft); |
|
|
|
qreal width = topLine.length(); |
|
|
|
qreal width = topLine.length(); |
|
|
|
qreal height = leftLine.length(); |
|
|
|
qreal height = leftLine.length(); |
|
|
|
|
|
|
|
|
|
|
|
mAngle = topLine.angle(); |
|
|
|
mAngle = topLine.angle(); |
|
|
|
mTotalScaleX = width / itemRect.width(); |
|
|
|
|
|
|
|
mTotalScaleY = height / itemRect.height(); |
|
|
|
//the fact the the lenght is used we loose the horizontalFlip information
|
|
|
|
|
|
|
|
// a better way to do this is using DeltaX that preserve the direction information.
|
|
|
|
|
|
|
|
mTotalScaleX = (width / itemRect.width()) * horizontalFlip; |
|
|
|
|
|
|
|
mTotalScaleY = height / itemRect.height() * verticalFlip; |
|
|
|
|
|
|
|
|
|
|
|
QTransform tr; |
|
|
|
QTransform tr; |
|
|
|
QPointF center = delegated()->boundingRect().center(); |
|
|
|
QPointF center = delegated()->boundingRect().center(); |
|
|
@ -192,6 +217,7 @@ void UBGraphicsDelegateFrame::mousePressEvent(QGraphicsSceneMouseEvent *event) |
|
|
|
mAngleOffset = 0; |
|
|
|
mAngleOffset = 0; |
|
|
|
|
|
|
|
|
|
|
|
mInitialTransform = buildTransform(); |
|
|
|
mInitialTransform = buildTransform(); |
|
|
|
|
|
|
|
|
|
|
|
mCurrentTool = toolFromPos(event->pos()); |
|
|
|
mCurrentTool = toolFromPos(event->pos()); |
|
|
|
|
|
|
|
|
|
|
|
event->accept(); |
|
|
|
event->accept(); |
|
|
@ -205,9 +231,16 @@ void UBGraphicsDelegateFrame::mouseMoveEvent(QGraphicsSceneMouseEvent *event) |
|
|
|
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; |
|
|
|
|
|
|
|
mTranslateX = moveX; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(mOperationMode == Scaling) |
|
|
|
if(mOperationMode == Scaling) |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
// // Hide the buttons
|
|
|
|
|
|
|
|
// mDelegate->setButtonsVisible(false);
|
|
|
|
|
|
|
|
// mResizing = true;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Perform the resize
|
|
|
|
if (resizingBottomRight()) |
|
|
|
if (resizingBottomRight()) |
|
|
|
{ |
|
|
|
{ |
|
|
|
// -----------------------------------------------------
|
|
|
|
// -----------------------------------------------------
|
|
|
@ -240,11 +273,12 @@ void UBGraphicsDelegateFrame::mouseMoveEvent(QGraphicsSceneMouseEvent *event) |
|
|
|
if(resizingLeft()){ |
|
|
|
if(resizingLeft()){ |
|
|
|
scaleX = (width - moveX) / width; |
|
|
|
scaleX = (width - moveX) / width; |
|
|
|
}else if(resizingRight()){ |
|
|
|
}else if(resizingRight()){ |
|
|
|
scaleX = (width + moveX) / width; |
|
|
|
scaleX = (width + moveX) / width; |
|
|
|
} |
|
|
|
} |
|
|
|
if(mDelegate->isFlippable() && qAbs(scaleX) != 0){ |
|
|
|
if(mDelegate->isFlippable() && qAbs(scaleX) != 0){ |
|
|
|
if((width * qAbs(scaleX)) < 2*mFrameWidth){ |
|
|
|
if((qAbs(width * scaleX)) < 2*mFrameWidth){ |
|
|
|
bool negative = (scaleX < 0)?true:false; |
|
|
|
bool negative = (scaleX < 0)?true:false; |
|
|
|
|
|
|
|
mMirrorX = (negative?mMirrorX:!mMirrorX); |
|
|
|
if(negative){ |
|
|
|
if(negative){ |
|
|
|
scaleX = -2*mFrameWidth/width; |
|
|
|
scaleX = -2*mFrameWidth/width; |
|
|
|
}else{ |
|
|
|
}else{ |
|
|
@ -269,8 +303,9 @@ void UBGraphicsDelegateFrame::mouseMoveEvent(QGraphicsSceneMouseEvent *event) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if(mDelegate->isFlippable() && qAbs(scaleY) != 0){ |
|
|
|
if(mDelegate->isFlippable() && qAbs(scaleY) != 0){ |
|
|
|
if((height * qAbs(scaleY)) < 2*mFrameWidth){ |
|
|
|
if((qAbs(height * scaleY)) < 2*mFrameWidth){ |
|
|
|
bool negative = (scaleY < 0)?true:false; |
|
|
|
bool negative = (scaleY < 0)?true:false; |
|
|
|
|
|
|
|
mMirrorY = (negative?mMirrorY:!mMirrorY); |
|
|
|
if(negative){ |
|
|
|
if(negative){ |
|
|
|
scaleY = -2*mFrameWidth/width; |
|
|
|
scaleY = -2*mFrameWidth/width; |
|
|
|
}else{ |
|
|
|
}else{ |
|
|
@ -281,7 +316,9 @@ void UBGraphicsDelegateFrame::mouseMoveEvent(QGraphicsSceneMouseEvent *event) |
|
|
|
}else if (scaleY > 1 || (height * scaleY) > 2 * mFrameWidth) |
|
|
|
}else if (scaleY > 1 || (height * scaleY) > 2 * mFrameWidth) |
|
|
|
{ |
|
|
|
{ |
|
|
|
mScaleY = scaleY; |
|
|
|
mScaleY = scaleY; |
|
|
|
mTranslateY = moveY; |
|
|
|
if(resizingTop()){ |
|
|
|
|
|
|
|
mTranslateY = moveY; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@ -421,6 +458,12 @@ void UBGraphicsDelegateFrame::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) |
|
|
|
|
|
|
|
|
|
|
|
mCurrentTool = None; |
|
|
|
mCurrentTool = None; |
|
|
|
QGraphicsRectItem::mouseReleaseEvent(event); |
|
|
|
QGraphicsRectItem::mouseReleaseEvent(event); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Show the buttons
|
|
|
|
|
|
|
|
if(isResizing()){ |
|
|
|
|
|
|
|
mResizing = false; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
mDelegate->setButtonsVisible(true); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -464,6 +507,14 @@ void UBGraphicsDelegateFrame::positionHandles() |
|
|
|
QPointF bottomLeft = itemTransform.map(itemRect.bottomLeft()); |
|
|
|
QPointF bottomLeft = itemTransform.map(itemRect.bottomLeft()); |
|
|
|
QPointF center = itemTransform.map(itemRect.center()); |
|
|
|
QPointF center = itemTransform.map(itemRect.center()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Handle the mirroring
|
|
|
|
|
|
|
|
if(topLeft.x() > topRight.x()){ |
|
|
|
|
|
|
|
QPointF tmp = topRight; |
|
|
|
|
|
|
|
topRight = topLeft; |
|
|
|
|
|
|
|
topLeft = tmp; |
|
|
|
|
|
|
|
bottomLeft.setX(topLeft.x()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
QLineF topLine(topLeft, topRight); |
|
|
|
QLineF topLine(topLeft, topRight); |
|
|
|
qreal angle = topLine.angle(); |
|
|
|
qreal angle = topLine.angle(); |
|
|
|
qreal width = topLine.length(); |
|
|
|
qreal width = topLine.length(); |
|
|
@ -507,17 +558,8 @@ void UBGraphicsDelegateFrame::positionHandles() |
|
|
|
mBottomRightResizeGripSvgItem->setPos(rect().right() - brRect.width(), rect().bottom() - brRect.height()); |
|
|
|
mBottomRightResizeGripSvgItem->setPos(rect().right() - brRect.width(), rect().bottom() - brRect.height()); |
|
|
|
mBottomResizeGripSvgItem->setPos(rect().center().x() - bRect.width() / 2, rect().bottom() - bRect.height()); |
|
|
|
mBottomResizeGripSvgItem->setPos(rect().center().x() - bRect.width() / 2, rect().bottom() - bRect.height()); |
|
|
|
|
|
|
|
|
|
|
|
if(0 <= mScaleX){ |
|
|
|
mLeftResizeGripSvgItem->setPos(rect().left(), rect().center().y() - lRect.height() / 2); |
|
|
|
mLeftResizeGripSvgItem->setPos(rect().left(), rect().center().y() - lRect.height() / 2); |
|
|
|
mRightResizeGripSvgItem->setPos(rect().right() - rRect.width(), rect().center().y() - rRect.height() / 2); |
|
|
|
mRightResizeGripSvgItem->setPos(rect().right() - rRect.width(), rect().center().y() - rRect.height() / 2); |
|
|
|
|
|
|
|
}else{ |
|
|
|
|
|
|
|
mLeftResizeGripSvgItem->setPos(rect().right() - rRect.width(), rect().center().y() - lRect.height() / 2); |
|
|
|
|
|
|
|
mRightResizeGripSvgItem->setPos(rect().left() , rect().center().y() - rRect.height() / 2); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(0 < mScaleY){ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mTopResizeGripSvgItem->setPos(rect().center().x() - trRect.width() / 2, rect().y()); |
|
|
|
mTopResizeGripSvgItem->setPos(rect().center().x() - trRect.width() / 2, rect().y()); |
|
|
|
mRotateButton->setPos(rect().right() - mFrameWidth - 5, rect().top() + 5); |
|
|
|
mRotateButton->setPos(rect().right() - mFrameWidth - 5, rect().top() + 5); |
|
|
@ -571,14 +613,37 @@ UBGraphicsDelegateFrame::FrameTool UBGraphicsDelegateFrame::toolFromPos(QPointF |
|
|
|
return None; |
|
|
|
return None; |
|
|
|
else if (bottomRightResizeGripRect().contains(pos)) |
|
|
|
else if (bottomRightResizeGripRect().contains(pos)) |
|
|
|
return ResizeBottomRight; |
|
|
|
return ResizeBottomRight; |
|
|
|
else if (bottomResizeGripRect().contains(pos)) |
|
|
|
else if (bottomResizeGripRect().contains(pos)){ |
|
|
|
return ResizeBottom; |
|
|
|
if(mMirrorY){ |
|
|
|
else if (leftResizeGripRect().contains(pos)) |
|
|
|
return ResizeTop; |
|
|
|
return ResizeLeft; |
|
|
|
}else{ |
|
|
|
else if (rightResizeGripRect().contains(pos)) |
|
|
|
return ResizeBottom; |
|
|
|
return ResizeRight; |
|
|
|
} |
|
|
|
else if (topResizeGripRect().contains(pos)) |
|
|
|
} |
|
|
|
return ResizeTop; |
|
|
|
else if (leftResizeGripRect().contains(pos)){ |
|
|
|
|
|
|
|
qDebug() << "LEFT GRIP (" << mMirrorX << ")"; |
|
|
|
|
|
|
|
if(mMirrorX){ |
|
|
|
|
|
|
|
return ResizeRight; |
|
|
|
|
|
|
|
}else{ |
|
|
|
|
|
|
|
return ResizeLeft; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return ResizeLeft; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else if (rightResizeGripRect().contains(pos)){ |
|
|
|
|
|
|
|
qDebug() << "RIGHT GRIP (" << mMirrorX << ")"; |
|
|
|
|
|
|
|
if(mMirrorX){ |
|
|
|
|
|
|
|
return ResizeLeft; |
|
|
|
|
|
|
|
}else{ |
|
|
|
|
|
|
|
return ResizeRight; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else if (topResizeGripRect().contains(pos)){ |
|
|
|
|
|
|
|
if(mMirrorY){ |
|
|
|
|
|
|
|
return ResizeBottom; |
|
|
|
|
|
|
|
}else{ |
|
|
|
|
|
|
|
return ResizeTop; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
else if (rotateButtonBounds().contains(pos) && mDelegate && mDelegate->canRotate()) |
|
|
|
else if (rotateButtonBounds().contains(pos) && mDelegate && mDelegate->canRotate()) |
|
|
|
return Rotate; |
|
|
|
return Rotate; |
|
|
|
else |
|
|
|
else |
|
|
@ -621,3 +686,22 @@ QRectF UBGraphicsDelegateFrame::rotateButtonBounds() const |
|
|
|
return QRectF(rect().right()- mFrameWidth, rect().top(), mFrameWidth, mFrameWidth); |
|
|
|
return QRectF(rect().right()- mFrameWidth, rect().top(), mFrameWidth, mFrameWidth); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void UBGraphicsDelegateFrame::refreshGeometry() |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
// Here we want to have the left on the left, the right on the right, the top on the top and the bottom on the bottom!
|
|
|
|
|
|
|
|
QRectF itemRect = delegated()->boundingRect(); |
|
|
|
|
|
|
|
QTransform itemTransform = delegated()->sceneTransform(); |
|
|
|
|
|
|
|
QPointF topLeft = itemTransform.map(itemRect.topLeft()); |
|
|
|
|
|
|
|
QPointF topRight = itemTransform.map(itemRect.topRight()); |
|
|
|
|
|
|
|
QPointF bottomLeft = itemTransform.map(itemRect.bottomLeft()); |
|
|
|
|
|
|
|
QPointF center = itemTransform.map(itemRect.center()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
qDebug() << topLeft << ", " << topRight << ", " << bottomLeft; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
QLineF topLine(topLeft, topRight); |
|
|
|
|
|
|
|
qreal angle = topLine.angle(); |
|
|
|
|
|
|
|
qreal width = topLine.length(); |
|
|
|
|
|
|
|
QLineF leftLine(topLeft, bottomLeft); |
|
|
|
|
|
|
|
qreal height = leftLine.length(); |
|
|
|
|
|
|
|
setRect(topRight.x() - mFrameWidth, topLeft.y() - mFrameWidth, width + 2*mFrameWidth, height + 2*mFrameWidth); |
|
|
|
|
|
|
|
} |
|
|
|