diff --git a/src/core/composer/qgscomposeritem.cpp b/src/core/composer/qgscomposeritem.cpp index b8e4e65e652c..a8dfe9fe9afd 100644 --- a/src/core/composer/qgscomposeritem.cpp +++ b/src/core/composer/qgscomposeritem.cpp @@ -924,6 +924,13 @@ void QgsComposerItem::setEffectsEnabled( bool effectsEnabled ) void QgsComposerItem::hoverMoveEvent( QGraphicsSceneHoverEvent * event ) { + if ( QgsApplication::mouseButtons() == Qt::MidButton ) + { + //middle mouse button panning, make sure we use the closed hand cursor + setCursor( Qt::ClosedHandCursor ); + return; + } + if ( isSelected() ) { setCursor( cursorForPosition( event->pos() ) ); diff --git a/src/gui/qgscomposerview.cpp b/src/gui/qgscomposerview.cpp index a07f7891545d..d3c6e9a5e66b 100644 --- a/src/gui/qgscomposerview.cpp +++ b/src/gui/qgscomposerview.cpp @@ -48,6 +48,7 @@ QgsComposerView::QgsComposerView( QWidget* parent, const char* name, Qt::WFlags , mPaintingEnabled( true ) , mHorizontalRuler( 0 ) , mVerticalRuler( 0 ) + , mPanning( false ) { Q_UNUSED( f ); Q_UNUSED( name ); @@ -83,6 +84,15 @@ void QgsComposerView::mousePressEvent( QMouseEvent* e ) } return; } + else if ( e->button() == Qt::MidButton ) + { + //pan composer with middle button + mPanning = true; + mMouseLastXY = e->pos(); + setCursor( Qt::ClosedHandCursor ); + e->accept(); + return; + } switch ( mCurrentTool ) { @@ -310,6 +320,15 @@ void QgsComposerView::mouseReleaseEvent( QMouseEvent* e ) QPointF scenePoint = mapToScene( e->pos() ); + if ( mPanning ) + { + //panning with middle button + mPanning = false; + setCursor( Qt::ArrowCursor ); + e->accept(); + return; + } + switch ( mCurrentTool ) { case Select: @@ -430,6 +449,15 @@ void QgsComposerView::mouseMoveEvent( QMouseEvent* e ) QGraphicsView::mouseMoveEvent( e ); } } + else if ( mPanning ) + { + //panning with middle mouse button, scroll view + horizontalScrollBar()->setValue( horizontalScrollBar()->value() - ( e->x() - mMouseLastXY.x() ) ); + verticalScrollBar()->setValue( verticalScrollBar()->value() - ( e->y() - mMouseLastXY.y() ) ); + mMouseLastXY = e->pos(); + e->accept(); + return; + } else { QPointF scenePoint = mapToScene( e->pos() ); @@ -757,16 +785,47 @@ void QgsComposerView::wheelEvent( QWheelEvent* event ) { QPointF scenePoint = mapToScene( event->pos() ); - //select topmost item at position of event - QgsComposerItem* theItem = composition()->composerItemAt( scenePoint ); - if ( theItem ) + if ( currentTool() == MoveItemContent ) { - if ( theItem->isSelected() ) + //move item content tool, so scroll events get handled by the composer item + + //select topmost item at position of event + QgsComposerItem* theItem = composition()->composerItemAt( scenePoint ); + if ( theItem ) { - QPointF itemPoint = theItem->mapFromScene( scenePoint ); - theItem->beginCommand( tr( "Zoom item content" ) ); - theItem->zoomContent( event->delta(), itemPoint.x(), itemPoint.y() ); - theItem->endCommand(); + if ( theItem->isSelected() ) + { + QPointF itemPoint = theItem->mapFromScene( scenePoint ); + theItem->beginCommand( tr( "Zoom item content" ) ); + theItem->zoomContent( event->delta(), itemPoint.x(), itemPoint.y() ); + theItem->endCommand(); + } + } + } + else + { + //zoom whole composition + if ( event->delta() > 0 ) + { + scale( 2, 2 ); + } + else + { + scale( 0.5, 0.5 ); + } + + updateRulers(); + update(); + //redraw cached map items + QList itemList = composition()->items(); + QList::iterator itemIt = itemList.begin(); + for ( ; itemIt != itemList.end(); ++itemIt ) + { + QgsComposerMap* mypItem = dynamic_cast( *itemIt ); + if (( mypItem ) && ( mypItem->previewMode() == QgsComposerMap::Render ) ) + { + mypItem->updateCachedImage(); + } } } } diff --git a/src/gui/qgscomposerview.h b/src/gui/qgscomposerview.h index 4947ef5334f7..cb2999858e5e 100644 --- a/src/gui/qgscomposerview.h +++ b/src/gui/qgscomposerview.h @@ -167,6 +167,9 @@ class GUI_EXPORT QgsComposerView: public QGraphicsView /** Draw a shape on the canvas */ void addShape( Tool currentTool ); + bool mPanning; + QPoint mMouseLastXY; + //void connectAddRemoveCommandSignals( QgsAddRemoveItemCommand* c ); signals: