Skip to content

Commit de2c671

Browse files
committedNov 20, 2012
Implement addDrawingOrder for wms server under consideration of embedded groups
1 parent e017442 commit de2c671

File tree

2 files changed

+75
-29
lines changed

2 files changed

+75
-29
lines changed
 

‎src/mapserver/qgsprojectparser.cpp

Lines changed: 72 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2245,54 +2245,97 @@ QgsRectangle QgsProjectParser::layerBoundingBoxInProjectCRS( const QDomElement&
22452245
return BBox;
22462246
}
22472247

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
22492250
{
2250-
if ( !mXMLDoc )
2251+
if ( elem.isNull() )
22512252
{
22522253
return;
22532254
}
22542255

2255-
//find legend section
2256-
QDomElement legendElement = mXMLDoc->documentElement().firstChildElement( "legend" );
2257-
if ( legendElement.isNull() )
2256+
if ( elem.tagName() == "legendlayer" )
22582257
{
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+
}
22632267

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 )
22692269
{
2270-
layerList.prepend( layerNodeList.at( i ).toElement().attribute( "name" ) );
2270+
++nEmbeddedGroupLayers;
22712271
}
22722272
}
2273-
else
2273+
else if ( elem.tagName() == "legendgroup" )
22742274
{
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 )
22772277
{
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 )
22812283
{
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+
}
22832293
}
2284-
else
2294+
}
2295+
else
2296+
{
2297+
QDomNodeList childList = elem.childNodes();
2298+
QDomElement childElem;
2299+
for ( int i = 0; i < childList.size(); ++i )
22852300
{
2286-
orderedLayerNames.insert( order, layerName );
2301+
addDrawingOrder( childList.at( i ).toElement(), useDrawingOrder, orderedLayerList, nEmbeddedGroupLayers, false );
22872302
}
22882303
}
2304+
}
2305+
}
22892306

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 );
22952330
}
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+
22962339
QDomElement layerDrawingOrderElem = doc.createElement( "LayerDrawingOrder" );
22972340
QDomText drawingOrderText = doc.createTextNode( layerList.join( "," ) );
22982341
layerDrawingOrderElem.appendChild( drawingOrderText );

‎src/mapserver/qgsprojectparser.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,9 @@ class QgsProjectParser: public QgsConfigParser
207207
void setMaxWidthHeight();
208208
/**Reads layer drawing order from the legend section of the project file and appends it to the parent elemen (usually the <Capability> element)*/
209209
void addDrawingOrder( QDomElement& parentElem, QDomDocument& doc ) const;
210+
/**Adds drawing order info from layer element or group element (recursive)*/
211+
void addDrawingOrder( QDomElement elem, bool useDrawingOrder, QMap<int, QString>& orderedLayerList, int& nEmbeddedGroupLayers,
212+
bool embedded = false ) const;
210213
/**Returns project layers by id*/
211214
void projectLayerMap( QMap<QString, QgsMapLayer*>& layerMap ) const;
212215

0 commit comments

Comments
 (0)
Please sign in to comment.