diff --git a/src/app/legend/qgslegend.cpp b/src/app/legend/qgslegend.cpp index 8d5fbacf4080..8c464b11db77 100644 --- a/src/app/legend/qgslegend.cpp +++ b/src/app/legend/qgslegend.cpp @@ -988,11 +988,11 @@ QgsLegendGroup* QgsLegend::addEmbeddedGroup( const QString& groupName, const QSt QDomNodeList legendGroupList = legendElem.elementsByTagName( "legendgroup" ); for ( int i = 0; i < legendGroupList.size(); ++i ) { - QDomElement legendElem = legendGroupList.at( i ).toElement(); - if ( legendElem.attribute( "name" ) == groupName ) + QDomElement legendGroupElem = legendGroupList.at( i ).toElement(); + if ( legendGroupElem.attribute( "name" ) == groupName ) { //embedded groups cannot be embedded again - if ( legendElem.attribute( "embedded" ) == "1" ) + if ( legendGroupElem.attribute( "embedded" ) == "1" ) { mEmbeddedGroups.remove( groupName ); return 0; @@ -1017,7 +1017,8 @@ QgsLegendGroup* QgsLegend::addEmbeddedGroup( const QString& groupName, const QSt group->setFont( 0, groupFont ); setCurrentItem( group ); - QDomNodeList groupChildren = legendElem.childNodes(); + bool updateDrawingOrder = legendElem.attribute( "updateDrawingOrder" ) == "true"; + QDomNodeList groupChildren = legendGroupElem.childNodes(); for ( int j = 0; j < groupChildren.size(); ++j ) { QDomElement childElem = groupChildren.at( j ).toElement(); @@ -1040,6 +1041,14 @@ QgsLegendGroup* QgsLegend::addEmbeddedGroup( const QString& groupName, const QSt if ( cItem ) { + //add drawing order + int drawingOrder = ( updateDrawingOrder ? -1 : childElem.attribute( "drawingOrder", "-1" ).toInt() ); + QgsLegendLayer* llI = dynamic_cast( cItem ); + if ( llI ) + { + llI->setDrawingOrder( drawingOrder ); + } + group->insertChild( group->childCount(), cItem ); } @@ -1474,24 +1483,39 @@ QList QgsLegend::canvasLayers() { qSort( groupLayers.begin(), groupLayers.end(), inReverseDrawingOrder ); } - for ( int i = groupLayers.size() - 1; i >= 0; --i ) + + QMap orderedLayers; + for ( int i = 0; i < groupLayers.size(); ++i ) { QgsLegendLayer* ll = groupLayers.at( i ); + int drawingOrder = ll->drawingOrder(); if ( !ll || embeddedGroupChildren.contains( ll ) ) { continue; } - if ( mUpdateDrawingOrder ) + if ( drawingOrder == -1 ) { - layers.insertMulti( nEntries, ll->canvasLayer() ); + orderedLayers.insert( orderedLayers.size(), ll->canvasLayer() ); } else { - layers.insertMulti( groupDrawingOrder, ll->canvasLayer() ); + orderedLayers.insert( drawingOrder, ll->canvasLayer() ); } embeddedGroupChildren.insert( ll ); } + QMap::iterator orderedLayersIt = orderedLayers.begin(); + for ( ; orderedLayersIt != orderedLayers.end(); ++orderedLayersIt ) + { + if ( mUpdateDrawingOrder ) + { + layers.insert( layers.size(), orderedLayersIt.value() ); + } + else + { + layers.insertMulti( groupDrawingOrder, orderedLayersIt.value() ); + } + } } } ++it; diff --git a/src/mapserver/qgis_map_serv.cpp b/src/mapserver/qgis_map_serv.cpp index b7cbd40e3d7a..4cd4162e0d10 100644 --- a/src/mapserver/qgis_map_serv.cpp +++ b/src/mapserver/qgis_map_serv.cpp @@ -177,6 +177,10 @@ int main( int argc, char * argv[] ) //Default prefix path may be altered by environment variable QgsApplication::init(); +#if !defined(Q_OS_WIN) + // init QGIS's paths - true means that all path will be inited from prefix + QgsApplication::setPrefixPath( CMAKE_INSTALL_PREFIX, TRUE ); +#endif #if defined(MAPSERVER_SKIP_ECW) QgsDebugMsg( "Skipping GDAL ECW drivers in server." ); diff --git a/src/mapserver/qgsprojectparser.cpp b/src/mapserver/qgsprojectparser.cpp index c6c1a9781adb..86eea48aa74d 100644 --- a/src/mapserver/qgsprojectparser.cpp +++ b/src/mapserver/qgsprojectparser.cpp @@ -1851,6 +1851,7 @@ void QgsProjectParser::addLayersFromGroup( const QDomElement& legendGroupElem, Q } else //normal group { + bool updateDrawingOrder = ( legendGroupElem.parentNode().toElement().attribute( "updateDrawingOrder" ) == "true" ); QMap< int, QDomElement > layerOrderList; QDomNodeList groupElemChildren = legendGroupElem.childNodes(); for ( int i = 0; i < groupElemChildren.size(); ++i ) @@ -1862,7 +1863,7 @@ void QgsProjectParser::addLayersFromGroup( const QDomElement& legendGroupElem, Q } else if ( elem.tagName() == "legendlayer" ) { - int drawingOrder = elem.attribute( "drawingOrder", "-1" ).toInt(); + int drawingOrder = updateDrawingOrder ? -1 : elem.attribute( "drawingOrder", "-1" ).toInt(); if ( drawingOrder == -1 ) { addLayerFromLegendLayer( elem, layerList, useCache ); @@ -4123,6 +4124,14 @@ void QgsProjectParser::addDrawingOrderEmbeddedGroup( const QDomElement& groupEle return; } + //legend or custom drawing order in embedded project? + bool updateDrawingOrder = true; + QDomNodeList legendNode = doc->elementsByTagName( "legend" ); + if ( legendNode.size() > 0 ) + { + updateDrawingOrder = ( legendNode.at( 0 ).toElement().attribute( "updateDrawingOrder" ) == "true" ); + } + QDomNodeList layerNodeList = embeddedGroupElem.elementsByTagName( "legendlayer" ); QDomElement layerElem; QMap layerNames; @@ -4132,7 +4141,7 @@ void QgsProjectParser::addDrawingOrderEmbeddedGroup( const QDomElement& groupEle layerElem = layerNodeList.at( i ).toElement(); layerName = layerElem.attribute( "name" ); - int layerDrawingOrder = layerElem.attribute( "drawingOrder", "-1" ).toInt(); + int layerDrawingOrder = updateDrawingOrder ? -1 : layerElem.attribute( "drawingOrder", "-1" ).toInt(); if ( layerDrawingOrder == -1 ) { layerNames.insert( layerNames.size(), layerName );