@ -48,6 +48,8 @@ UBGraphicsDelegateFrame::UBGraphicsDelegateFrame(UBGraphicsItemDelegate* pDelega
, mTotalTranslateX ( 0 )
, mTotalTranslateY ( 0 )
, mOperationMode ( Scaling )
, mMirrorX ( false )
, mMirrorY ( false )
{
setFlag ( QGraphicsItem : : ItemSendsGeometryChanges , true ) ;
@ -156,14 +158,37 @@ void UBGraphicsDelegateFrame::initializeTransform()
QPointF topRight = itemTransform . map ( itemRect . topRight ( ) ) ;
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 leftLine ( topLeft , bottomLeft ) ;
qreal width = topLine . length ( ) ;
qreal height = leftLine . length ( ) ;
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 ;
QPointF center = delegated ( ) - > boundingRect ( ) . center ( ) ;
@ -192,6 +217,7 @@ void UBGraphicsDelegateFrame::mousePressEvent(QGraphicsSceneMouseEvent *event)
mAngleOffset = 0 ;
mInitialTransform = buildTransform ( ) ;
mCurrentTool = toolFromPos ( event - > pos ( ) ) ;
event - > accept ( ) ;
@ -205,9 +231,16 @@ void UBGraphicsDelegateFrame::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
qreal moveY = - move . length ( ) * sin ( ( move . angle ( ) - mAngle ) * PI / 180 ) ;
qreal width = delegated ( ) - > boundingRect ( ) . width ( ) * mTotalScaleX ;
qreal height = delegated ( ) - > boundingRect ( ) . height ( ) * mTotalScaleY ;
mTranslateX = moveX ;
if ( mOperationMode = = Scaling )
{
// // Hide the buttons
// mDelegate->setButtonsVisible(false);
// mResizing = true;
// Perform the resize
if ( resizingBottomRight ( ) )
{
// -----------------------------------------------------
@ -240,11 +273,12 @@ void UBGraphicsDelegateFrame::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
if ( resizingLeft ( ) ) {
scaleX = ( width - moveX ) / width ;
} else if ( resizingRight ( ) ) {
scaleX = ( width + moveX ) / width ;
scaleX = ( width + moveX ) / width ;
}
if ( mDelegate - > isFlippable ( ) & & qAbs ( scaleX ) ! = 0 ) {
if ( ( width * qAbs ( scaleX ) ) < 2 * mFrameWidth ) {
if ( ( qAbs ( width * scaleX ) ) < 2 * mFrameWidth ) {
bool negative = ( scaleX < 0 ) ? true : false ;
mMirrorX = ( negative ? mMirrorX : ! mMirrorX ) ;
if ( negative ) {
scaleX = - 2 * mFrameWidth / width ;
} else {
@ -269,8 +303,9 @@ void UBGraphicsDelegateFrame::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
}
if ( mDelegate - > isFlippable ( ) & & qAbs ( scaleY ) ! = 0 ) {
if ( ( height * qAbs ( scaleY ) ) < 2 * mFrameWidth ) {
if ( ( qAbs ( height * scaleY ) ) < 2 * mFrameWidth ) {
bool negative = ( scaleY < 0 ) ? true : false ;
mMirrorY = ( negative ? mMirrorY : ! mMirrorY ) ;
if ( negative ) {
scaleY = - 2 * mFrameWidth / width ;
} else {
@ -281,7 +316,9 @@ void UBGraphicsDelegateFrame::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
} else if ( scaleY > 1 | | ( height * scaleY ) > 2 * mFrameWidth )
{
mScaleY = scaleY ;
mTranslateY = moveY ;
if ( resizingTop ( ) ) {
mTranslateY = moveY ;
}
}
}
}
@ -421,6 +458,12 @@ void UBGraphicsDelegateFrame::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
mCurrentTool = None ;
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 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 ) ;
qreal angle = topLine . angle ( ) ;
qreal width = topLine . length ( ) ;
@ -507,17 +558,8 @@ void UBGraphicsDelegateFrame::positionHandles()
mBottomRightResizeGripSvgItem - > setPos ( rect ( ) . right ( ) - brRect . width ( ) , rect ( ) . bottom ( ) - brRect . 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 ) ;
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 ) {
}
mLeftResizeGripSvgItem - > setPos ( rect ( ) . left ( ) , rect ( ) . center ( ) . y ( ) - lRect . height ( ) / 2 ) ;
mRightResizeGripSvgItem - > setPos ( rect ( ) . right ( ) - rRect . width ( ) , rect ( ) . center ( ) . y ( ) - rRect . height ( ) / 2 ) ;
mTopResizeGripSvgItem - > setPos ( rect ( ) . center ( ) . x ( ) - trRect . width ( ) / 2 , rect ( ) . y ( ) ) ;
mRotateButton - > setPos ( rect ( ) . right ( ) - mFrameWidth - 5 , rect ( ) . top ( ) + 5 ) ;
@ -571,14 +613,37 @@ UBGraphicsDelegateFrame::FrameTool UBGraphicsDelegateFrame::toolFromPos(QPointF
return None ;
else if ( bottomRightResizeGripRect ( ) . contains ( pos ) )
return ResizeBottomRight ;
else if ( bottomResizeGripRect ( ) . contains ( pos ) )
return ResizeBottom ;
else if ( leftResizeGripRect ( ) . contains ( pos ) )
return ResizeLeft ;
else if ( rightResizeGripRect ( ) . contains ( pos ) )
return ResizeRight ;
else if ( topResizeGripRect ( ) . contains ( pos ) )
return ResizeTop ;
else if ( bottomResizeGripRect ( ) . contains ( pos ) ) {
if ( mMirrorY ) {
return ResizeTop ;
} else {
return ResizeBottom ;
}
}
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 ( ) )
return Rotate ;
else
@ -621,3 +686,22 @@ QRectF UBGraphicsDelegateFrame::rotateButtonBounds() const
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 ) ;
}