diff --git a/src/mapserver/qgsprojectparser.cpp b/src/mapserver/qgsprojectparser.cpp index a3e9e1ed25e..f4e8b29fd0a 100644 --- a/src/mapserver/qgsprojectparser.cpp +++ b/src/mapserver/qgsprojectparser.cpp @@ -2245,6 +2245,65 @@ QgsRectangle QgsProjectParser::layerBoundingBoxInProjectCRS( const QDomElement& return BBox; } +void QgsProjectParser::addDrawingOrder( QDomElement elem, bool useDrawingOrder, QMap& orderedLayerList, int& nEmbeddedGroupLayers, + bool embedded ) const +{ + if ( elem.isNull() ) + { + return; + } + + if ( elem.tagName() == "legendlayer" ) + { + if ( useDrawingOrder ) + { + int order = elem.attribute( "drawingOrder", "-1" ).toInt(); + orderedLayerList.insertMulti( order + nEmbeddedGroupLayers, elem.attribute( "name" ) ); + } + else + { + orderedLayerList.insertMulti( orderedLayerList.size(), elem.attribute( "name" ) ); + } + + if ( embedded ) + { + ++nEmbeddedGroupLayers; + } + } + else if ( elem.tagName() == "legendgroup" ) + { + //embedded vs. not embedded + if ( elem.attribute( "embedded" ) == "1" && !embedded ) + { + //load layers / elements from project file + QString project = convertToAbsolutePath( elem.attribute( "project" ) ); + QString embeddedGroupName = elem.attribute( "name" ); + QgsProjectParser* p = dynamic_cast( QgsConfigCache::instance()->searchConfiguration( project ) ); + if ( p ) + { + QList embeddedGroupElements = p->mLegendGroupElements; + foreach ( const QDomElement &groupElem, embeddedGroupElements ) + { + if ( groupElem.attribute( "name" ) == embeddedGroupName ) + { + addDrawingOrder( groupElem, false, orderedLayerList, nEmbeddedGroupLayers, true ); + break; + } + } + } + } + else + { + QDomNodeList childList = elem.childNodes(); + QDomElement childElem; + for ( int i = 0; i < childList.size(); ++i ) + { + addDrawingOrder( childList.at( i ).toElement(), useDrawingOrder, orderedLayerList, nEmbeddedGroupLayers, false ); + } + } + } +} + void QgsProjectParser::addDrawingOrder( QDomElement& parentElem, QDomDocument& doc ) const { if ( !mXMLDoc ) @@ -2259,40 +2318,24 @@ void QgsProjectParser::addDrawingOrder( QDomElement& parentElem, QDomDocument& d return; } - QStringList layerList; - bool useDrawingOrder = ( legendElement.attribute( "updateDrawingOrder" ) == "false" ); - QDomNodeList layerNodeList = legendElement.elementsByTagName( "legendlayer" ); - if ( !useDrawingOrder ) //bottom to top - { - for ( int i = 0; i < layerNodeList.size(); ++i ) - { - layerList.prepend( layerNodeList.at( i ).toElement().attribute( "name" ) ); - } - } - else - { - QMap orderedLayerNames; - for ( int i = 0; i < layerNodeList.size(); ++i ) - { - QString layerName = layerNodeList.at( i ).toElement().attribute( "name" ); - int order = layerNodeList.at( i ).toElement().attribute( "drawingOrder" ).toInt(); - if ( order == -1 ) - { - layerList.prepend( layerName ); - } - else - { - orderedLayerNames.insert( order, layerName ); - } - } + int nEmbeddedGroupLayers = 0; + QMap orderedLayerNames; - QMap::const_iterator orderIt = orderedLayerNames.constBegin(); - for ( ; orderIt != orderedLayerNames.constEnd(); ++orderIt ) - { - layerList.prepend( *orderIt ); - } + QDomNodeList legendChildren = legendElement.childNodes(); + QDomElement childElem; + for ( int i = 0; i < legendChildren.size(); ++i ) + { + addDrawingOrder( legendChildren.at( i ).toElement(), useDrawingOrder, orderedLayerNames, nEmbeddedGroupLayers, false ); } + + QStringList layerList; + QMap::const_iterator nameIt = orderedLayerNames.constBegin(); + for ( ; nameIt != orderedLayerNames.constEnd(); ++nameIt ) + { + layerList.prepend( nameIt.value() ); + } + QDomElement layerDrawingOrderElem = doc.createElement( "LayerDrawingOrder" ); QDomText drawingOrderText = doc.createTextNode( layerList.join( "," ) ); layerDrawingOrderElem.appendChild( drawingOrderText ); diff --git a/src/mapserver/qgsprojectparser.h b/src/mapserver/qgsprojectparser.h index ad6ee626d12..899f4026fba 100644 --- a/src/mapserver/qgsprojectparser.h +++ b/src/mapserver/qgsprojectparser.h @@ -207,6 +207,9 @@ class QgsProjectParser: public QgsConfigParser void setMaxWidthHeight(); /**Reads layer drawing order from the legend section of the project file and appends it to the parent elemen (usually the element)*/ void addDrawingOrder( QDomElement& parentElem, QDomDocument& doc ) const; + /**Adds drawing order info from layer element or group element (recursive)*/ + void addDrawingOrder( QDomElement elem, bool useDrawingOrder, QMap& orderedLayerList, int& nEmbeddedGroupLayers, + bool embedded = false ) const; /**Returns project layers by id*/ void projectLayerMap( QMap& layerMap ) const;