Skip to content

Commit df3fdf5

Browse files
authored
Merge pull request #4005 from nyalldawson/comp_mapsettings
Remove some more QgsComposition::mapSettings use, also support different CRS in composer map items
2 parents 433d04b + 710a12c commit df3fdf5

41 files changed

Lines changed: 412 additions & 128 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎python/core/composer/qgscomposermap.sip‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,10 @@ class QgsComposerMap : QgsComposerItem
127127
//! @note not available in python bindings
128128
// QgsRectangle* currentMapExtent();
129129

130+
QgsCoordinateReferenceSystem crs() const;
131+
QgsCoordinateReferenceSystem presetCrs() const;
132+
void setCrs( const QgsCoordinateReferenceSystem& crs );
133+
130134
PreviewMode previewMode() const;
131135
void setPreviewMode( PreviewMode m );
132136

‎python/core/composer/qgscomposerutils.sip‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,5 +249,5 @@ class QgsComposerUtils
249249
* QgsComposition::referenceMap().
250250
* @note added in QGIS 3.0
251251
*/
252-
static QgsRenderContext createRenderContext( QgsComposition* composition, QPainter& painter );
252+
static QgsRenderContext createRenderContext( QgsComposition* composition, QPainter* painter );
253253
};

‎python/gui/qgscomposerview.sip‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,9 @@ class QgsComposerView : QGraphicsView
133133
*/
134134
void setPreviewMode( QgsPreviewEffect::PreviewMode mode );
135135

136+
void setMapCanvas( QgsMapCanvas* canvas );
137+
QgsMapCanvas* mapCanvas() const;
138+
136139
protected:
137140
void mousePressEvent( QMouseEvent* );
138141
void mouseReleaseEvent( QMouseEvent* );

‎src/app/composer/qgscomposer.cpp‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4027,6 +4027,7 @@ void QgsComposer::createComposerView()
40274027

40284028
delete mView;
40294029
mView = new QgsComposerView();
4030+
mView->setMapCanvas( mQgis->mapCanvas() );
40304031
mView->setContentsMargins( 0, 0, 0, 0 );
40314032
mView->setHorizontalRuler( mHorizontalRuler );
40324033
mView->setVerticalRuler( mVerticalRuler );

‎src/app/composer/qgscomposermapgridwidget.cpp‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1035,7 +1035,7 @@ void QgsComposerMapGridWidget::on_mMapGridCRSButton_clicked()
10351035

10361036
QgsGenericProjectionSelector crsDialog( this );
10371037
QgsCoordinateReferenceSystem crs = mComposerMapGrid->crs();
1038-
QString currentAuthId = crs.isValid() ? crs.authid() : mComposerMap->composition()->mapSettings().destinationCrs().authid();
1038+
QString currentAuthId = crs.isValid() ? crs.authid() : mComposerMap->crs().authid();
10391039
crsDialog.setSelectedAuthId( currentAuthId );
10401040

10411041
if ( crsDialog.exec() == QDialog::Accepted )

‎src/app/composer/qgscomposermapwidget.cpp‎

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
#include "qgsmapthemecollection.h"
3838
#include "qgsmapthemes.h"
3939
#include "qgisgui.h"
40+
#include "qgscsexception.h"
4041

4142
#include <QMessageBox>
4243

@@ -63,6 +64,9 @@ QgsComposerMapWidget::QgsComposerMapWidget( QgsComposerMap* composerMap )
6364
mPreviewModeComboBox->insertItem( 1, tr( "Render" ) );
6465
mPreviewModeComboBox->insertItem( 2, tr( "Rectangle" ) );
6566

67+
mCrsSelector->setOptionVisible( QgsProjectionSelectionWidget::CrsNotSet, true );
68+
mCrsSelector->setNotSetText( tr( "Use project CRS" ) );
69+
6670
// follow preset combo
6771
mFollowVisibilityPresetCombo->setModel( new QStringListModel( mFollowVisibilityPresetCombo ) );
6872
connect( mFollowVisibilityPresetCombo, SIGNAL( currentIndexChanged( int ) ), this, SLOT( followVisibilityPresetSelected( int ) ) );
@@ -99,6 +103,8 @@ QgsComposerMapWidget::QgsComposerMapWidget( QgsComposerMap* composerMap )
99103
connect( mOverviewFrameMapComboBox, SIGNAL( itemChanged( QgsComposerItem* ) ), this, SLOT( overviewMapChanged( QgsComposerItem* ) ) );
100104
}
101105

106+
connect( mCrsSelector, &QgsProjectionSelectionWidget::crsChanged, this, &QgsComposerMapWidget::mapCrsChanged );
107+
102108
updateGuiElements();
103109
loadGridEntries();
104110
loadOverviewEntries();
@@ -260,6 +266,42 @@ void QgsComposerMapWidget::cleanUpOverviewFrameStyleSelector( QgsPanelWidget* co
260266
mComposerMap->endCommand();
261267
}
262268

269+
void QgsComposerMapWidget::mapCrsChanged( const QgsCoordinateReferenceSystem& crs )
270+
{
271+
if ( !mComposerMap )
272+
{
273+
return;
274+
}
275+
276+
if ( mComposerMap->presetCrs() == crs )
277+
return;
278+
279+
// try to reproject to maintain extent
280+
QgsCoordinateReferenceSystem oldCrs = mComposerMap->crs();
281+
282+
bool updateExtent = false;
283+
QgsRectangle newExtent;
284+
try
285+
{
286+
QgsCoordinateTransform xForm( oldCrs, crs.isValid() ? crs : QgsProject::instance()->crs() );
287+
QgsRectangle prevExtent = *mComposerMap->currentMapExtent();
288+
newExtent = xForm.transformBoundingBox( prevExtent );
289+
updateExtent = true;
290+
}
291+
catch ( QgsCsException & )
292+
{
293+
//transform failed, don't update extent
294+
}
295+
296+
mComposerMap->beginCommand( tr( "Map CRS changed" ) );
297+
mComposerMap->setCrs( crs );
298+
if ( updateExtent )
299+
mComposerMap->zoomToExtent( newExtent );
300+
mComposerMap->endCommand();
301+
mComposerMap->cache();
302+
mComposerMap->update();
303+
}
304+
263305
void QgsComposerMapWidget::on_mAtlasCheckBox_toggled( bool checked )
264306
{
265307
if ( !mComposerMap )
@@ -471,6 +513,23 @@ void QgsComposerMapWidget::on_mSetToMapCanvasExtentButton_clicked()
471513

472514
QgsRectangle newExtent = QgisApp::instance()->mapCanvas()->mapSettings().visibleExtent();
473515

516+
//transform?
517+
if ( QgisApp::instance()->mapCanvas()->mapSettings().destinationCrs()
518+
!= mComposerMap->crs() )
519+
{
520+
try
521+
{
522+
QgsCoordinateTransform xForm( QgisApp::instance()->mapCanvas()->mapSettings().destinationCrs(),
523+
mComposerMap->crs() );
524+
newExtent = xForm.transformBoundingBox( newExtent );
525+
}
526+
catch ( QgsCsException & )
527+
{
528+
//transform failed, better not proceed
529+
return;
530+
}
531+
}
532+
474533
mComposerMap->beginCommand( tr( "Map extent changed" ) );
475534
mComposerMap->zoomToExtent( newExtent );
476535
mComposerMap->endCommand();
@@ -487,6 +546,23 @@ void QgsComposerMapWidget::on_mViewExtentInCanvasButton_clicked()
487546

488547
if ( !currentMapExtent.isEmpty() )
489548
{
549+
//transform?
550+
if ( QgisApp::instance()->mapCanvas()->mapSettings().destinationCrs()
551+
!= mComposerMap->crs() )
552+
{
553+
try
554+
{
555+
QgsCoordinateTransform xForm( mComposerMap->crs(),
556+
QgisApp::instance()->mapCanvas()->mapSettings().destinationCrs() );
557+
currentMapExtent = xForm.transformBoundingBox( currentMapExtent );
558+
}
559+
catch ( QgsCsException & )
560+
{
561+
//transform failed, better not proceed
562+
return;
563+
}
564+
}
565+
490566
QgisApp::instance()->mapCanvas()->setExtent( currentMapExtent );
491567
QgisApp::instance()->mapCanvas()->refresh();
492568
}
@@ -532,6 +608,8 @@ void QgsComposerMapWidget::updateGuiElements()
532608

533609
blockAllSignals( true );
534610

611+
whileBlocking( mCrsSelector )->setCrs( mComposerMap->presetCrs() );
612+
535613
//width, height, scale
536614
double scale = mComposerMap->scale();
537615

‎src/app/composer/qgscomposermapwidget.h‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,8 @@ class QgsComposerMapWidget: public QgsComposerItemBaseWidget, private Ui::QgsCom
121121
void updateOverviewFrameStyleFromWidget();
122122
void cleanUpOverviewFrameStyleSelector( QgsPanelWidget* container );
123123

124+
void mapCrsChanged( const QgsCoordinateReferenceSystem& crs );
125+
124126
private:
125127
QgsComposerMap* mComposerMap;
126128

‎src/core/composer/qgsatlascomposition.cpp‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -439,7 +439,7 @@ void QgsAtlasComposition::computeExtent( QgsComposerMap* map )
439439
// QgsGeometry::boundingBox is expressed in the geometry"s native CRS
440440
// We have to transform the grometry to the destination CRS and ask for the bounding box
441441
// Note: we cannot directly take the transformation of the bounding box, since transformations are not linear
442-
mTransformedFeatureBounds = currentGeometry( map->composition()->mapSettings().destinationCrs() ).boundingBox();
442+
mTransformedFeatureBounds = currentGeometry( map->crs() ).boundingBox();
443443
}
444444

445445
void QgsAtlasComposition::prepareMap( QgsComposerMap* map )
@@ -481,7 +481,7 @@ void QgsAtlasComposition::prepareMap( QgsComposerMap* map )
481481
if ( map->atlasScalingMode() == QgsComposerMap::Fixed || map->atlasScalingMode() == QgsComposerMap::Predefined || isPointLayer )
482482
{
483483
QgsScaleCalculator calc;
484-
calc.setMapUnits( composition()->mapSettings().mapUnits() );
484+
calc.setMapUnits( map->crs().mapUnits() );
485485
calc.setDpi( 25.4 );
486486
double originalScale = calc.calculate( mOrigExtent, map->rect().width() );
487487
double geomCenterX = ( xa1 + xa2 ) / 2.0;

‎src/core/composer/qgscomposerarrow.cpp‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ void QgsComposerArrow::drawLine( QPainter *painter )
182182
painter->scale( 1 / dotsPerMM, 1 / dotsPerMM ); //scale painter from mm to dots
183183

184184
//setup render context
185-
QgsRenderContext context = QgsComposerUtils::createRenderContext( mComposition, *painter );
185+
QgsRenderContext context = QgsComposerUtils::createRenderContext( mComposition, painter );
186186
context.setForceVectorOutput( true );
187187

188188
QgsExpressionContext expressionContext = createExpressionContext();

‎src/core/composer/qgscomposerattributetablev2.cpp‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -422,7 +422,7 @@ bool QgsComposerAttributeTableV2::getTableContents( QgsComposerTableContents &co
422422
if ( layer )
423423
{
424424
//transform back to layer CRS
425-
QgsCoordinateTransform coordTransform( layer->crs(), mComposition->mapSettings().destinationCrs() );
425+
QgsCoordinateTransform coordTransform( layer->crs(), mComposerMap->crs() );
426426
try
427427
{
428428
selectionRect = coordTransform.transformBoundingBox( selectionRect, QgsCoordinateTransform::ReverseTransform );

0 commit comments

Comments
 (0)