Showing with 90 additions and 24 deletions.
  1. +84 −24 src/core/composer/qgscomposermousehandles.cpp
  2. +6 −0 src/core/composer/qgscomposermousehandles.h
108 changes: 84 additions & 24 deletions src/core/composer/qgscomposermousehandles.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -705,15 +705,59 @@ void QgsComposerMouseHandles::mousePressEvent( QGraphicsSceneMouseEvent* event )

if ( mCurrentMouseMoveAction == QgsComposerMouseHandles::MoveItem )
{
//moving items
mIsDragging = true;
}
else if ( mCurrentMouseMoveAction != QgsComposerMouseHandles::SelectItem &&
mCurrentMouseMoveAction != QgsComposerMouseHandles::NoAction )
{
//resizing items
mIsResizing = true;
mResizeRect = QRectF( 0, 0, mBeginHandleWidth, mBeginHandleHeight );
mResizeMoveX = 0;
mResizeMoveY = 0;
mCursorOffset = calcCursorEdgeOffset( mMouseMoveStartPos );

}

}

QSizeF QgsComposerMouseHandles::calcCursorEdgeOffset( const QPointF &cursorPos )
{
//find offset between cursor position and actual edge of item
QPointF sceneMousePos = mapFromScene( cursorPos );

switch ( mCurrentMouseMoveAction )
{
//vertical resize
case QgsComposerMouseHandles::ResizeUp:
return QSizeF( 0, sceneMousePos.y() );

case QgsComposerMouseHandles::ResizeDown:
return QSizeF( 0, sceneMousePos.y() - rect().height() );

//horizontal resize
case QgsComposerMouseHandles::ResizeLeft:
return QSizeF( sceneMousePos.x(), 0 );

case QgsComposerMouseHandles::ResizeRight:
return QSizeF( sceneMousePos.x() - rect().width(), 0 );

//diagonal resize
case QgsComposerMouseHandles::ResizeLeftUp:
return QSizeF( sceneMousePos.x(), sceneMousePos.y() );

case QgsComposerMouseHandles::ResizeRightDown:
return QSizeF( sceneMousePos.x() - rect().width(), sceneMousePos.y() - rect().height() );

case QgsComposerMouseHandles::ResizeRightUp:
return QSizeF( sceneMousePos.x() - rect().width(), sceneMousePos.y() );

case QgsComposerMouseHandles::ResizeLeftDown:
return QSizeF( sceneMousePos.x(), sceneMousePos.y() - rect().height() );

default:
return QSizeF( 0, 0 );
}

}
Expand All @@ -733,7 +777,8 @@ void QgsComposerMouseHandles::dragMouseMove( const QPointF& currentPosition, boo
QPointF upperLeftPoint( mBeginHandlePos.x() + moveX, mBeginHandlePos.y() + moveY );

QPointF snappedLeftPoint;
if ( !preventSnap )
//no snapping for rotated items for now
if ( !preventSnap && rotation() == 0 )
{
//snap to grid and guides
snappedLeftPoint = snapPoint( upperLeftPoint, QgsComposerMouseHandles::Item );
Expand Down Expand Up @@ -779,18 +824,29 @@ void QgsComposerMouseHandles::resizeMouseMove( const QPointF& currentPosition, b
return;
}

QPointF beginMousePos = mapFromScene( mBeginMouseEventPos );

double mx = 0.0, my = 0.0, rx = 0.0, ry = 0.0;
QPointF snappedPosition = snapPoint( currentPosition, QgsComposerMouseHandles::Point );

//QPointF currentPosHandle = mapFromScene( currentPosition );
snappedPosition = mapFromScene( snappedPosition );
double diffX = 0;
double diffY = 0;
QPointF beginMousePos;
QPointF finalPosition;
if ( rotation() == 0 )
{
//snapping only occurs if handles are not rotated for now

//subtract cursor edge offset from begin mouse event and current cursor position, so that snapping occurs to edge of mouse handles
//rather then cursor position
beginMousePos = mapFromScene( QPointF( mBeginMouseEventPos.x() - mCursorOffset.width(), mBeginMouseEventPos.y() - mCursorOffset.height() ) );
QPointF snappedPosition = snapPoint( QPointF( currentPosition.x() - mCursorOffset.width(), currentPosition.y() - mCursorOffset.height() ), QgsComposerMouseHandles::Point );
finalPosition = mapFromScene( snappedPosition );
}
else
{
//no snapping for rotated items for now
beginMousePos = mapFromScene( mBeginMouseEventPos );
finalPosition = mapFromScene( currentPosition );
}

diffX = snappedPosition.x() - beginMousePos.x();
diffY = snappedPosition.y() - beginMousePos.y();
double diffX = finalPosition.x() - beginMousePos.x();
double diffY = finalPosition.y() - beginMousePos.y();

double ratio = 0;
if ( lockRatio && mBeginHandleHeight != 0 )
Expand All @@ -802,7 +858,7 @@ void QgsComposerMouseHandles::resizeMouseMove( const QPointF& currentPosition, b
{
//vertical resize
case QgsComposerMouseHandles::ResizeUp:
//diffY = snappedPosition.y() - beginMousePos.y();
{
if ( ratio )
{
diffX = (( mBeginHandleHeight - diffY ) * ratio ) - mBeginHandleWidth;
Expand All @@ -813,9 +869,10 @@ void QgsComposerMouseHandles::resizeMouseMove( const QPointF& currentPosition, b
mx = 0; my = diffY; rx = 0; ry = -diffY;
}
break;
}

case QgsComposerMouseHandles::ResizeDown:
//diffY = snappedPosition.y() - beginMousePos.y();
{
if ( ratio )
{
diffX = (( mBeginHandleHeight + diffY ) * ratio ) - mBeginHandleWidth;
Expand All @@ -826,10 +883,11 @@ void QgsComposerMouseHandles::resizeMouseMove( const QPointF& currentPosition, b
mx = 0; my = 0; rx = 0; ry = diffY;
}
break;
}

//horizontal resize
//horizontal resize
case QgsComposerMouseHandles::ResizeLeft:
//diffX = snappedPosition.x() - beginMousePos.x();
{
if ( ratio )
{
diffY = (( mBeginHandleWidth - diffX ) / ratio ) - mBeginHandleHeight;
Expand All @@ -840,9 +898,10 @@ void QgsComposerMouseHandles::resizeMouseMove( const QPointF& currentPosition, b
mx = diffX, my = 0; rx = -diffX; ry = 0;
}
break;
}

case QgsComposerMouseHandles::ResizeRight:
//diffX = snappedPosition.x() - ( beginMousePos.x() + mBeginHandleWidth );
{
if ( ratio )
{
diffY = (( mBeginHandleWidth + diffX ) / ratio ) - mBeginHandleHeight;
Expand All @@ -853,11 +912,11 @@ void QgsComposerMouseHandles::resizeMouseMove( const QPointF& currentPosition, b
mx = 0; my = 0; rx = diffX, ry = 0;
}
break;
}

//diagonal resize
//diagonal resize
case QgsComposerMouseHandles::ResizeLeftUp:
//diffX = snappedPosition.x() - beginMousePos.x();
diffY = snappedPosition.y() - beginMousePos.y();
{
if ( ratio )
{
//ratio locked resize
Expand All @@ -872,10 +931,10 @@ void QgsComposerMouseHandles::resizeMouseMove( const QPointF& currentPosition, b
}
mx = diffX, my = diffY; rx = -diffX; ry = -diffY;
break;
}

case QgsComposerMouseHandles::ResizeRightDown:
//diffX = snappedPosition.x() - ( beginMousePos.x() + mBeginHandleWidth );
//diffY = snappedPosition.y() - ( beginMousePos.y() + mBeginHandleHeight );
{
if ( ratio )
{
//ratio locked resize
Expand All @@ -890,10 +949,10 @@ void QgsComposerMouseHandles::resizeMouseMove( const QPointF& currentPosition, b
}
mx = 0; my = 0; rx = diffX, ry = diffY;
break;
}

case QgsComposerMouseHandles::ResizeRightUp:
//diffX = snappedPosition.x() - ( beginMousePos.x() + mBeginHandleWidth );
//diffY = snappedPosition.y() - beginMousePos.y();
{
if ( ratio )
{
//ratio locked resize
Expand All @@ -908,10 +967,10 @@ void QgsComposerMouseHandles::resizeMouseMove( const QPointF& currentPosition, b
}
mx = 0; my = diffY, rx = diffX, ry = -diffY;
break;
}

case QgsComposerMouseHandles::ResizeLeftDown:
//diffX = snappedPosition.x() - beginMousePos.x();
//diffY = snappedPosition.y() - ( beginMousePos.y() + mBeginHandleHeight );
{
if ( ratio )
{
//ratio locked resize
Expand All @@ -926,6 +985,7 @@ void QgsComposerMouseHandles::resizeMouseMove( const QPointF& currentPosition, b
}
mx = diffX, my = 0; rx = -diffX; ry = diffY;
break;
}

case QgsComposerMouseHandles::MoveItem:
case QgsComposerMouseHandles::SelectItem:
Expand Down
6 changes: 6 additions & 0 deletions src/core/composer/qgscomposermousehandles.h
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,8 @@ class CORE_EXPORT QgsComposerMouseHandles: public QObject, public QGraphicsRectI
QGraphicsLineItem* mHAlignSnapItem;
QGraphicsLineItem* mVAlignSnapItem;

QSizeF mCursorOffset;

/**Returns the mouse handle bounds of current selection*/
QRectF selectionBounds() const;

Expand All @@ -154,6 +156,10 @@ class CORE_EXPORT QgsComposerMouseHandles: public QObject, public QGraphicsRectI

/**Handles dragging of items during mouse move*/
void dragMouseMove( const QPointF& currentPosition, bool lockMovement, bool preventSnap );

/**Calculates the distance of the mouse cursor from thed edge of the mouse handles*/
QSizeF calcCursorEdgeOffset( const QPointF &cursorPos );

/**Handles resizing of items during mouse move*/
void resizeMouseMove( const QPointF& currentPosition, bool lockAspect, bool fromCenter );

Expand Down