@@ -173,13 +173,14 @@ void QgsProjectParser::addLayers( QDomDocument &doc,
173
173
QgsDebugMsg ( QString ( " Project path: %1" ).arg ( project ) );
174
174
QString embeddedGroupName = currentChildElem.attribute ( " name" );
175
175
QgsProjectParser* p = dynamic_cast <QgsProjectParser*>( QgsConfigCache::instance ()->searchConfiguration ( project ) );
176
+ QList<QDomElement> embededGroupElements = p->mLegendGroupElements ;
176
177
if ( p )
177
178
{
178
179
QStringList pIdDisabled = p->identifyDisabledLayers ();
179
180
180
181
QDomElement embeddedGroupElem;
181
- QList<QDomElement>::const_iterator pLegendIt = mLegendGroupElements .constBegin ();
182
- for ( ; pLegendIt != mLegendGroupElements .constEnd (); ++pLegendIt )
182
+ QList<QDomElement>::const_iterator pLegendIt = embededGroupElements .constBegin ();
183
+ for ( ; pLegendIt != embededGroupElements .constEnd (); ++pLegendIt )
183
184
{
184
185
if ( pLegendIt->attribute ( " name" ) == embeddedGroupName )
185
186
{
@@ -189,8 +190,9 @@ void QgsProjectParser::addLayers( QDomDocument &doc,
189
190
}
190
191
191
192
QMap<QString, QgsMapLayer *> pLayerMap;
192
- QList<QDomElement>::const_iterator pLayerIt = mProjectLayerElements .constBegin ();
193
- for ( ; pLayerIt != mProjectLayerElements .constEnd (); ++pLayerIt )
193
+ QList<QDomElement> embededProjectLayerElements = p->mProjectLayerElements ;
194
+ QList<QDomElement>::const_iterator pLayerIt = embededProjectLayerElements.constBegin ();
195
+ for ( ; pLayerIt != embededProjectLayerElements.constEnd (); ++pLayerIt )
194
196
{
195
197
pLayerMap.insert ( layerId ( *pLayerIt ), p->createLayerFromElement ( *pLayerIt ) );
196
198
}
@@ -327,17 +329,10 @@ void QgsProjectParser::combineExtentAndCrsOfGroupChildren( QDomElement& groupEle
327
329
QList<QgsMapLayer*> QgsProjectParser::mapLayerFromStyle ( const QString& lName, const QString& styleName, bool useCache ) const
328
330
{
329
331
Q_UNUSED ( styleName );
330
- Q_UNUSED ( useCache );
331
332
QList<QgsMapLayer*> layerList;
332
333
333
- // Check if layer name refers to the top level group for the project.
334
- if ( lName == projectTitle () )
334
+ if ( !mXMLDoc )
335
335
{
336
- QList<QDomElement>::const_iterator layerElemIt = mProjectLayerElements .constBegin ();
337
- for ( ; layerElemIt != mProjectLayerElements .constEnd (); ++layerElemIt )
338
- {
339
- layerList.push_back ( createLayerFromElement ( *layerElemIt, useCache ) );
340
- }
341
336
return layerList;
342
337
}
343
338
@@ -353,118 +348,126 @@ QList<QgsMapLayer*> QgsProjectParser::mapLayerFromStyle( const QString& lName, c
353
348
}
354
349
}
355
350
356
- // maybe the layer is a goup. Check if lName is contained in the group list
357
- QList< QDomElement>::const_iterator groupIt = mLegendGroupElements . constBegin () ;
358
- for ( ; groupIt != mLegendGroupElements . constEnd (); ++groupIt )
351
+ // group or project name
352
+ QDomElement groupElement ;
353
+ if ( lName == projectTitle () )
359
354
{
360
- if ( groupIt->attribute ( " name" ) == lName )
355
+ groupElement = mXMLDoc ->documentElement ().firstChildElement ( " legend" );
356
+ }
357
+ else
358
+ {
359
+ QList<QDomElement>::const_iterator groupIt = mLegendGroupElements .constBegin ();
360
+ for ( ; groupIt != mLegendGroupElements .constEnd (); ++groupIt )
361
361
{
362
- if ( groupIt->attribute ( " embedded " ) == " 1 " ) // requested group is embedded from another project
362
+ if ( groupIt->attribute ( " name " ) == lName )
363
363
{
364
- QString project = convertToAbsolutePath ( groupIt->attribute ( " project" ) );
365
- QgsDebugMsg ( QString ( " Project path: %1" ).arg ( project ) );
366
- QgsProjectParser* p = dynamic_cast <QgsProjectParser*>( QgsConfigCache::instance ()->searchConfiguration ( project ) );
367
- if ( p )
368
- {
369
- QList<QDomElement>::const_iterator pGroupIt = mLegendGroupElements .constBegin ();
370
- QDomElement embeddedGroupElem;
364
+ groupElement = *groupIt;
365
+ break ;
366
+ }
367
+ }
368
+ }
371
369
372
- for ( ; pGroupIt != mLegendGroupElements . constEnd (); ++pGroupIt )
373
- {
374
- if ( pGroupIt-> attribute ( " name " ) == lName )
375
- {
376
- embeddedGroupElem = *pGroupIt;
377
- break ;
378
- }
379
- }
370
+ if ( !groupElement. isNull () )
371
+ {
372
+ // embedded group has no children in this project file
373
+ if ( groupElement. attribute ( " embedded " ) == " 1 " )
374
+ {
375
+ addLayersFromGroup ( groupElement, layerList, useCache ) ;
376
+ return layerList;
377
+ }
380
378
381
- if ( !embeddedGroupElem.isNull () )
382
- {
383
- // add all the layers under the group
384
- QDomNodeList pLayerNodes = embeddedGroupElem.elementsByTagName ( " legendlayer" );
385
- for ( int i = 0 ; i < pLayerNodes.size (); ++i )
386
- {
387
- QString pLayerId = pLayerNodes.at ( i ).toElement ().firstChildElement ( " filegroup" ).firstChildElement ( " legendlayerfile" ).attribute ( " layerid" );
388
- QgsMapLayer* pLayer = p->createLayerFromElement ( mProjectLayerElementsById [pLayerId], useCache );
389
- if ( pLayer )
390
- {
391
- layerList.push_back ( pLayer );
392
- }
393
- }
394
- }
395
- }
379
+ // group element found, iterate children and call addLayersFromGroup / addLayerFromLegendLayer for each
380
+ QDomNodeList childList = groupElement.childNodes ();
381
+ for ( uint i = 0 ; i < childList.length (); ++i )
382
+ {
383
+ QDomElement childElem = childList.at ( i ).toElement ();
384
+ if ( childElem.tagName () == " legendgroup" )
385
+ {
386
+ addLayersFromGroup ( childElem, layerList, useCache );
396
387
}
397
- else // normal (not embedded) group
388
+ else if ( childElem. tagName () == " legendlayer " )
398
389
{
399
- QDomNodeList layerFileList = groupIt->elementsByTagName ( " legendlayerfile" );
400
- for ( int i = 0 ; i < layerFileList.size (); ++i )
401
- {
402
- QHash< QString, QDomElement >::const_iterator layerEntry = mProjectLayerElementsById .find ( layerFileList.at ( i ).toElement ().attribute ( " layerid" ) );
403
- if ( layerEntry != mProjectLayerElementsById .constEnd () )
404
- {
405
- layerList.push_back ( createLayerFromElement ( layerEntry.value (), useCache ) );
406
- }
407
- }
390
+ addLayerFromLegendLayer ( childElem, layerList, useCache );
408
391
}
409
- return layerList;
410
392
}
393
+ return layerList;
411
394
}
412
395
413
- // maybe the layer is embedded from another project
414
- QHash< QString, QDomElement >::const_iterator layerIt = mProjectLayerElementsById .constBegin ();
415
- for ( ; layerIt != mProjectLayerElementsById .constEnd (); ++layerIt )
396
+ // still not found. Check if it is a single embedded layer (embedded layers are not contained in mProjectLayerElementsByName)
397
+ QDomElement legendElement = mXMLDoc ->documentElement ().firstChildElement ( " legend" );
398
+ QDomNodeList legendLayerList = legendElement.elementsByTagName ( " legendlayer" );
399
+ for ( int i = 0 ; i < legendLayerList.size (); ++i )
416
400
{
417
- if ( layerIt.value ().attribute ( " embedded" ) == " 1" )
401
+ QDomElement legendLayerElem = legendLayerList.at ( i ).toElement ();
402
+ if ( legendLayerElem.attribute ( " name" ) == lName )
418
403
{
419
- QString id = layerIt. value (). attribute ( " id " );
420
- QString project = layerIt. value (). attribute ( " project " );
421
- QgsDebugMsg ( QString ( " Project path: %1 " ). arg ( project ) );
404
+ addLayerFromLegendLayer ( legendLayerElem, layerList, useCache );
405
+ }
406
+ }
422
407
423
- // get config parser from cache
424
- QgsProjectParser* otherParser = dynamic_cast <QgsProjectParser*>( QgsConfigCache::instance ()->searchConfiguration ( project ) );
425
- if ( otherParser )
408
+ return layerList;
409
+ }
410
+
411
+ void QgsProjectParser::addLayersFromGroup ( const QDomElement& legendGroupElem, QList<QgsMapLayer*>& layerList, bool useCache ) const
412
+ {
413
+ if ( legendGroupElem.attribute ( " embedded" ) == " 1" ) // embedded group
414
+ {
415
+ // get project parser
416
+ // get group elements from project parser, find the group
417
+ // iterate over layers and add them (embedding in embedded groups does not work)
418
+ QString groupName = legendGroupElem.attribute ( " name" );
419
+ QString project = legendGroupElem.attribute ( " project" );
420
+ QgsProjectParser* p = dynamic_cast <QgsProjectParser*>( QgsConfigCache::instance ()->searchConfiguration ( project ) );
421
+ if ( !p )
422
+ {
423
+ return ;
424
+ }
425
+
426
+ QList<QDomElement> pLegendGroupElems = p->mLegendGroupElements ;
427
+ QList<QDomElement>::const_iterator pGroupIt = pLegendGroupElems.constBegin ();
428
+ for ( ; pGroupIt != pLegendGroupElems.constEnd (); ++pGroupIt )
429
+ {
430
+ if ( pGroupIt->attribute ( " name" ) == groupName )
426
431
{
427
- // get element by id
428
- QHash< QString, QDomElement >::const_iterator otherLayerIt = otherParser->mProjectLayerElementsById .find ( id );
429
- if ( otherLayerIt != otherParser->mProjectLayerElementsById .constEnd () )
430
- {
431
- if ( otherLayerIt.value ().firstChildElement ( " layername" ).text () == lName )
432
- {
433
- layerList.push_back ( otherParser->createLayerFromElement ( otherLayerIt.value (), useCache ) );
434
- return layerList;
435
- }
436
- }
432
+ p->addLayersFromGroup ( *pGroupIt, layerList, useCache );
433
+ return ;
437
434
}
438
435
}
439
436
}
440
-
441
- // layer still not found. Check if it is a single layer contained in a embedded layer group
442
- groupIt = mLegendGroupElements .constBegin ();
443
- for ( ; groupIt != mLegendGroupElements .constEnd (); ++groupIt )
437
+ else // normal group
444
438
{
445
- if ( groupIt->attribute ( " embedded" ) == " 1" )
439
+ QDomNodeList groupElemChildren = legendGroupElem.childNodes ();
440
+ for ( int i = 0 ; i < groupElemChildren.size (); ++i )
446
441
{
447
- QString project = convertToAbsolutePath ( groupIt->attribute ( " project" ) );
448
- QgsDebugMsg ( QString ( " Project path: %1" ).arg ( project ) );
449
- QgsProjectParser* p = dynamic_cast <QgsProjectParser*>( QgsConfigCache::instance ()->searchConfiguration ( project ) );
450
- if ( p )
442
+ QDomElement elem = groupElemChildren.at ( i ).toElement ();
443
+ if ( elem.tagName () == " legendgroup" )
451
444
{
452
- QHash< QString, QDomElement >::const_iterator pLayerIt = mProjectLayerElementsByName .find ( lName );
453
- if ( pLayerIt != mProjectLayerElementsByName .constEnd () )
454
- {
455
- QgsMapLayer* layer = p->createLayerFromElement ( pLayerIt.value () );
456
- if ( layer )
457
- {
458
- layerList.push_back ( layer );
459
- return layerList;
460
- }
461
- }
445
+ addLayersFromGroup ( elem, layerList, useCache );
446
+ }
447
+ else if ( elem.tagName () == " legendlayer" )
448
+ {
449
+ addLayerFromLegendLayer ( elem, layerList, useCache );
462
450
}
463
451
}
464
452
}
453
+ }
465
454
466
- // layer not found, return empty list
467
- return layerList;
455
+ void QgsProjectParser::addLayerFromLegendLayer ( const QDomElement& legendLayerElem, QList<QgsMapLayer*>& layerList, bool useCache ) const
456
+ {
457
+ // get layer id
458
+ // search dom element for <maplayer> element
459
+ // call createLayerFromElement()
460
+
461
+ QString id = legendLayerElem.firstChild ().firstChild ().toElement ().attribute ( " layerid" );
462
+ QHash< QString, QDomElement >::const_iterator layerIt = mProjectLayerElementsById .find ( id );
463
+ if ( layerIt != mProjectLayerElementsById .constEnd () )
464
+ {
465
+ QgsMapLayer* layer = createLayerFromElement ( layerIt.value (), useCache );
466
+ if ( layer )
467
+ {
468
+ layerList.append ( layer );
469
+ }
470
+ }
468
471
}
469
472
470
473
int QgsProjectParser::layersAndStyles ( QStringList& layers, QStringList& styles ) const
@@ -872,7 +875,8 @@ QString QgsProjectParser::layerId( const QDomElement& layerElem ) const
872
875
QDomElement idElem = layerElem.firstChildElement ( " id" );
873
876
if ( idElem.isNull () )
874
877
{
875
- return QString ();
878
+ // embedded layer have id attribute instead of id child element
879
+ return layerElem.attribute ( " id" );
876
880
}
877
881
return idElem.text ();
878
882
}
0 commit comments