Skip to content

Commit 0e79551

Browse files
committed
Support for custom layer order for legacy projects
1 parent fd8722a commit 0e79551

File tree

3 files changed

+81
-2
lines changed

3 files changed

+81
-2
lines changed

src/core/layertree/qgslayertreeutils.cpp

+68-2
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,63 @@ bool QgsLayerTreeUtils::readOldLegend( QgsLayerTreeGroup* root, const QDomElemen
4444
return true;
4545
}
4646

47+
48+
49+
static bool _readOldLegendLayerOrderGroup( const QDomElement& groupElem, QMap<int, QString>& layerIndexes )
50+
{
51+
QDomNodeList legendChildren = groupElem.childNodes();
52+
53+
for ( int i = 0; i < legendChildren.size(); ++i )
54+
{
55+
QDomElement currentChildElem = legendChildren.at( i ).toElement();
56+
if ( currentChildElem.tagName() == "legendlayer" )
57+
{
58+
QDomElement layerFileElem = currentChildElem.firstChildElement( "filegroup" ).firstChildElement( "legendlayerfile" );
59+
60+
int layerIndex = currentChildElem.attribute( "drawingOrder" ).toInt();
61+
if ( layerIndex == -1 )
62+
return false; // order undefined
63+
layerIndexes.insert( layerIndex, layerFileElem.attribute( "layerid" ) );
64+
}
65+
else if ( currentChildElem.tagName() == "legendgroup" )
66+
{
67+
if ( !_readOldLegendLayerOrderGroup( currentChildElem, layerIndexes ) )
68+
return false;
69+
}
70+
}
71+
72+
return true;
73+
}
74+
75+
76+
bool QgsLayerTreeUtils::readOldLegendLayerOrder( const QDomElement& legendElem, bool& hasCustomOrder, QStringList& order )
77+
{
78+
if ( legendElem.isNull() )
79+
return false;
80+
81+
hasCustomOrder = legendElem.attribute( "updateDrawingOrder" ) == "false";
82+
order.clear();
83+
84+
QMap<int, QString> layerIndexes;
85+
86+
// try to read the order. may be undefined (order = -1) for some or all items
87+
bool res = _readOldLegendLayerOrderGroup( legendElem, layerIndexes );
88+
89+
if ( !res && hasCustomOrder )
90+
return false; // invalid state
91+
92+
foreach ( QString layerId, layerIndexes )
93+
{
94+
QgsDebugMsg( layerId );
95+
order.append( layerId );
96+
}
97+
98+
return true;
99+
}
100+
101+
102+
103+
47104
QString QgsLayerTreeUtils::checkStateToXml( Qt::CheckState state )
48105
{
49106
switch ( state )
@@ -74,6 +131,7 @@ void QgsLayerTreeUtils::addLegendGroupToTreeWidget( const QDomElement& groupElem
74131
parent->addChildNode( groupNode );
75132

76133
groupNode->setVisible( checkStateFromXml( groupElem.attribute( "checked" ) ) );
134+
groupNode->setExpanded( groupElem.attribute( "open" ) == "true" );
77135

78136
if ( groupElem.attribute( "embedded" ) == "1" )
79137
{
@@ -97,15 +155,23 @@ void QgsLayerTreeUtils::addLegendGroupToTreeWidget( const QDomElement& groupElem
97155

98156
void QgsLayerTreeUtils::addLegendLayerToTreeWidget( const QDomElement& layerElem, QgsLayerTreeGroup* parent )
99157
{
100-
QString layerId = layerElem.firstChildElement( "filegroup" ).firstChildElement( "legendlayerfile" ).attribute( "layerid" );
158+
QDomElement layerFileElem = layerElem.firstChildElement( "filegroup" ).firstChildElement( "legendlayerfile" );
159+
QString layerId = layerFileElem.attribute( "layerid" );
101160
QgsLayerTreeLayer* layerNode = new QgsLayerTreeLayer( layerId, layerElem.attribute( "name" ) );
102161

103162
layerNode->setVisible( checkStateFromXml( layerElem.attribute( "checked" ) ) );
163+
layerNode->setExpanded( layerElem.attribute( "open" ) == "true" );
164+
165+
if ( layerFileElem.attribute( "isInOverview" ) == "1" )
166+
layerNode->setCustomProperty( "overview", 1 );
104167

105168
if ( layerElem.attribute( "embedded" ) == "1" )
106169
layerNode->setCustomProperty( "embedded", 1 );
107170

108-
// TODO: is in overview, drawing order, show feature count
171+
if ( layerElem.attribute( "showFeatureCount" ) == "1" )
172+
layerNode->setCustomProperty( "showFeatureCount", 1 );
173+
174+
// drawing order is handled by readOldLegendLayerOrder()
109175

110176
parent->addChildNode( layerNode );
111177
}

src/core/layertree/qgslayertreeutils.h

+3
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include <QList>
2121

2222
class QDomElement;
23+
class QStringList;
2324

2425
class QgsLayerTreeGroup;
2526
class QgsLayerTreeLayer;
@@ -31,6 +32,8 @@ class CORE_EXPORT QgsLayerTreeUtils
3132
// return a new instance - or null on error
3233
static bool readOldLegend( QgsLayerTreeGroup* root, const QDomElement& legendElem );
3334

35+
static bool readOldLegendLayerOrder( const QDomElement& legendElem, bool& hasCustomOrder, QStringList& order );
36+
3437
static QString checkStateToXml( Qt::CheckState state );
3538
static Qt::CheckState checkStateFromXml( QString txt );
3639

src/gui/layertree/qgslayertreemapcanvasbridge.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "qgslayertreemapcanvasbridge.h"
1717

1818
#include "qgslayertree.h"
19+
#include "qgslayertreeutils.h"
1920

2021
#include "qgsmapcanvas.h"
2122

@@ -172,7 +173,16 @@ void QgsLayerTreeMapCanvasBridge::readProject( const QDomDocument& doc )
172173
{
173174
QDomElement elem = doc.documentElement().firstChildElement( "layer-tree-canvas" );
174175
if ( elem.isNull() )
176+
{
177+
bool oldEnabled;
178+
QStringList oldOrder;
179+
if ( QgsLayerTreeUtils::readOldLegendLayerOrder( doc.documentElement().firstChildElement( "legend" ), oldEnabled, oldOrder ) )
180+
{
181+
setHasCustomLayerOrder( oldEnabled );
182+
setCustomLayerOrder( oldOrder );
183+
}
175184
return;
185+
}
176186

177187
QDomElement customOrderElem = elem.firstChildElement( "custom-order" );
178188
if ( !customOrderElem.isNull() )

0 commit comments

Comments
 (0)