diff --git a/src/app/composer/qgscomposer.cpp b/src/app/composer/qgscomposer.cpp
index 5fbfee0402c..642f588c2d8 100644
--- a/src/app/composer/qgscomposer.cpp
+++ b/src/app/composer/qgscomposer.cpp
@@ -144,6 +144,7 @@ QgsComposer::QgsComposer( QgisApp *qgis, const QString& title )
QActionGroup* toggleActionGroup = new QActionGroup( this );
toggleActionGroup->addAction( mActionMoveItemContent );
+ toggleActionGroup->addAction( mActionPan );
toggleActionGroup->addAction( mActionAddNewMap );
toggleActionGroup->addAction( mActionAddNewLabel );
toggleActionGroup->addAction( mActionAddNewLegend );
@@ -166,6 +167,7 @@ QgsComposer::QgsComposer( QgisApp *qgis, const QString& title )
mActionAddNewScalebar->setCheckable( true );
mActionAddImage->setCheckable( true );
mActionMoveItemContent->setCheckable( true );
+ mActionPan->setCheckable( true );
mActionAddArrow->setCheckable( true );
#ifdef Q_WS_MAC
@@ -1673,6 +1675,14 @@ void QgsComposer::on_mActionMoveItemContent_triggered()
}
}
+void QgsComposer::on_mActionPan_triggered()
+{
+ if ( mView )
+ {
+ mView->setCurrentTool( QgsComposerView::Pan );
+ }
+}
+
void QgsComposer::on_mActionGroupItems_triggered()
{
if ( mView )
diff --git a/src/app/composer/qgscomposer.h b/src/app/composer/qgscomposer.h
index 1f8e23961fa..4a2d6415631 100644
--- a/src/app/composer/qgscomposer.h
+++ b/src/app/composer/qgscomposer.h
@@ -204,6 +204,9 @@ class QgsComposer: public QMainWindow, private Ui::QgsComposerBase
//! Set tool to move item content
void on_mActionMoveItemContent_triggered();
+ //! Set tool to move item content
+ void on_mActionPan_triggered();
+
//! Group selected items
void on_mActionGroupItems_triggered();
@@ -242,7 +245,7 @@ class QgsComposer: public QMainWindow, private Ui::QgsComposerBase
//! Select next item below
void on_mActionSelectNextAbove_triggered();
-
+
//! Select next item above
void on_mActionSelectNextBelow_triggered();
diff --git a/src/gui/qgscomposerview.cpp b/src/gui/qgscomposerview.cpp
index 0a236109651..c41c4376223 100644
--- a/src/gui/qgscomposerview.cpp
+++ b/src/gui/qgscomposerview.cpp
@@ -49,6 +49,7 @@ QgsComposerView::QgsComposerView( QWidget* parent, const char* name, Qt::WFlags
, mPaintingEnabled( true )
, mHorizontalRuler( 0 )
, mVerticalRuler( 0 )
+ , mPanning( false )
{
Q_UNUSED( f );
Q_UNUSED( name );
@@ -59,6 +60,29 @@ QgsComposerView::QgsComposerView( QWidget* parent, const char* name, Qt::WFlags
setFrameShape( QFrame::NoFrame );
}
+void QgsComposerView::setCurrentTool( QgsComposerView::Tool t )
+{
+ mCurrentTool = t;
+
+ //update mouse cursor for current tool
+ if ( !composition() )
+ {
+ return;
+ }
+ if ( t == QgsComposerView::Pan )
+ {
+ //lock cursor to prevent composer items changing it
+ composition()->setPreventCursorChange( true );
+ viewport()->setCursor( Qt::OpenHandCursor );
+ }
+ else
+ {
+ //not using pan tool, composer items can change cursor
+ composition()->setPreventCursorChange( false );
+ viewport()->setCursor( Qt::ArrowCursor );
+ }
+}
+
void QgsComposerView::mousePressEvent( QMouseEvent* e )
{
if ( !composition() )
@@ -166,6 +190,15 @@ void QgsComposerView::mousePressEvent( QMouseEvent* e )
break;
}
+ case Pan:
+ {
+ //pan action
+ mPanning = true;
+ mMouseLastXY = e->pos();
+ viewport()->setCursor( Qt::ClosedHandCursor );
+ break;
+ }
+
case MoveItemContent:
{
//get a list of items at clicked position
@@ -341,6 +374,27 @@ void QgsComposerView::mouseReleaseEvent( QMouseEvent* e )
QPointF scenePoint = mapToScene( e->pos() );
+ if ( mPanning )
+ {
+ mPanning = false;
+
+ //set new cursor
+ if ( mCurrentTool == Pan )
+ {
+ viewport()->setCursor( Qt::OpenHandCursor );
+ }
+ else
+ {
+ if ( composition() )
+ {
+ //allow composer items to change cursor
+ composition()->setPreventCursorChange( false );
+ }
+ viewport()->setCursor( Qt::ArrowCursor );
+ }
+ return;
+ }
+
switch ( mCurrentTool )
{
case Select:
@@ -444,6 +498,8 @@ void QgsComposerView::mouseMoveEvent( QMouseEvent* e )
return;
}
+ mMouseCurrentXY = e->pos();
+
updateRulers();
if ( mHorizontalRuler )
{
@@ -454,7 +510,15 @@ void QgsComposerView::mouseMoveEvent( QMouseEvent* e )
mVerticalRuler->updateMarker( e->posF() );
}
- if ( e->buttons() == Qt::NoButton )
+ if ( mPanning )
+ {
+ //panning, so scroll view
+ horizontalScrollBar()->setValue( horizontalScrollBar()->value() - ( e->x() - mMouseLastXY.x() ) );
+ verticalScrollBar()->setValue( verticalScrollBar()->value() - ( e->y() - mMouseLastXY.y() ) );
+ mMouseLastXY = e->pos();
+ return;
+ }
+ else if ( e->buttons() == Qt::NoButton )
{
if ( mCurrentTool == Select )
{
diff --git a/src/gui/qgscomposerview.h b/src/gui/qgscomposerview.h
index 4947ef5334f..77ef661b7a5 100644
--- a/src/gui/qgscomposerview.h
+++ b/src/gui/qgscomposerview.h
@@ -65,7 +65,8 @@ class GUI_EXPORT QgsComposerView: public QGraphicsView
AddEllipse,
AddTriangle,
AddTable, //add attribute table
- MoveItemContent //move content of item (e.g. content of map)
+ MoveItemContent, //move content of item (e.g. content of map)
+ Pan
};
enum ClipboardMode
@@ -108,7 +109,7 @@ class GUI_EXPORT QgsComposerView: public QGraphicsView
void selectInvert();
QgsComposerView::Tool currentTool() const {return mCurrentTool;}
- void setCurrentTool( QgsComposerView::Tool t ) {mCurrentTool = t;}
+ void setCurrentTool( QgsComposerView::Tool t );
/**Sets composition (derived from QGraphicsScene)*/
void setComposition( QgsComposition* c );
@@ -167,6 +168,10 @@ class GUI_EXPORT QgsComposerView: public QGraphicsView
/** Draw a shape on the canvas */
void addShape( Tool currentTool );
+ bool mPanning;
+ QPoint mMouseLastXY;
+ QPoint mMouseCurrentXY;
+
//void connectAddRemoveCommandSignals( QgsAddRemoveItemCommand* c );
signals:
diff --git a/src/ui/qgscomposerbase.ui b/src/ui/qgscomposerbase.ui
index ceccebe377c..0ba42288526 100644
--- a/src/ui/qgscomposerbase.ui
+++ b/src/ui/qgscomposerbase.ui
@@ -96,6 +96,7 @@
true
+
@@ -673,6 +674,15 @@
Ctrl+Alt+]
+
+
+
+ :/images/themes/default/mActionPan.svg:/images/themes/default/mActionPan.svg
+
+
+ Pan Composer
+
+