Skip to content

Commit b31d18e

Browse files
committedMar 28, 2017
Avoid redrawing map views multiple times on creation
1 parent 5b9dc9d commit b31d18e

File tree

2 files changed

+27
-12
lines changed

2 files changed

+27
-12
lines changed
 

‎src/app/qgisapp.cpp

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3141,8 +3141,12 @@ QgsMapCanvas *QgisApp::createNewMapCanvas( const QString &name )
31413141
QgsMapCanvasDockWidget *dock = createNewMapCanvasDock( name );
31423142
if ( !dock )
31433143
return nullptr;
3144-
else
3145-
return dock->mapCanvas();
3144+
3145+
dock->mapCanvas()->setLayers( mMapCanvas->layers() );
3146+
dock->mapCanvas()->setExtent( mMapCanvas->extent() );
3147+
dock->mapCanvas()->setDestinationCrs( QgsProject::instance()->crs() );
3148+
dock->mapCanvas()->freeze( false );
3149+
return dock->mapCanvas();
31463150
}
31473151

31483152
QgsMapCanvasDockWidget *QgisApp::createNewMapCanvasDock( const QString &name, bool isFloating, const QRect &dockGeometry, Qt::DockWidgetArea area )
@@ -3170,20 +3174,13 @@ QgsMapCanvasDockWidget *QgisApp::createNewMapCanvasDock( const QString &name, bo
31703174
applyProjectSettingsToCanvas( mapCanvas );
31713175
applyDefaultSettingsToCanvas( mapCanvas );
31723176

3173-
mapCanvas->setLayers( mMapCanvas->layers() );
3174-
mapCanvas->setExtent( mMapCanvas->extent() );
3175-
3176-
mapCanvas->setDestinationCrs( QgsProject::instance()->crs() );
3177-
3178-
31793177
// add existing annotations to canvas
31803178
Q_FOREACH ( QgsAnnotation *annotation, QgsProject::instance()->annotationManager()->annotations() )
31813179
{
31823180
QgsMapCanvasAnnotationItem *canvasItem = new QgsMapCanvasAnnotationItem( annotation, mapCanvas );
31833181
Q_UNUSED( canvasItem ); //item is already added automatically to canvas scene
31843182
}
31853183

3186-
mapCanvas->freeze( false );
31873184
markDirty();
31883185
connect( mapCanvasWidget, &QgsMapCanvasDockWidget::closed, this, &QgisApp::markDirty );
31893186
connect( mapCanvasWidget, &QgsMapCanvasDockWidget::renameTriggered, this, &QgisApp::renameView );
@@ -9809,7 +9806,14 @@ void QgisApp::newMapCanvas()
98099806
}
98109807
}
98119808

9812-
createNewMapCanvasDock( name, true );
9809+
QgsMapCanvasDockWidget *dock = createNewMapCanvasDock( name, true );
9810+
if ( dock )
9811+
{
9812+
dock->mapCanvas()->setLayers( mMapCanvas->layers() );
9813+
dock->mapCanvas()->setExtent( mMapCanvas->extent() );
9814+
dock->mapCanvas()->setDestinationCrs( QgsProject::instance()->crs() );
9815+
dock->mapCanvas()->freeze( false );
9816+
}
98139817
}
98149818

98159819
void QgisApp::setExtent( const QgsRectangle &rect )
@@ -11873,6 +11877,7 @@ void QgisApp::readProject( const QDomDocument &doc )
1187311877
mLayerTreeCanvasBridge->setAutoSetupOnFirstLayer( true );
1187411878

1187511879
QDomNodeList nodes = doc.elementsByTagName( QStringLiteral( "mapViewDocks" ) );
11880+
QList< QgsMapCanvas * > views;
1187611881
if ( !nodes.isEmpty() )
1187711882
{
1187811883
QDomNode viewNode = nodes.at( 0 );
@@ -11896,16 +11901,23 @@ void QgisApp::readProject( const QDomDocument &doc )
1189611901

1189711902
QgsMapCanvasDockWidget *mapCanvasDock = createNewMapCanvasDock( mapName, floating, QRect( x, y, w, h ), area );
1189811903
QgsMapCanvas *mapCanvas = mapCanvasDock->mapCanvas();
11899-
mapCanvas->readProject( doc );
11900-
1190111904
mapCanvasDock->setViewCenterSynchronized( synced );
1190211905
mapCanvasDock->setCursorMarkerVisible( showCursor );
1190311906
mapCanvasDock->setScaleFactor( scaleFactor );
1190411907
mapCanvasDock->setViewScaleSynchronized( scaleSynced );
1190511908
mapCanvasDock->setMainCanvasExtentVisible( showExtent );
1190611909
mapCanvasDock->setLabelsVisible( showLabels );
11910+
mapCanvas->readProject( doc );
11911+
views << mapCanvas;
1190711912
}
1190811913
}
11914+
// unfreeze all new views at once. We don't do this as they are created since additional
11915+
// views which may exist in project could rearrange the docks and cause the canvases to resize
11916+
// resulting in multiple redraws
11917+
Q_FOREACH ( QgsMapCanvas *c, views )
11918+
{
11919+
c->freeze( false );
11920+
}
1190911921
}
1191011922

1191111923
void QgisApp::showLayerProperties( QgsMapLayer *ml )

‎src/app/qgisapp.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,9 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
250250
* Create a new map canvas dock widget with the specified unique \a name. The \a isFloating
251251
* and \a dockGeometry arguments can be used to specify an initial floating state
252252
* and widget geometry rect for the dock.
253+
* \note the mapCanvas() inside the dock widget will initially be frozen to avoid multiple
254+
* unwanted map redraws. Callers must manually unfreeze the map canvas when they have finished
255+
* setting the initial state of the canvas and are ready for it to begin rendering.
253256
*/
254257
QgsMapCanvasDockWidget *createNewMapCanvasDock( const QString &name, bool isFloating = false, const QRect &dockGeometry = QRect(),
255258
Qt::DockWidgetArea area = Qt::RightDockWidgetArea );

0 commit comments

Comments
 (0)