@@ -2245,54 +2245,97 @@ QgsRectangle QgsProjectParser::layerBoundingBoxInProjectCRS( const QDomElement&
2245
2245
return BBox;
2246
2246
}
2247
2247
2248
- void QgsProjectParser::addDrawingOrder ( QDomElement& parentElem, QDomDocument& doc ) const
2248
+ void QgsProjectParser::addDrawingOrder ( QDomElement elem, bool useDrawingOrder, QMap<int , QString>& orderedLayerList, int & nEmbeddedGroupLayers,
2249
+ bool embedded ) const
2249
2250
{
2250
- if ( ! mXMLDoc )
2251
+ if ( elem. isNull () )
2251
2252
{
2252
2253
return ;
2253
2254
}
2254
2255
2255
- // find legend section
2256
- QDomElement legendElement = mXMLDoc ->documentElement ().firstChildElement ( " legend" );
2257
- if ( legendElement.isNull () )
2256
+ if ( elem.tagName () == " legendlayer" )
2258
2257
{
2259
- return ;
2260
- }
2261
-
2262
- QStringList layerList;
2258
+ if ( useDrawingOrder )
2259
+ {
2260
+ int order = elem.attribute ( " drawingOrder" , " -1" ).toInt ();
2261
+ orderedLayerList.insertMulti ( order + nEmbeddedGroupLayers, elem.attribute ( " name" ) );
2262
+ }
2263
+ else
2264
+ {
2265
+ orderedLayerList.insertMulti ( orderedLayerList.size (), elem.attribute ( " name" ) );
2266
+ }
2263
2267
2264
- bool useDrawingOrder = ( legendElement.attribute ( " updateDrawingOrder" ) == " false" );
2265
- QDomNodeList layerNodeList = legendElement.elementsByTagName ( " legendlayer" );
2266
- if ( !useDrawingOrder ) // bottom to top
2267
- {
2268
- for ( int i = 0 ; i < layerNodeList.size (); ++i )
2268
+ if ( embedded )
2269
2269
{
2270
- layerList. prepend ( layerNodeList. at ( i ). toElement (). attribute ( " name " ) ) ;
2270
+ ++nEmbeddedGroupLayers ;
2271
2271
}
2272
2272
}
2273
- else
2273
+ else if ( elem. tagName () == " legendgroup " )
2274
2274
{
2275
- QMap< int , QString> orderedLayerNames;
2276
- for ( int i = 0 ; i < layerNodeList. size (); ++i )
2275
+ // embedded vs. not embedded
2276
+ if ( elem. attribute ( " embedded " ) == " 1 " && !embedded )
2277
2277
{
2278
- QString layerName = layerNodeList.at ( i ).toElement ().attribute ( " name" );
2279
- int order = layerNodeList.at ( i ).toElement ().attribute ( " drawingOrder" ).toInt ();
2280
- if ( order == -1 )
2278
+ // load layers / elements from project file
2279
+ QString project = convertToAbsolutePath ( elem.attribute ( " project" ) );
2280
+ QString embeddedGroupName = elem.attribute ( " name" );
2281
+ QgsProjectParser* p = dynamic_cast <QgsProjectParser*>( QgsConfigCache::instance ()->searchConfiguration ( project ) );
2282
+ if ( p )
2281
2283
{
2282
- layerList.prepend ( layerName );
2284
+ QList<QDomElement> embeddedGroupElements = p->mLegendGroupElements ;
2285
+ foreach ( const QDomElement &groupElem, embeddedGroupElements )
2286
+ {
2287
+ if ( groupElem.attribute ( " name" ) == embeddedGroupName )
2288
+ {
2289
+ addDrawingOrder ( groupElem, false , orderedLayerList, nEmbeddedGroupLayers, true );
2290
+ break ;
2291
+ }
2292
+ }
2283
2293
}
2284
- else
2294
+ }
2295
+ else
2296
+ {
2297
+ QDomNodeList childList = elem.childNodes ();
2298
+ QDomElement childElem;
2299
+ for ( int i = 0 ; i < childList.size (); ++i )
2285
2300
{
2286
- orderedLayerNames. insert ( order, layerName );
2301
+ addDrawingOrder ( childList. at ( i ). toElement (), useDrawingOrder, orderedLayerList, nEmbeddedGroupLayers, false );
2287
2302
}
2288
2303
}
2304
+ }
2305
+ }
2289
2306
2290
- QMap<int , QString>::const_iterator orderIt = orderedLayerNames.constBegin ();
2291
- for ( ; orderIt != orderedLayerNames.constEnd (); ++orderIt )
2292
- {
2293
- layerList.prepend ( *orderIt );
2294
- }
2307
+ void QgsProjectParser::addDrawingOrder ( QDomElement& parentElem, QDomDocument& doc ) const
2308
+ {
2309
+ if ( !mXMLDoc )
2310
+ {
2311
+ return ;
2312
+ }
2313
+
2314
+ // find legend section
2315
+ QDomElement legendElement = mXMLDoc ->documentElement ().firstChildElement ( " legend" );
2316
+ if ( legendElement.isNull () )
2317
+ {
2318
+ return ;
2319
+ }
2320
+
2321
+ bool useDrawingOrder = ( legendElement.attribute ( " updateDrawingOrder" ) == " false" );
2322
+ int nEmbeddedGroupLayers = 0 ;
2323
+ QMap<int , QString> orderedLayerNames;
2324
+
2325
+ QDomNodeList legendChildren = legendElement.childNodes ();
2326
+ QDomElement childElem;
2327
+ for ( int i = 0 ; i < legendChildren.size (); ++i )
2328
+ {
2329
+ addDrawingOrder ( legendChildren.at ( i ).toElement (), useDrawingOrder, orderedLayerNames, nEmbeddedGroupLayers, false );
2295
2330
}
2331
+
2332
+ QStringList layerList;
2333
+ QMap<int , QString>::const_iterator nameIt = orderedLayerNames.constBegin ();
2334
+ for ( ; nameIt != orderedLayerNames.constEnd (); ++nameIt )
2335
+ {
2336
+ layerList.prepend ( nameIt.value () );
2337
+ }
2338
+
2296
2339
QDomElement layerDrawingOrderElem = doc.createElement ( " LayerDrawingOrder" );
2297
2340
QDomText drawingOrderText = doc.createTextNode ( layerList.join ( " ," ) );
2298
2341
layerDrawingOrderElem.appendChild ( drawingOrderText );
0 commit comments