Skip to content

Commit f83a11f

Browse files
committed
Convenience auto setup features when adding new layers
On first layer: zoom to full extent, setup destination CRS and map units On first layer with different CRS: enable OTF reprojection This functionality is not triggered when opening an existing project.
1 parent 97642dd commit f83a11f

File tree

4 files changed

+90
-4
lines changed

4 files changed

+90
-4
lines changed

src/app/qgisapp.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2233,8 +2233,8 @@ void QgisApp::initLayerTreeView()
22332233
mLayerTreeDock->setWidget( mLayerTreeView );
22342234
addDockWidget( Qt::LeftDockWidgetArea, mLayerTreeDock );
22352235

2236-
QgsLayerTreeMapCanvasBridge* bridge = new QgsLayerTreeMapCanvasBridge( QgsProject::instance()->layerTreeRoot(), mMapCanvas );
2237-
bridge->setParent(this);
2236+
mLayerTreeCanvasBridge = new QgsLayerTreeMapCanvasBridge( QgsProject::instance()->layerTreeRoot(), mMapCanvas );
2237+
mLayerTreeCanvasBridge->setParent(this);
22382238
}
22392239

22402240

@@ -9458,6 +9458,13 @@ void QgisApp::writeProject( QDomDocument &doc )
94589458
void QgisApp::readProject( const QDomDocument &doc )
94599459
{
94609460
projectChanged( doc );
9461+
9462+
// force update of canvas, without automatic changes to extent and OTF projections
9463+
mLayerTreeCanvasBridge->setAutoEnableCrsTransform( false );
9464+
mLayerTreeCanvasBridge->setAutoSetupOnFirstLayer( false );
9465+
mLayerTreeCanvasBridge->setCanvasLayers();
9466+
mLayerTreeCanvasBridge->setAutoEnableCrsTransform( true );
9467+
mLayerTreeCanvasBridge->setAutoSetupOnFirstLayer( true );
94619468
}
94629469

94639470
void QgisApp::showLayerProperties( QgsMapLayer *ml )

src/app/qgisapp.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ class QgsComposerManager;
4646
class QgsContrastEnhancement;
4747
class QgsGeometry;
4848
class QgsFeature;
49+
class QgsLayerTreeMapCanvasBridge;
4950
class QgsLayerTreeView;
5051
class QgsLegend;
5152
class QgsLayerOrder;
@@ -1472,6 +1473,8 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
14721473
QgsMapCanvas *mMapCanvas;
14731474
//! Table of contents (legend) for the map
14741475
QgsLayerTreeView* mLayerTreeView;
1476+
//! Helper class that connects layer tree with map canvas
1477+
QgsLayerTreeMapCanvasBridge* mLayerTreeCanvasBridge;
14751478
//! Table of contents (legend) for the map
14761479
QgsLegend *mMapLegend;
14771480
//! Table of contents (legend) to order layers of the map

src/gui/layertree/qgslayertreemapcanvasbridge.cpp

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ QgsLayerTreeMapCanvasBridge::QgsLayerTreeMapCanvasBridge(QgsLayerTreeGroup *root
99
, mCanvas(canvas)
1010
, mPendingCanvasUpdate(false)
1111
, mHasCustomLayerOrder(false)
12+
, mAutoSetupOnFirstLayer(true)
13+
, mAutoEnableCrsTransform(true)
14+
, mLastLayerCount(root->findLayers().count())
1215
{
1316
connect(root, SIGNAL(addedChildren(QgsLayerTreeNode*,int,int)), this, SLOT(nodeAddedChildren(QgsLayerTreeNode*,int,int)));
1417
connect(root, SIGNAL(customPropertyChanged(QgsLayerTreeNode*,QString)), this, SLOT(nodeCustomPropertyChanged(QgsLayerTreeNode*,QString)));
@@ -87,6 +90,59 @@ void QgsLayerTreeMapCanvasBridge::setCanvasLayers()
8790

8891
mCanvas->setLayerSet(layers);
8992

93+
QList<QgsLayerTreeLayer*> layerNodes = mRoot->findLayers();
94+
95+
int currentLayerCount = layerNodes.count();
96+
if (mAutoSetupOnFirstLayer && mLastLayerCount == 0 && currentLayerCount != 0)
97+
{
98+
// if we are moving from zero to non-zero layers, let's zoom to those data
99+
mCanvas->zoomToFullExtent();
100+
101+
// also setup destination CRS and map units if the OTF projections are not yet enabled
102+
if (!mCanvas->mapSettings().hasCrsTransformEnabled())
103+
{
104+
foreach (QgsLayerTreeLayer* layerNode, layerNodes)
105+
{
106+
if (layerNode->layer())
107+
{
108+
mCanvas->setDestinationCrs( layerNode->layer()->crs() );
109+
mCanvas->setMapUnits( layerNode->layer()->crs().mapUnits() );
110+
}
111+
}
112+
}
113+
}
114+
115+
if (!mFirstCRS.isValid())
116+
{
117+
// find out what is the first used CRS in case we may need to turn on OTF projections later
118+
foreach (QgsLayerTreeLayer* layerNode, layerNodes)
119+
{
120+
if (layerNode->layer() && layerNode->layer()->crs().isValid())
121+
{
122+
mFirstCRS = layerNode->layer()->crs();
123+
break;
124+
}
125+
}
126+
}
127+
128+
if (mAutoEnableCrsTransform && mFirstCRS.isValid() && !mCanvas->mapSettings().hasCrsTransformEnabled())
129+
{
130+
// check whether all layers still have the same CRS
131+
foreach (QgsLayerTreeLayer* layerNode, layerNodes)
132+
{
133+
if (layerNode->layer() && layerNode->layer()->crs().isValid() && layerNode->layer()->crs() != mFirstCRS)
134+
{
135+
mCanvas->setDestinationCrs( mFirstCRS );
136+
mCanvas->setCrsTransformEnabled( true );
137+
break;
138+
}
139+
}
140+
}
141+
142+
mLastLayerCount = currentLayerCount;
143+
if (currentLayerCount == 0)
144+
mFirstCRS = QgsCoordinateReferenceSystem();
145+
90146
mPendingCanvasUpdate = false;
91147
}
92148

src/gui/layertree/qgslayertreemapcanvasbridge.h

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
#include <QObject>
55
#include <QStringList>
66

7+
#include "qgscoordinatereferencesystem.h"
8+
79
class QgsMapCanvas;
810
class QgsMapCanvasLayer;
911
class QgsLayerTreeGroup;
@@ -20,10 +22,23 @@ class GUI_EXPORT QgsLayerTreeMapCanvasBridge : public QObject
2022

2123
QStringList defaultLayerOrder() const;
2224

25+
//! if enabled, will automatically set full canvas extent and destination CRS + map units
26+
//! when first layer(s) are added
27+
void setAutoSetupOnFirstLayer(bool enabled) { mAutoSetupOnFirstLayer = enabled; }
28+
bool autoSetupOnFirstLayer() const { return mAutoSetupOnFirstLayer; }
29+
30+
//! if enabled, will automatically turn on on-the-fly reprojection of layers if a layer
31+
//! with different source CRS is added
32+
void setAutoEnableCrsTransform(bool enabled) { mAutoEnableCrsTransform = enabled; }
33+
bool autoEnableCrsTransform() const { return mAutoEnableCrsTransform; }
34+
2335
public slots:
2436
void setHasCustomLayerOrder(bool override);
2537
void setCustomLayerOrder(const QStringList& order);
2638

39+
//! force update of canvas layers from the layer tree. Normally this should not be needed to be called.
40+
void setCanvasLayers();
41+
2742
signals:
2843
void hasCustomLayerOrderChanged(bool);
2944
void customLayerOrderChanged(const QStringList& order);
@@ -42,8 +57,6 @@ protected slots:
4257
void nodeVisibilityChanged();
4358
void nodeCustomPropertyChanged(QgsLayerTreeNode* node, QString key);
4459

45-
void setCanvasLayers();
46-
4760
protected:
4861
QgsLayerTreeGroup* mRoot;
4962
QgsMapCanvas* mCanvas;
@@ -52,6 +65,13 @@ protected slots:
5265

5366
bool mHasCustomLayerOrder;
5467
QStringList mCustomLayerOrder;
68+
69+
bool mAutoSetupOnFirstLayer;
70+
bool mAutoEnableCrsTransform;
71+
72+
bool mHasFirstLayer;
73+
bool mLastLayerCount;
74+
QgsCoordinateReferenceSystem mFirstCRS;
5575
};
5676

5777
#endif // QGSLAYERTREEMAPCANVASBRIDGE_H

0 commit comments

Comments
 (0)