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+
263305void 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
0 commit comments