@@ -173,13 +173,14 @@ void QgsProjectParser::addLayers( QDomDocument &doc,
173173 QgsDebugMsg ( QString ( " Project path: %1" ).arg ( project ) );
174174 QString embeddedGroupName = currentChildElem.attribute ( " name" );
175175 QgsProjectParser* p = dynamic_cast <QgsProjectParser*>( QgsConfigCache::instance ()->searchConfiguration ( project ) );
176+ QList<QDomElement> embededGroupElements = p->mLegendGroupElements ;
176177 if ( p )
177178 {
178179 QStringList pIdDisabled = p->identifyDisabledLayers ();
179180
180181 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 )
183184 {
184185 if ( pLegendIt->attribute ( " name" ) == embeddedGroupName )
185186 {
@@ -189,8 +190,9 @@ void QgsProjectParser::addLayers( QDomDocument &doc,
189190 }
190191
191192 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 )
194196 {
195197 pLayerMap.insert ( layerId ( *pLayerIt ), p->createLayerFromElement ( *pLayerIt ) );
196198 }
@@ -327,17 +329,10 @@ void QgsProjectParser::combineExtentAndCrsOfGroupChildren( QDomElement& groupEle
327329QList<QgsMapLayer*> QgsProjectParser::mapLayerFromStyle ( const QString& lName, const QString& styleName, bool useCache ) const
328330{
329331 Q_UNUSED ( styleName );
330- Q_UNUSED ( useCache );
331332 QList<QgsMapLayer*> layerList;
332333
333- // Check if layer name refers to the top level group for the project.
334- if ( lName == projectTitle () )
334+ if ( !mXMLDoc )
335335 {
336- QList<QDomElement>::const_iterator layerElemIt = mProjectLayerElements .constBegin ();
337- for ( ; layerElemIt != mProjectLayerElements .constEnd (); ++layerElemIt )
338- {
339- layerList.push_back ( createLayerFromElement ( *layerElemIt, useCache ) );
340- }
341336 return layerList;
342337 }
343338
@@ -353,118 +348,126 @@ QList<QgsMapLayer*> QgsProjectParser::mapLayerFromStyle( const QString& lName, c
353348 }
354349 }
355350
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 () )
359354 {
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 )
361361 {
362- if ( groupIt->attribute ( " embedded " ) == " 1 " ) // requested group is embedded from another project
362+ if ( groupIt->attribute ( " name " ) == lName )
363363 {
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+ }
371369
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+ }
380378
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 );
396387 }
397- else // normal (not embedded) group
388+ else if ( childElem. tagName () == " legendlayer " )
398389 {
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 );
408391 }
409- return layerList;
410392 }
393+ return layerList;
411394 }
412395
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 )
416400 {
417- if ( layerIt.value ().attribute ( " embedded" ) == " 1" )
401+ QDomElement legendLayerElem = legendLayerList.at ( i ).toElement ();
402+ if ( legendLayerElem.attribute ( " name" ) == lName )
418403 {
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+ }
422407
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 )
426431 {
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 ;
437434 }
438435 }
439436 }
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
444438 {
445- if ( groupIt->attribute ( " embedded" ) == " 1" )
439+ QDomNodeList groupElemChildren = legendGroupElem.childNodes ();
440+ for ( int i = 0 ; i < groupElemChildren.size (); ++i )
446441 {
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" )
451444 {
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 );
462450 }
463451 }
464452 }
453+ }
465454
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+ }
468471}
469472
470473int QgsProjectParser::layersAndStyles ( QStringList& layers, QStringList& styles ) const
@@ -872,7 +875,8 @@ QString QgsProjectParser::layerId( const QDomElement& layerElem ) const
872875 QDomElement idElem = layerElem.firstChildElement ( " id" );
873876 if ( idElem.isNull () )
874877 {
875- return QString ();
878+ // embedded layer have id attribute instead of id child element
879+ return layerElem.attribute ( " id" );
876880 }
877881 return idElem.text ();
878882}
0 commit comments