Skip to content

Commit 9aa481e

Browse files
author
mhugent
committed
[FEATURE]: Possibility to rotate composer map
git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@11847 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent c74fde5 commit 9aa481e

9 files changed

Lines changed: 1032 additions & 641 deletions

‎python/core/qgscomposermap.sip‎

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,26 @@ class QgsComposerMap : QObject, QgsComposerItem
2424
Rectangle // Display only rectangle
2525
};
2626

27+
enum GridStyle
28+
{
29+
Solid = 0, //solid lines
30+
Cross //only draw line crossings
31+
};
32+
33+
enum GridAnnotationPosition
34+
{
35+
InsideMapFrame = 0,
36+
OutsideMapFrame
37+
};
38+
39+
enum GridAnnotationDirection
40+
{
41+
Horizontal = 0,
42+
Vertical,
43+
HorizontalAndVertical,
44+
BoundaryDirection
45+
};
46+
2747
/** \brief Draw to paint device
2848
@param extent map extent
2949
@param size size in scene coordinates
@@ -71,6 +91,22 @@ class QgsComposerMap : QObject, QgsComposerItem
7191
PreviewMode previewMode();
7292
void setPreviewMode( PreviewMode m );
7393

94+
/**Getter for flag that determines if the stored layer set should be used or the current layer set of the qgis mapcanvas
95+
@note this function was added in version 1.2*/
96+
bool keepLayerSet() const;
97+
/**Setter for flag that determines if the stored layer set should be used or the current layer set of the qgis mapcanvas
98+
@note this function was added in version 1.2*/
99+
void setKeepLayerSet( bool enabled );
100+
101+
/**Getter for stored layer set that is used if mKeepLayerSet is true
102+
@note this function was added in version 1.2*/
103+
QStringList layerSet() const;
104+
/**Setter for stored layer set that is used if mKeepLayerSet is true
105+
@note this function was added in version 1.2*/
106+
void setLayerSet( const QStringList& layerSet );
107+
/**Stores the current layer set of the qgis mapcanvas in mLayerSet*/
108+
void storeCurrentLayerSet();
109+
74110
// Set cache outdated
75111
void setCacheUpdated( bool u = false );
76112

@@ -95,6 +131,55 @@ class QgsComposerMap : QObject, QgsComposerItem
95131
*/
96132
bool readXML( const QDomElement& itemElem, const QDomDocument& doc );
97133

134+
void setGridEnabled( bool enabled );
135+
bool gridEnabled() const;
136+
137+
void setGridStyle( GridStyle style );
138+
GridStyle gridStyle() const;
139+
140+
void setGridIntervalX( double interval );
141+
double gridIntervalX() const;
142+
143+
void setGridIntervalY( double interval );
144+
double gridIntervalY() const;
145+
146+
void setGridOffsetX( double offset );
147+
double gridOffsetX() const;
148+
149+
void setGridOffsetY( double offset );
150+
double gridOffsetY() const;
151+
152+
void setGridPen( const QPen& p );
153+
QPen gridPen() const;
154+
void setGridPenWidth( double w );
155+
void setGridPenColor( const QColor& c );
156+
157+
void setGridAnnotationFont( const QFont& f );
158+
QFont gridAnnotationFont() const;
159+
160+
void setShowGridAnnotation( bool show );
161+
bool showGridAnnotation() const;
162+
163+
void setGridAnnotationPosition( GridAnnotationPosition p );
164+
GridAnnotationPosition gridAnnotationPosition() const;
165+
166+
void setAnnotationFrameDistance( double d ) {mAnnotationFrameDistance = d;}
167+
double annotationFrameDistance() const {return mAnnotationFrameDistance;}
168+
169+
void setGridAnnotationDirection( GridAnnotationDirection d );
170+
GridAnnotationDirection gridAnnotationDirection() const;
171+
172+
/**In case of annotations, the bounding rectangle can be larger than the map item rectangle*/
173+
QRectF boundingRect() const;
174+
/**Updates the bounding rect of this item. Call this function before doing any changes related to annotation out of the map rectangle*/
175+
void updateBoundingRect();
176+
177+
void setRotation(double r);
178+
double rotation() const;
179+
180+
void setCrossLength(double l);
181+
double crossLength();
182+
98183
public slots:
99184

100185
/**Called if map canvas has changed*/

‎src/app/composer/qgscomposermapwidget.cpp‎

Lines changed: 43 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,13 @@
2525
QgsComposerMapWidget::QgsComposerMapWidget( QgsComposerMap* composerMap ): QWidget(), mComposerMap( composerMap )
2626
{
2727
setupUi( this );
28-
mGridDockWidget->setVisible( false );
28+
mGridWidget->setVisible( false );
29+
mGridWidget->setParent( 0 ); //in order to save space, separate the grid widget
30+
mGridWidget->setWindowFlags( Qt::CustomizeWindowHint | Qt::WindowTitleHint );
2931

3032
//add widget for general composer item properties
3133
QgsComposerItemWidget* itemPropertiesWidget = new QgsComposerItemWidget( this, composerMap );
32-
gridLayout_3->addWidget( itemPropertiesWidget, 7, 0, 1, 1 );
34+
gridLayout_3->addWidget( itemPropertiesWidget, 6, 0, 1, 1 );
3335
QDoubleValidator v( 0 );
3436

3537
mWidthLineEdit->setValidator( &v );
@@ -55,9 +57,8 @@ QgsComposerMapWidget::QgsComposerMapWidget( QgsComposerMap* composerMap ): QWidg
5557
mAnnotationDirectionComboBox->insertItem( 0, tr( "Horizontal" ) );
5658
mAnnotationDirectionComboBox->insertItem( 1, tr( "Vertical" ) );
5759
mAnnotationDirectionComboBox->insertItem( 2, tr( "Horizontal and Vertical" ) );
60+
mAnnotationDirectionComboBox->insertItem( 2, tr( "Boundary direction" ) );
5861

59-
mAnnotationTypeComboBox->insertItem( 0, tr( "Coordinate" ) );
60-
mAnnotationTypeComboBox->insertItem( 1, tr( "Sector" ) );
6162
blockAllSignals( false );
6263

6364
if ( composerMap )
@@ -70,7 +71,7 @@ QgsComposerMapWidget::QgsComposerMapWidget( QgsComposerMap* composerMap ): QWidg
7071

7172
QgsComposerMapWidget::~QgsComposerMapWidget()
7273
{
73-
74+
delete mGridWidget;
7475
}
7576

7677
void QgsComposerMapWidget::on_mWidthLineEdit_editingFinished()
@@ -160,6 +161,18 @@ void QgsComposerMapWidget::on_mScaleLineEdit_editingFinished()
160161
mComposerMap->setNewScale( scaleDenominator );
161162
}
162163

164+
void QgsComposerMapWidget::on_mRotationSpinBox_valueChanged( int value )
165+
{
166+
if ( !mComposerMap )
167+
{
168+
return;
169+
}
170+
171+
mComposerMap->setRotation( value );
172+
mComposerMap->cache();
173+
mComposerMap->update();
174+
}
175+
163176
void QgsComposerMapWidget::on_mSetToMapCanvasExtentButton_clicked()
164177
{
165178
if ( mComposerMap )
@@ -274,6 +287,8 @@ void QgsComposerMapWidget::updateGuiElements()
274287
mYMinLineEdit->setText( QString::number( composerMapExtent.yMinimum(), 'f', 3 ) );
275288
mYMaxLineEdit->setText( QString::number( composerMapExtent.yMaximum(), 'f', 3 ) );
276289

290+
mRotationSpinBox->setValue( mComposerMap->rotation() );
291+
277292
//keep layer list check box
278293
if ( mComposerMap->keepLayerSet() )
279294
{
@@ -309,6 +324,8 @@ void QgsComposerMapWidget::updateGuiElements()
309324
mGridTypeComboBox->setCurrentIndex( mGridTypeComboBox->findText( tr( "Solid" ) ) );
310325
}
311326

327+
mCrossWidthSpinBox->setValue( mComposerMap->crossLength() );
328+
312329
QgsComposerMap::GridAnnotationPosition annotationPos = mComposerMap->gridAnnotationPosition();
313330
if ( annotationPos == QgsComposerMap::InsideMapFrame )
314331
{
@@ -339,19 +356,13 @@ void QgsComposerMapWidget::updateGuiElements()
339356
{
340357
mAnnotationDirectionComboBox->setCurrentIndex( mAnnotationDirectionComboBox->findText( tr( "Vertical" ) ) );
341358
}
342-
else
359+
else if ( dir == QgsComposerMap::HorizontalAndVertical )
343360
{
344361
mAnnotationDirectionComboBox->setCurrentIndex( mAnnotationDirectionComboBox->findText( tr( "Horizontal and Vertical" ) ) );
345362
}
346-
347-
QgsComposerMap::GridAnnotationType type = mComposerMap->gridAnnotationType();
348-
if ( type == QgsComposerMap::Sector )
349-
{
350-
mAnnotationTypeComboBox->setCurrentIndex( mAnnotationTypeComboBox->findText( tr( "Sector" ) ) );
351-
}
352-
else
363+
else //BoundaryDirection
353364
{
354-
mAnnotationTypeComboBox->setCurrentIndex( mAnnotationTypeComboBox->findText( tr( "Coordinate" ) ) );
365+
mAnnotationDirectionComboBox->setCurrentIndex( mAnnotationDirectionComboBox->findText( tr( "Boundary direction" ) ) );
355366
}
356367

357368

@@ -400,6 +411,7 @@ void QgsComposerMapWidget::blockAllSignals( bool b )
400411
mOffsetXSpinBox->blockSignals( b );
401412
mOffsetYSpinBox->blockSignals( b );
402413
mGridTypeComboBox->blockSignals( b );
414+
mCrossWidthSpinBox->blockSignals( b );
403415
mPreviewModeComboBox->blockSignals( b );
404416
mKeepLayerListCheckBox->blockSignals( b );
405417
mSetToMapCanvasExtentButton->blockSignals( b );
@@ -411,7 +423,6 @@ void QgsComposerMapWidget::blockAllSignals( bool b )
411423
mAnnotationPositionComboBox->blockSignals( b );
412424
mDistanceToMapFrameSpinBox->blockSignals( b );
413425
mAnnotationDirectionComboBox->blockSignals( b );
414-
mAnnotationTypeComboBox->blockSignals( b );
415426
}
416427

417428
void QgsComposerMapWidget::on_mUpdatePreviewButton_clicked()
@@ -561,6 +572,17 @@ void QgsComposerMapWidget::on_mGridTypeComboBox_currentIndexChanged( const QStri
561572
mComposerMap->update();
562573
}
563574

575+
void QgsComposerMapWidget::on_mCrossWidthSpinBox_valueChanged( double d )
576+
{
577+
if ( !mComposerMap )
578+
{
579+
return;
580+
}
581+
582+
mComposerMap->setCrossLength( d );
583+
mComposerMap->update();
584+
}
585+
564586
void QgsComposerMapWidget::on_mAnnotationFontButton_clicked()
565587
{
566588
if ( !mComposerMap )
@@ -647,40 +669,26 @@ void QgsComposerMapWidget::on_mAnnotationDirectionComboBox_currentIndexChanged(
647669
{
648670
mComposerMap->setGridAnnotationDirection( QgsComposerMap::Vertical );
649671
}
650-
else
672+
else if ( text == tr( "Horizontal and Vertical" ) )
651673
{
652674
mComposerMap->setGridAnnotationDirection( QgsComposerMap::HorizontalAndVertical );
653675
}
654-
mComposerMap->updateBoundingRect();
655-
mComposerMap->update();
656-
}
657-
658-
void QgsComposerMapWidget::on_mAnnotationTypeComboBox_currentIndexChanged( const QString& text )
659-
{
660-
if ( !mComposerMap )
661-
{
662-
return;
663-
}
664-
665-
if ( text == tr( "Sector" ) )
676+
else //BoundaryDirection
666677
{
667-
mComposerMap->setGridAnnotationType( QgsComposerMap::Sector );
668-
}
669-
else
670-
{
671-
mComposerMap->setGridAnnotationType( QgsComposerMap::Coordinate );
678+
mComposerMap->setGridAnnotationDirection( QgsComposerMap::BoundaryDirection );
672679
}
680+
mComposerMap->updateBoundingRect();
673681
mComposerMap->update();
674682
}
675683

676684
void QgsComposerMapWidget::on_mShowGridDialogCheckBox_stateChanged( int state )
677685
{
678686
if ( state == Qt::Checked )
679687
{
680-
mGridDockWidget->setVisible( true );
688+
mGridWidget->setVisible( true );
681689
}
682690
else
683691
{
684-
mGridDockWidget->setVisible( false );
692+
mGridWidget->setVisible( false );
685693
}
686694
}

‎src/app/composer/qgscomposermapwidget.h‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ class QgsComposerMapWidget: public QWidget, private Ui::QgsComposerMapWidgetBase
3939
void on_mHeightLineEdit_editingFinished();
4040
void on_mPreviewModeComboBox_activated( int i );
4141
void on_mScaleLineEdit_editingFinished();
42+
void on_mRotationSpinBox_valueChanged( int value );
4243
void on_mSetToMapCanvasExtentButton_clicked();
4344
void on_mUpdatePreviewButton_clicked();
4445
void on_mKeepLayerListCheckBox_stateChanged( int state );
@@ -56,12 +57,12 @@ class QgsComposerMapWidget: public QWidget, private Ui::QgsComposerMapWidgetBase
5657
void on_mLineWidthSpinBox_valueChanged( double d );
5758
void on_mLineColorButton_clicked();
5859
void on_mGridTypeComboBox_currentIndexChanged( const QString& text );
60+
void on_mCrossWidthSpinBox_valueChanged( double d );
5961
void on_mAnnotationFontButton_clicked();
6062
void on_mDistanceToMapFrameSpinBox_valueChanged( double d );
6163
void on_mAnnotationPositionComboBox_currentIndexChanged( const QString& text );
6264
void on_mDrawAnnotationCheckBox_stateChanged( int state );
6365
void on_mAnnotationDirectionComboBox_currentIndexChanged( const QString& text );
64-
void on_mAnnotationTypeComboBox_currentIndexChanged( const QString& text );
6566
void on_mShowGridDialogCheckBox_stateChanged( int state );
6667

6768
/**Updates width and height without notify the composer map (to avoid infinite recursion)*/

‎src/core/composer/qgscomposeritem.cpp‎

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
#define FONT_WORKAROUND_SCALE 10 //scale factor for upscaling fontsize and downscaling painter
3535

3636
QgsComposerItem::QgsComposerItem( QgsComposition* composition, bool manageZValue ): QGraphicsRectItem( 0 ), mComposition( composition ), mBoundingResizeRectangle( 0 ), \
37-
mFrame( true ), mItemPositionLocked( false )
37+
mFrame( true ), mItemPositionLocked( false ), mLastValidViewScaleFactor( -1 )
3838
{
3939
setFlag( QGraphicsItem::ItemIsSelectable, true );
4040
setAcceptsHoverEvents( true );
@@ -53,7 +53,7 @@ QgsComposerItem::QgsComposerItem( QgsComposition* composition, bool manageZValue
5353
}
5454

5555
QgsComposerItem::QgsComposerItem( qreal x, qreal y, qreal width, qreal height, QgsComposition* composition, bool manageZValue ): \
56-
QGraphicsRectItem( 0, 0, width, height, 0 ), mComposition( composition ), mBoundingResizeRectangle( 0 ), mFrame( true ), mItemPositionLocked( false )
56+
QGraphicsRectItem( 0, 0, width, height, 0 ), mComposition( composition ), mBoundingResizeRectangle( 0 ), mFrame( true ), mItemPositionLocked( false ), mLastValidViewScaleFactor( -1 )
5757
{
5858
setFlag( QGraphicsItem::ItemIsSelectable, true );
5959
setAcceptsHoverEvents( true );
@@ -135,6 +135,8 @@ bool QgsComposerItem::_writeXML( QDomElement& itemElem, QDomDocument& doc ) cons
135135
composerItemElem.setAttribute( "positionLock", "false" );
136136
}
137137

138+
composerItemElem.setAttribute( "lastValidViewScaleFactor", mLastValidViewScaleFactor );
139+
138140

139141
//frame color
140142
QDomElement frameColorElem = doc.createElement( "FrameColor" );
@@ -205,6 +207,8 @@ bool QgsComposerItem::_readXML( const QDomElement& itemElem, const QDomDocument&
205207
setSceneRect( QRectF( x, y, width, height ) );
206208
setZValue( itemElem.attribute( "zValue" ).toDouble() );
207209

210+
mLastValidViewScaleFactor = itemElem.attribute( "lastValidViewScaleFactor", "-1" ).toDouble();
211+
208212
//pen
209213
QDomNodeList frameColorList = itemElem.elementsByTagName( "FrameColor" );
210214
if ( frameColorList.size() > 0 )
@@ -736,17 +740,18 @@ QFont QgsComposerItem::scaledFontPixelSize( const QFont& font ) const
736740

737741
double QgsComposerItem::horizontalViewScaleFactor() const
738742
{
739-
double result = 1;
743+
double result = -1;
740744
if ( scene() )
741745
{
742746
QList<QGraphicsView*> viewList = scene()->views();
743-
if ( viewList.size() > 0 )
744-
{
745-
result = viewList.at( 0 )->transform().m11();
746-
}
747-
else
747+
if ( viewList.size() > 0 ) //if not, probably this function was called from non-gui code
748748
{
749-
return 1; //probably called from non-gui code
749+
QGraphicsView* currentView = viewList.at( 0 );
750+
if ( currentView->isVisible() )
751+
{
752+
result = currentView->transform().m11();
753+
mLastValidViewScaleFactor = result;
754+
}
750755
}
751756
}
752757
return result;

‎src/core/composer/qgscomposeritem.h‎

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,9 @@ class CORE_EXPORT QgsComposerItem: public QGraphicsRectItem
188188
@note: this member was added in version 1.2*/
189189
bool mItemPositionLocked;
190190

191+
/**Backup to restore item appearance if no view scale factor is available*/
192+
mutable double mLastValidViewScaleFactor;
193+
191194
//event handlers
192195
virtual void mouseMoveEvent( QGraphicsSceneMouseEvent * event );
193196
virtual void mousePressEvent( QGraphicsSceneMouseEvent * event );
@@ -228,8 +231,8 @@ class CORE_EXPORT QgsComposerItem: public QGraphicsRectItem
228231
@note: this function was introduced in version 1.2*/
229232
double lockSymbolSize() const;
230233

231-
/**Returns the zoom factor of the graphics view. If no
232-
graphics view exists, the default 1 is returned
234+
/**Returns the zoom factor of the graphics view.
235+
@return the factor or -1 in case of error (e.g. graphic view does not exist)
233236
@note: this function was introduced in version 1.2*/
234237
double horizontalViewScaleFactor() const;
235238
};

0 commit comments

Comments
 (0)