diff --git a/src/gui/qgscomposerview.cpp b/src/gui/qgscomposerview.cpp index 992d4371b08..65e20da8feb 100644 --- a/src/gui/qgscomposerview.cpp +++ b/src/gui/qgscomposerview.cpp @@ -101,6 +101,7 @@ void QgsComposerView::mousePressEvent( QMouseEvent* e ) { QTransform t; mRubberBandItem = new QGraphicsRectItem( 0, 0, 0, 0 ); + mRubberBandStartPos = QPointF(snappedScenePoint.x(), snappedScenePoint.y()); t.translate( snappedScenePoint.x(), snappedScenePoint.y() ); mRubberBandItem->setTransform( t ); mRubberBandItem->setZValue( 100 ); @@ -235,10 +236,43 @@ void QgsComposerView::mouseMoveEvent( QMouseEvent* e ) case AddMap: //adjust rubber band item - newWidth = scenePoint.x() - mRubberBandItem->transform().dx(); - newHeight = scenePoint.y() - mRubberBandItem->transform().dy(); - mRubberBandItem->setRect( 0, 0, newWidth, newHeight ); - break; + { + double x = 0; + double y = 0; + double width = 0; + double height = 0; + + double dx = scenePoint.x() - mRubberBandStartPos.x(); + double dy = scenePoint.y() - mRubberBandStartPos.y(); + + if(dx < 0) + { + x = scenePoint.x(); + width = -dx; + } + else + { + x = mRubberBandStartPos.x(); + width = dx; + } + + if(dy < 0) + { + y = scenePoint.y(); + height = -dy; + } + else + { + y = mRubberBandStartPos.y(); + height = dy; + } + + mRubberBandItem->setRect( 0, 0, width, height ); + QTransform t; + t.translate(x, y); + mRubberBandItem->setTransform(t); + break; + } case MoveItemContent: { diff --git a/src/gui/qgscomposerview.h b/src/gui/qgscomposerview.h index ab7e1d5bd7b..2b5a71e0703 100644 --- a/src/gui/qgscomposerview.h +++ b/src/gui/qgscomposerview.h @@ -107,6 +107,8 @@ class GUI_EXPORT QgsComposerView: public QGraphicsView QgsComposerItem* mMoveContentItem; /**Start position of content move*/ QPointF mMoveContentStartPos; + /**Start of rubber band creation*/ + QPointF mRubberBandStartPos; public slots: /**For QgsComposerItemGroup to send its signals to QgsComposer (or other classes that keep track of input widgets)*/