@@ -93,27 +93,20 @@ void QgsWMSProjectParser::layersAndStylesCapabilities( QDomElement& parentElemen
9393QList<QgsMapLayer*> QgsWMSProjectParser::mapLayerFromStyle ( const QString& lName, const QString& styleName, bool useCache ) const
9494{
9595 Q_UNUSED ( styleName );
96- QList< QgsMapLayer*> layerList ;
96+ QMap< int , QgsMapLayer* > layers ;
9797
9898 // first check if the layer name refers an unpublished layer / group
9999 if ( mProjectParser .restrictedLayers ().contains ( lName ) )
100100 {
101- return layerList ;
101+ return QList<QgsMapLayer*>() ;
102102 }
103103
104104 // does lName refer to a leaf layer
105105 const QHash< QString, QDomElement >& projectLayerElementsByName = mProjectParser .projectLayerElementsByName ();
106106 QHash< QString, QDomElement >::const_iterator layerElemIt = projectLayerElementsByName.find ( lName );
107107 if ( layerElemIt != projectLayerElementsByName.constEnd () )
108108 {
109- mProjectParser .addJoinLayersForElement ( layerElemIt.value (), useCache );
110- mProjectParser .addValueRelationLayersForElement ( layerElemIt.value (), useCache );
111- QgsMapLayer* layer = mProjectParser .createLayerFromElement ( layerElemIt.value (), useCache );
112- if ( layer )
113- {
114- layerList.push_back ( layer );
115- return layerList;
116- }
109+ return ( QList<QgsMapLayer*>() << mProjectParser .createLayerFromElement ( layerElemIt.value (), useCache ) );
117110 }
118111
119112 // group or project name
@@ -138,28 +131,8 @@ QList<QgsMapLayer*> QgsWMSProjectParser::mapLayerFromStyle( const QString& lName
138131
139132 if ( !groupElement.isNull () )
140133 {
141- // embedded group has no children in this project file
142- if ( groupElement.attribute ( " embedded" ) == " 1" )
143- {
144- mProjectParser .addLayersFromGroup ( groupElement, layerList, useCache );
145- return layerList;
146- }
147-
148- // group element found, iterate children and call addLayersFromGroup / addLayerFromLegendLayer for each
149- QDomNodeList childList = groupElement.childNodes ();
150- for ( uint i = 0 ; i < childList.length (); ++i )
151- {
152- QDomElement childElem = childList.at ( i ).toElement ();
153- if ( childElem.tagName () == " legendgroup" )
154- {
155- mProjectParser .addLayersFromGroup ( childElem, layerList, useCache );
156- }
157- else if ( childElem.tagName () == " legendlayer" )
158- {
159- mProjectParser .addLayerFromLegendLayer ( childElem, layerList, useCache );
160- }
161- }
162- return layerList;
134+ addLayersFromGroup ( groupElement, layers, useCache );
135+ return QgsConfigParserUtils::layerMapToList ( layers, mProjectParser .updateLegendDrawingOrder () );
163136 }
164137
165138 // still not found. Check if it is a single embedded layer (embedded layers are not contained in mProjectLayerElementsByName)
@@ -170,7 +143,7 @@ QList<QgsMapLayer*> QgsWMSProjectParser::mapLayerFromStyle( const QString& lName
170143 QDomElement legendLayerElem = legendLayerList.at ( i ).toElement ();
171144 if ( legendLayerElem.attribute ( " name" ) == lName )
172145 {
173- mProjectParser .addLayerFromLegendLayer ( legendLayerElem, layerList , useCache );
146+ mProjectParser .layerFromLegendLayer ( legendLayerElem, layers , useCache );
174147 }
175148 }
176149
@@ -193,9 +166,7 @@ QList<QgsMapLayer*> QgsWMSProjectParser::mapLayerFromStyle( const QString& lName
193166 QHash< QString, QDomElement >::const_iterator pLayerNameIt = pLayerByName.find ( lName );
194167 if ( pLayerNameIt != pLayerByName.constEnd () )
195168 {
196- pp.addJoinLayersForElement ( pLayerNameIt.value (), useCache );
197- pp.addValueRelationLayersForElement ( pLayerNameIt.value (), useCache );
198- layerList.push_back ( pp.createLayerFromElement ( pLayerNameIt.value (), useCache ) );
169+ pp.layerFromLegendLayer ( pLayerNameIt.value (), layers, useCache );
199170 break ;
200171 }
201172
@@ -205,15 +176,72 @@ QList<QgsMapLayer*> QgsWMSProjectParser::mapLayerFromStyle( const QString& lName
205176 {
206177 if ( pLegendGroupIt->attribute ( " name" ) == lName )
207178 {
208- pp. addLayersFromGroup ( *pLegendGroupIt, layerList , useCache );
179+ addLayersFromGroup ( *pLegendGroupIt, layers , useCache );
209180 break ;
210181 }
211182 }
212183 }
213184 }
214185 }
215186
216- return layerList;
187+ return layers.values ();
188+ }
189+
190+ void QgsWMSProjectParser::addLayersFromGroup ( const QDomElement& legendGroupElem, QMap< int , QgsMapLayer*>& layers, bool useCache ) const
191+ {
192+ if ( legendGroupElem.isNull () )
193+ {
194+ return ;
195+ }
196+
197+ if ( legendGroupElem.attribute ( " embedded" ) == " 1" ) // embedded group
198+ {
199+ QString groupName = legendGroupElem.attribute ( " name" );
200+ int drawingOrder = mProjectParser .updateLegendDrawingOrder () ? legendGroupElem.attribute ( " drawingOrder" , " -1" ).toInt () : -1 ;
201+
202+ QString project = mProjectParser .convertToAbsolutePath ( legendGroupElem.attribute ( " project" ) );
203+ QgsWMSProjectParser* p = dynamic_cast <QgsWMSProjectParser*>( QgsConfigCache::instance ()->wmsConfiguration ( project ) );
204+ if ( p )
205+ {
206+ QgsServerProjectParser& pp = p->mProjectParser ;
207+ const QList<QDomElement>& legendGroups = pp.legendGroupElements ();
208+ QList<QDomElement>::const_iterator legendIt = legendGroups.constBegin ();
209+ for ( ; legendIt != legendGroups.constEnd (); ++legendIt )
210+ {
211+ if ( legendIt->attribute ( " name" ) == groupName )
212+ {
213+ QMap< int , QgsMapLayer*> embeddedGroupLayers;
214+ p->addLayersFromGroup ( *legendIt, embeddedGroupLayers, useCache );
215+
216+ // reverse order because it will be reversed again afterwards in insertMulti
217+ QList< QgsMapLayer* > embeddedLayerList = QgsConfigParserUtils::layerMapToList ( embeddedGroupLayers, pp.updateLegendDrawingOrder () );
218+
219+ QList< QgsMapLayer* >::const_iterator layerIt = embeddedLayerList.constBegin ();
220+ for ( ; layerIt != embeddedLayerList.constEnd (); ++layerIt )
221+ {
222+ layers.insertMulti ( drawingOrder, *layerIt );
223+ }
224+ }
225+ }
226+ }
227+ }
228+ else // normal group
229+ {
230+ QMap< int , QDomElement > layerOrderList;
231+ QDomNodeList groupElemChildren = legendGroupElem.childNodes ();
232+ for ( int i = 0 ; i < groupElemChildren.size (); ++i )
233+ {
234+ QDomElement elem = groupElemChildren.at ( i ).toElement ();
235+ if ( elem.tagName () == " legendgroup" )
236+ {
237+ addLayersFromGroup ( elem, layers, useCache );
238+ }
239+ else if ( elem.tagName () == " legendlayer" )
240+ {
241+ mProjectParser .layerFromLegendLayer ( elem, layers, useCache );
242+ }
243+ }
244+ }
217245}
218246
219247QString QgsWMSProjectParser::serviceUrl () const
0 commit comments