[QGIS Commit] r9409 -
branches/advanced_printing_branch2/src/core/composer
svn_qgis at osgeo.org
svn_qgis at osgeo.org
Fri Sep 26 09:02:30 EDT 2008
Author: mhugent
Date: 2008-09-26 09:02:30 -0400 (Fri, 26 Sep 2008)
New Revision: 9409
Modified:
branches/advanced_printing_branch2/src/core/composer/qgscomposeritem.cpp
branches/advanced_printing_branch2/src/core/composer/qgscomposeritem.h
Log:
Improved snap to grid function
Modified: branches/advanced_printing_branch2/src/core/composer/qgscomposeritem.cpp
===================================================================
--- branches/advanced_printing_branch2/src/core/composer/qgscomposeritem.cpp 2008-09-25 20:58:30 UTC (rev 9408)
+++ branches/advanced_printing_branch2/src/core/composer/qgscomposeritem.cpp 2008-09-26 13:02:30 UTC (rev 9409)
@@ -220,71 +220,23 @@
void QgsComposerItem::mouseMoveEvent( QGraphicsSceneMouseEvent * event )
{
qWarning( "QgsComposerItem::mouseMoveEvent" );
-
- QPointF sceneMovePoint = event->lastScenePos();
if ( mBoundingResizeRectangle )
{
- //move action, change only transform but not rectangle
- if(mCurrentMouseMoveAction == QgsComposerItem::moveItem) //move action
- {
- double diffX = sceneMovePoint.x() - mLastMouseEventPos.x();
- double diffY = sceneMovePoint.y() - mLastMouseEventPos.y();
+ double diffX = event->lastScenePos().x() - mLastMouseEventPos.x();
+ double diffY = event->lastScenePos().y() - mLastMouseEventPos.y();
- //snap rectangle position but not the move point
- double mx, my, rx, ry;
- rectangleChange( diffX, diffY, mx, my, rx, ry );
-
- QTransform oldTransform = mBoundingResizeRectangle->transform();
- QTransform transform;
- QPointF upperLeft(oldTransform.dx() + mx, oldTransform.dy() + my);
- QPointF snappedUpperLeft = upperLeft;
- if(mx != 0.0 || my != 0.0)
- {
- snappedUpperLeft = mComposition->snapPointToGrid(upperLeft);
- }
- transform.translate( snappedUpperLeft.x(), snappedUpperLeft.y());
- mBoundingResizeRectangle->setTransform(transform);
-
- mLastMouseEventPos.setX(sceneMovePoint.x() + snappedUpperLeft.x() - upperLeft.x());
- mLastMouseEventPos.setY(sceneMovePoint.y() + snappedUpperLeft.y() - upperLeft.y());
- }
- else //resize action, change only rect but not transformation
- {
- if(composition() && composition()->snapToGridEnabled())
- {
- sceneMovePoint = composition()->snapPointToGrid(sceneMovePoint);
- }
-
- double diffX = sceneMovePoint.x() - mLastMouseEventPos.x();
- double diffY = sceneMovePoint.y() - mLastMouseEventPos.y();
-
- double mx, my, rx, ry;
-
- rectangleChange( diffX, diffY, mx, my, rx, ry );
-
- QRectF r = mBoundingResizeRectangle->rect();
- double newWidth = r.width() + rx;
- double newHeight = r.height() + ry;
- QRectF newBoundingRect( 0, 0, newWidth, newHeight );
-
- mBoundingResizeRectangle->setRect( newBoundingRect );
- mLastMouseEventPos = sceneMovePoint;
- }
-
+ double mx, my, rx, ry;
+ changeItemRectangle(event->lastScenePos(), mMouseMoveStartPos, this, diffX, diffY, mBoundingResizeRectangle);
}
+ mLastMouseEventPos = event->lastScenePos();
}
void QgsComposerItem::mousePressEvent( QGraphicsSceneMouseEvent * event )
{
- if(!composition())
- {
- return;
- }
- mCurrentMouseMoveAction = mouseMoveActionForPosition( event->pos() );
-
- //use snapped position for start point and last event point
+ //set current position and type of mouse move action
mMouseMoveStartPos = event->lastScenePos();
mLastMouseEventPos = event->lastScenePos();
+ mCurrentMouseMoveAction = mouseMoveActionForPosition(event->pos());
//create and show bounding rectangle
mBoundingResizeRectangle = new QGraphicsRectItem( 0 );
@@ -311,50 +263,18 @@
}
QPointF mouseMoveStopPoint = event->lastScenePos();
-
- if(mCurrentMouseMoveAction == QgsComposerItem::moveItem) //move action
- {
- double diffX = mouseMoveStopPoint.x() - mMouseMoveStartPos.x();
- double diffY = mouseMoveStopPoint.y() - mMouseMoveStartPos.y();
+ double diffX = mouseMoveStopPoint.x() - mMouseMoveStartPos.x();
+ double diffY = mouseMoveStopPoint.y() - mMouseMoveStartPos.y();
- //it was only a click
- if ( abs( diffX ) < std::numeric_limits<double>::min() && abs( diffY ) < std::numeric_limits<double>::min() )
- {
- return;
- }
+ //it was only a click
+ if ( abs( diffX ) < std::numeric_limits<double>::min() && abs( diffY ) < std::numeric_limits<double>::min() )
+ {
+ return;
+ }
- QPointF upperLeft(transform().dx() + diffX, transform().dy() + diffY);
- QPointF snappedUpperLeft = mComposition->snapPointToGrid(upperLeft);
- QTransform transform;
- transform.translate(snappedUpperLeft.x(), snappedUpperLeft.y());
- setTransform(transform);
- }
- else //resize action
- {
- if(composition() && composition()->snapToGridEnabled())
- {
- mouseMoveStopPoint = composition()->snapPointToGrid(mouseMoveStopPoint);
- }
- double diffX = mouseMoveStopPoint.x() - mMouseMoveStartPos.x();
- double diffY = mouseMoveStopPoint.y() - mMouseMoveStartPos.y();
-
- //it was only a click
- if ( abs( diffX ) < std::numeric_limits<double>::min() && abs( diffY ) < std::numeric_limits<double>::min() )
- {
- return;
- }
-
- double mx, my, rx, ry;
- rectangleChange( diffX, diffY, mx, my, rx, ry );
+ double mx, my, rx, ry;
+ changeItemRectangle(mouseMoveStopPoint, mMouseMoveStartPos, this, diffX, diffY, this);
- QRectF currentRect = rect();
- QRectF newRect( transform().dx() + mx, transform().dy() + my, currentRect.width() + rx, currentRect.height() + ry );
- setSceneRect( newRect );
- }
-
- update();
- scene()->update();
-
//reset default action
mCurrentMouseMoveAction = QgsComposerItem::moveItem;
setCursor( Qt::ArrowCursor );
@@ -450,50 +370,92 @@
return QgsComposerItem::moveItem; //default
}
-
-void QgsComposerItem::rectangleChange( double dx, double dy, double& mx, double& my, double& rx, double& ry ) const
+void QgsComposerItem::changeItemRectangle(const QPointF& currentPosition, const QPointF& mouseMoveStartPos, const QGraphicsRectItem* originalItem, double dx, double dy, QGraphicsRectItem* changeItem)
{
+ if(!changeItem || !originalItem || !mComposition)
+ {
+ return;
+ }
+
+ double mx, my, rx, ry;
+ QPointF snappedPosition = mComposition->snapPointToGrid(currentPosition);
+ //double diffX = snappedPosition.x() - mouseMoveStartPos.x();
+ //double diffY = snappedPosition.y() - mouseMoveStartPos.y();
+ double diffX = 0;
+ double diffY = 0;
+
switch ( mCurrentMouseMoveAction )
{
//vertical resize
case QgsComposerItem::resizeUp:
- mx = 0; my = dy; rx = 0; ry = -dy;
+ diffY = snappedPosition.y() - originalItem->transform().dy();
+ mx = 0; my = diffY; rx = 0; ry = -diffY;
break;
case QgsComposerItem::resizeDown:
- mx = 0; my = 0; rx = 0; ry = dy;
+ diffY = snappedPosition.y() - (originalItem->transform().dy() + originalItem->rect().height());
+ mx = 0; my = 0; rx = 0; ry = diffY;
break;
//horizontal resize
case QgsComposerItem::resizeLeft:
- mx = dx, my = 0; rx = -dx; ry = 0;
+ diffX = snappedPosition.x() - originalItem->transform().dx();
+ mx = diffX, my = 0; rx = -diffX; ry = 0;
break;
case QgsComposerItem::resizeRight:
- mx = 0; my = 0; rx = dx, ry = 0;
+ diffX = snappedPosition.x() - (originalItem->transform().dx() + originalItem->rect().width());
+ mx = 0; my = 0; rx = diffX, ry = 0;
break;
//diagonal resize
case QgsComposerItem::resizeDLeftUp:
- mx = dx, my = dy; rx = -dx; ry = -dy;
+ diffX = snappedPosition.x() - originalItem->transform().dx();
+ diffY = snappedPosition.y() - originalItem->transform().dy();
+ mx = diffX, my = diffY; rx = -diffX; ry = -diffY;
break;
case QgsComposerItem::resizeDRightDown:
- mx = 0; my = 0; rx = dx, ry = dy;
+ diffX = snappedPosition.x() - (originalItem->transform().dx() + originalItem->rect().width());
+ diffY = snappedPosition.y() - (originalItem->transform().dy() + originalItem->rect().height());
+ mx = 0; my = 0; rx = diffX, ry = diffY;
break;
case QgsComposerItem::resizeDRightUp:
- mx = 0; my = dy, rx = dx, ry = -dy;
+ diffX = snappedPosition.x() - (originalItem->transform().dx() + originalItem->rect().width());
+ diffY = snappedPosition.y() - originalItem->transform().dy();
+ mx = 0; my = diffY, rx = diffX, ry = -diffY;
break;
case QgsComposerItem::resizeDLeftDown:
- mx = dx, my = 0; rx = -dx; ry = dy;
+ diffX = snappedPosition.x() - originalItem->transform().dx();
+ diffY = snappedPosition.y() - (originalItem->transform().dy() + originalItem->rect().height());
+ mx = diffX, my = 0; rx = -diffX; ry = diffY;
break;
case QgsComposerItem::moveItem:
- mx = dx; my = dy; rx = 0, ry = 0;
- break;
+
+ //calculate total move difference
+ double moveX = currentPosition.x() - mouseMoveStartPos.x();
+ double moveY = currentPosition.y() - mouseMoveStartPos.y();
+
+ QPointF upperLeftPoint(originalItem->transform().dx() + moveX, originalItem->transform().dy() + moveY);
+ QPointF snappedLeftPoint = mComposition->snapPointToGrid(upperLeftPoint);
+
+ double moveRectX = snappedLeftPoint.x() - originalItem->transform().dx();
+ double moveRectY = snappedLeftPoint.y() - originalItem->transform().dy();
+
+ QTransform moveTransform;
+ moveTransform.translate(originalItem->transform().dx() + moveRectX, originalItem->transform().dy() + moveRectY);
+ changeItem->setTransform(moveTransform);
+ return;
}
+
+ QTransform itemTransform;
+ itemTransform.translate(originalItem->transform().dx() + mx, originalItem->transform().dy() + my);
+ changeItem->setTransform(itemTransform);
+ QRectF itemRect(0, 0, originalItem->rect().width() + rx, originalItem->rect().height() + ry);
+ changeItem->setRect(itemRect);
}
void QgsComposerItem::drawSelectionBoxes( QPainter* p )
Modified: branches/advanced_printing_branch2/src/core/composer/qgscomposeritem.h
===================================================================
--- branches/advanced_printing_branch2/src/core/composer/qgscomposeritem.h 2008-09-25 20:58:30 UTC (rev 9408)
+++ branches/advanced_printing_branch2/src/core/composer/qgscomposeritem.h 2008-09-26 13:02:30 UTC (rev 9409)
@@ -168,14 +168,15 @@
/**Finds out which mouse move action to choose depending on the cursor position inside the widget*/
QgsComposerItem::mouseMoveAction mouseMoveActionForPosition( const QPointF& itemCoordPos );
- /**Calculate rectangle changes according to mouse move (dx, dy) and the current mouse move action
- @param dx x-coordinate move of cursor
- @param dy y-coordinate move of cursor
- @param mx out: rectangle should be moved by mx in x-direction
- @param my out: rectangle should be moved by my in y-direction
- @param rx out: width of rectangle should be resized by rx
- @param ry out: height of rectangle should be resized by ry*/
- void rectangleChange( double dx, double dy, double& mx, double& my, double& rx, double& ry ) const;
+ /**Changes the rectangle of an item depending on current mouse action (resize or move)
+ @param currentPosition current position of mouse cursor
+ @param mouseMoveStartPos cursor position at the start of the current mouse action
+ @param originalItem Item position at the start of the mouse action
+ @param dx x-Change of mouse cursor
+ @param dy y-Change of mouse cursor
+ @param changeItem Item to change size (can be the same as originalItem or a differen one)
+ */
+ void changeItemRectangle(const QPointF& currentPosition, const QPointF& mouseMoveStartPos, const QGraphicsRectItem* originalItem, double dx, double dy, QGraphicsRectItem* changeItem);
/**Draw selection boxes around item*/
virtual void drawSelectionBoxes( QPainter* p );
More information about the QGIS-commit
mailing list