Skip to content

Commit 271ed6c

Browse files
committed
Allow canvas extents to be synchronized
1 parent e4469c8 commit 271ed6c

File tree

4 files changed

+56
-0
lines changed

4 files changed

+56
-0
lines changed

src/app/qgisapp.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -3126,6 +3126,7 @@ QgsMapCanvas *QgisApp::createNewMapCanvas( const QString &name, bool isFloating,
31263126

31273127
QgsMapCanvasDockWidget *mapCanvasWidget = new QgsMapCanvasDockWidget( name, this );
31283128
mapCanvasWidget->setAllowedAreas( Qt::AllDockWidgetAreas );
3129+
mapCanvasWidget->setMainCanvas( mMapCanvas );
31293130

31303131
mapCanvasWidget->setFloating( isFloating );
31313132
if ( dockGeometry.isEmpty() )

src/app/qgsmapcanvasdockwidget.cpp

+31
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ QgsMapCanvasDockWidget::QgsMapCanvasDockWidget( const QString &name, QWidget *pa
3737
mMainWidget->layout()->addWidget( mMapCanvas );
3838

3939
connect( mActionSetCrs, &QAction::triggered, this, &QgsMapCanvasDockWidget::setMapCrs );
40+
connect( mActionSyncView, &QAction::toggled, this, &QgsMapCanvasDockWidget::syncView );
4041
}
4142

4243
QgsMapCanvas *QgsMapCanvasDockWidget::mapCanvas()
@@ -75,3 +76,33 @@ void QgsMapCanvasDockWidget::setMapCrs()
7576
mMapCanvas->setDestinationCrs( dlg.crs() );
7677
}
7778
}
79+
80+
void QgsMapCanvasDockWidget::syncView( bool enabled )
81+
{
82+
if ( enabled )
83+
{
84+
connect( mMainCanvas, &QgsMapCanvas::extentsChanged, this, &QgsMapCanvasDockWidget::mapExtentChanged, Qt::UniqueConnection );
85+
connect( mMapCanvas, &QgsMapCanvas::extentsChanged, this, &QgsMapCanvasDockWidget::mapExtentChanged, Qt::UniqueConnection );
86+
}
87+
else
88+
{
89+
disconnect( mMainCanvas, &QgsMapCanvas::extentsChanged, this, &QgsMapCanvasDockWidget::mapExtentChanged );
90+
disconnect( mMapCanvas, &QgsMapCanvas::extentsChanged, this, &QgsMapCanvasDockWidget::mapExtentChanged );
91+
}
92+
}
93+
94+
void QgsMapCanvasDockWidget::mapExtentChanged()
95+
{
96+
QgsMapCanvas *sourceCanvas = qobject_cast< QgsMapCanvas * >( sender() );
97+
if ( !sourceCanvas )
98+
return;
99+
100+
// avoid infinite recursion
101+
syncView( false );
102+
103+
QgsMapCanvas *destCanvas = sourceCanvas == mMapCanvas ? mMainCanvas : mMapCanvas;
104+
destCanvas->setExtent( sourceCanvas->extent() );
105+
destCanvas->refresh();
106+
107+
syncView( true );
108+
}

src/app/qgsmapcanvasdockwidget.h

+8
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,11 @@ class APP_EXPORT QgsMapCanvasDockWidget : public QgsDockWidget, private Ui::QgsM
2828
public:
2929
explicit QgsMapCanvasDockWidget( const QString &name, QWidget *parent = nullptr );
3030

31+
/**
32+
* Sets the main app map canvas.
33+
*/
34+
void setMainCanvas( QgsMapCanvas *canvas ) { mMainCanvas = canvas; }
35+
3136
/**
3237
* Returns the map canvas contained in the dock widget.
3338
*/
@@ -45,10 +50,13 @@ class APP_EXPORT QgsMapCanvasDockWidget : public QgsDockWidget, private Ui::QgsM
4550
private slots:
4651

4752
void setMapCrs();
53+
void syncView( bool enabled );
54+
void mapExtentChanged();
4855

4956
private:
5057

5158
QgsMapCanvas *mMapCanvas = nullptr;
59+
QgsMapCanvas *mMainCanvas = nullptr;
5260
bool mShowCloseWarning = true;
5361

5462

src/ui/qgsmapcanvasdockwidgetbase.ui

+16
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
<bool>false</bool>
4343
</property>
4444
<addaction name="mActionSetCrs"/>
45+
<addaction name="mActionSyncView"/>
4546
</widget>
4647
</item>
4748
<item>
@@ -79,6 +80,21 @@
7980
<string>Set Map CRS</string>
8081
</property>
8182
</action>
83+
<action name="mActionSyncView">
84+
<property name="checkable">
85+
<bool>true</bool>
86+
</property>
87+
<property name="icon">
88+
<iconset resource="../../images/images.qrc">
89+
<normaloff>:/images/themes/default/sync_views.svg</normaloff>:/images/themes/default/sync_views.svg</iconset>
90+
</property>
91+
<property name="text">
92+
<string>Synchronize view</string>
93+
</property>
94+
<property name="toolTip">
95+
<string>Synchronize View with Main Map</string>
96+
</property>
97+
</action>
8298
</widget>
8399
<customwidgets>
84100
<customwidget>

0 commit comments

Comments
 (0)