@@ -57,10 +57,9 @@ QgsMapCanvasDockWidget::QgsMapCanvasDockWidget( const QString &name, QWidget *pa
57
57
58
58
mMainWidget ->layout ()->addWidget ( mMapCanvas );
59
59
60
- connect ( mActionSyncView , &QAction::toggled, this , [ = ]( bool active )
60
+ connect ( mActionSyncView , &QAction::toggled, this , [ = ]
61
61
{
62
- syncViewExtent ( mMainCanvas );
63
- syncView ( active );
62
+ syncViewCenter ( mMainCanvas );
64
63
} );
65
64
66
65
mMenu = new QMenu ();
@@ -110,6 +109,9 @@ QgsMapCanvasDockWidget::QgsMapCanvasDockWidget( const QString &name, QWidget *pa
110
109
mScaleCombo = settingsAction->scaleCombo ();
111
110
mRotationEdit = settingsAction->rotationSpinBox ();
112
111
mMagnificationEdit = settingsAction->magnifierSpinBox ();
112
+ mSyncScaleCheckBox = settingsAction->syncScaleCheckBox ();
113
+ mScaleFactorWidget = settingsAction->scaleFactorSpinBox ();
114
+
113
115
connect ( mScaleCombo , &QgsScaleComboBox::scaleChanged, this , [ = ]( double scale )
114
116
{
115
117
if ( !mBlockScaleUpdate )
@@ -171,11 +173,19 @@ QgsMapCanvasDockWidget::QgsMapCanvasDockWidget( const QString &name, QWidget *pa
171
173
}
172
174
} );
173
175
176
+ connect ( mScaleFactorWidget , static_cast < void ( QgsDoubleSpinBox::* )( double ) > ( &QgsDoubleSpinBox::valueChanged ), this , &QgsMapCanvasDockWidget::mapScaleChanged );
177
+ connect ( mSyncScaleCheckBox , &QCheckBox::toggled, this , [ = ]( bool checked )
178
+ {
179
+ if ( checked )
180
+ mapScaleChanged ();
181
+ }
182
+ );
183
+
174
184
mResizeTimer .setSingleShot ( true );
175
185
connect ( &mResizeTimer , &QTimer::timeout, this , [ = ]
176
186
{
177
187
mBlockExtentSync = false ;
178
- syncViewExtent ( mMainCanvas );
188
+ syncViewCenter ( mMainCanvas );
179
189
} );
180
190
}
181
191
@@ -184,23 +194,28 @@ void QgsMapCanvasDockWidget::setMainCanvas( QgsMapCanvas *canvas )
184
194
if ( mMainCanvas )
185
195
{
186
196
disconnect ( mMainCanvas , &QgsMapCanvas::xyCoordinates, this , &QgsMapCanvasDockWidget::syncMarker );
197
+ disconnect ( mMainCanvas , &QgsMapCanvas::scaleChanged, this , &QgsMapCanvasDockWidget::mapScaleChanged );
198
+ disconnect ( mMainCanvas , &QgsMapCanvas::extentsChanged, this , &QgsMapCanvasDockWidget::mapExtentChanged );
187
199
}
188
200
189
201
mMainCanvas = canvas;
190
202
connect ( mMainCanvas , &QgsMapCanvas::xyCoordinates, this , &QgsMapCanvasDockWidget::syncMarker );
203
+ connect ( mMainCanvas , &QgsMapCanvas::scaleChanged, this , &QgsMapCanvasDockWidget::mapScaleChanged );
204
+ connect ( mMainCanvas , &QgsMapCanvas::extentsChanged, this , &QgsMapCanvasDockWidget::mapExtentChanged );
205
+ connect ( mMapCanvas , &QgsMapCanvas::extentsChanged, this , &QgsMapCanvasDockWidget::mapExtentChanged, Qt::UniqueConnection );
191
206
}
192
207
193
208
QgsMapCanvas *QgsMapCanvasDockWidget::mapCanvas ()
194
209
{
195
210
return mMapCanvas ;
196
211
}
197
212
198
- void QgsMapCanvasDockWidget::setViewExtentSynchronized ( bool enabled )
213
+ void QgsMapCanvasDockWidget::setViewCenterSynchronized ( bool enabled )
199
214
{
200
215
mActionSyncView ->setChecked ( enabled );
201
216
}
202
217
203
- bool QgsMapCanvasDockWidget::isViewExtentSynchronized () const
218
+ bool QgsMapCanvasDockWidget::isViewCenterSynchronized () const
204
219
{
205
220
return mActionSyncView ->isChecked ();
206
221
}
@@ -215,6 +230,26 @@ bool QgsMapCanvasDockWidget::isCursorMarkerVisible() const
215
230
return mXyMarker ->isVisible ();
216
231
}
217
232
233
+ void QgsMapCanvasDockWidget::setScaleFactor ( double factor )
234
+ {
235
+ mScaleFactorWidget ->setValue ( factor );
236
+ }
237
+
238
+ void QgsMapCanvasDockWidget::setViewScaleSynchronized ( bool enabled )
239
+ {
240
+ mSyncScaleCheckBox ->setChecked ( enabled );
241
+ }
242
+
243
+ bool QgsMapCanvasDockWidget::isViewScaleSynchronized () const
244
+ {
245
+ return mSyncScaleCheckBox ->isChecked ();
246
+ }
247
+
248
+ double QgsMapCanvasDockWidget::scaleFactor () const
249
+ {
250
+ return mScaleFactorWidget ->value ();
251
+ }
252
+
218
253
void QgsMapCanvasDockWidget::resizeEvent ( QResizeEvent * )
219
254
{
220
255
mBlockExtentSync = true ;
@@ -233,21 +268,7 @@ void QgsMapCanvasDockWidget::setMapCrs()
233
268
}
234
269
}
235
270
236
- void QgsMapCanvasDockWidget::syncView ( bool enabled )
237
- {
238
- if ( enabled )
239
- {
240
- connect ( mMainCanvas , &QgsMapCanvas::extentsChanged, this , &QgsMapCanvasDockWidget::mapExtentChanged, Qt::UniqueConnection );
241
- connect ( mMapCanvas , &QgsMapCanvas::extentsChanged, this , &QgsMapCanvasDockWidget::mapExtentChanged, Qt::UniqueConnection );
242
- }
243
- else
244
- {
245
- disconnect ( mMainCanvas , &QgsMapCanvas::extentsChanged, this , &QgsMapCanvasDockWidget::mapExtentChanged );
246
- disconnect ( mMapCanvas , &QgsMapCanvas::extentsChanged, this , &QgsMapCanvasDockWidget::mapExtentChanged );
247
- }
248
- }
249
-
250
- void QgsMapCanvasDockWidget::syncViewExtent ( QgsMapCanvas *sourceCanvas )
271
+ void QgsMapCanvasDockWidget::syncViewCenter ( QgsMapCanvas *sourceCanvas )
251
272
{
252
273
// avoid infinite recursion
253
274
mBlockExtentSync = true ;
@@ -259,11 +280,11 @@ void QgsMapCanvasDockWidget::syncViewExtent( QgsMapCanvas *sourceCanvas )
259
280
destCanvas->mapSettings ().destinationCrs () );
260
281
try
261
282
{
262
- destCanvas->setExtent ( ct.transformBoundingBox ( sourceCanvas->extent () ) );
283
+ destCanvas->setCenter ( ct.transform ( sourceCanvas->center () ) );
263
284
}
264
285
catch ( QgsCsException & )
265
286
{
266
- destCanvas->setExtent ( sourceCanvas->extent () );
287
+ destCanvas->setCenter ( sourceCanvas->center () );
267
288
}
268
289
destCanvas->refresh ();
269
290
@@ -279,7 +300,14 @@ void QgsMapCanvasDockWidget::mapExtentChanged()
279
300
if ( !sourceCanvas )
280
301
return ;
281
302
282
- syncViewExtent ( sourceCanvas );
303
+ if ( sourceCanvas == mMapCanvas && mSyncScaleCheckBox ->isChecked () )
304
+ {
305
+ double newScaleFactor = mMainCanvas ->scale () / mMapCanvas ->scale ();
306
+ mScaleFactorWidget ->setValue ( newScaleFactor );
307
+ }
308
+
309
+ if ( mActionSyncView ->isChecked () )
310
+ syncViewCenter ( sourceCanvas );
283
311
}
284
312
285
313
void QgsMapCanvasDockWidget::mapCrsChanged ()
@@ -351,6 +379,18 @@ void QgsMapCanvasDockWidget::syncMarker( const QgsPoint &p )
351
379
mXyMarker ->setCenter ( t );
352
380
}
353
381
382
+ void QgsMapCanvasDockWidget::mapScaleChanged ()
383
+ {
384
+ if ( !mSyncScaleCheckBox ->isChecked () )
385
+ return ;
386
+
387
+ double newScale = mMainCanvas ->scale () / mScaleFactorWidget ->value ();
388
+ bool prev = mBlockExtentSync ;
389
+ mBlockExtentSync = true ;
390
+ mMapCanvas ->zoomScale ( newScale );
391
+ mBlockExtentSync = prev;
392
+ }
393
+
354
394
QgsMapSettingsAction::QgsMapSettingsAction ( QWidget *parent )
355
395
: QWidgetAction( parent )
356
396
{
@@ -397,6 +437,27 @@ QgsMapSettingsAction::QgsMapSettingsAction( QWidget *parent )
397
437
gLayout ->addWidget ( label, 2 , 0 );
398
438
gLayout ->addWidget ( mMagnifierWidget , 2 , 1 );
399
439
440
+ mSyncScaleCheckBox = new QCheckBox ( tr ( " Synchronize scale" ) );
441
+ gLayout ->addWidget ( mSyncScaleCheckBox , 3 , 0 , 1 , 2 );
442
+
443
+ mScaleFactorWidget = new QgsDoubleSpinBox ();
444
+ mScaleFactorWidget ->setSuffix ( QStringLiteral ( " ×" ) );
445
+ mScaleFactorWidget ->setDecimals ( 2 );
446
+ mScaleFactorWidget ->setRange ( 0.01 , 100000 );
447
+ mScaleFactorWidget ->setWrapping ( false );
448
+ mScaleFactorWidget ->setSingleStep ( 0.1 );
449
+ mScaleFactorWidget ->setToolTip ( tr ( " Multiplication factor for main canvas scale to view scale" ) );
450
+ mScaleFactorWidget ->setClearValueMode ( QgsDoubleSpinBox::CustomValue );
451
+ mScaleFactorWidget ->setClearValue ( 1.0 );
452
+ mScaleFactorWidget ->setValue ( 1.0 );
453
+ mScaleFactorWidget ->setEnabled ( false );
454
+
455
+ connect ( mSyncScaleCheckBox , &QCheckBox::toggled, mScaleFactorWidget , &QgsDoubleSpinBox::setEnabled );
456
+
457
+ label = new QLabel ( tr ( " Scale factor" ) );
458
+ gLayout ->addWidget ( label, 4 , 0 );
459
+ gLayout ->addWidget ( mScaleFactorWidget , 4 , 1 );
460
+
400
461
QWidget *w = new QWidget ();
401
462
w->setLayout ( gLayout );
402
463
setDefaultWidget ( w );
0 commit comments