Skip to content

Commit d6992e4

Browse files
committed
Server: fix layer order in GetProjectSettings request
1 parent c064933 commit d6992e4

File tree

2 files changed

+70
-67
lines changed

2 files changed

+70
-67
lines changed

src/mapserver/qgsprojectparser.cpp

Lines changed: 68 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -254,13 +254,13 @@ void QgsProjectParser::describeFeatureType( const QString& aTypeName, QDomElemen
254254
if ( aTypeName != "" )
255255
{
256256
QStringList typeNameSplit = aTypeName.split( "," );
257-
foreach (const QString &str, typeNameSplit)
257+
foreach ( const QString &str, typeNameSplit )
258258
{
259259
if ( str.contains( ":" ) )
260-
typeNameList << str.section(":", 1, 1 );
260+
typeNameList << str.section( ":", 1, 1 );
261261
else
262262
typeNameList << str;
263-
}
263+
}
264264
}
265265

266266
foreach ( const QDomElement &elem, mProjectLayerElements )
@@ -2289,81 +2289,45 @@ QgsRectangle QgsProjectParser::layerBoundingBoxInProjectCRS( const QDomElement&
22892289
return BBox;
22902290
}
22912291

2292-
void QgsProjectParser::addDrawingOrder( QDomElement elem, bool useDrawingOrder, QMap<int, QString>& orderedLayerList, int& nEmbeddedGroupLayers,
2293-
bool embedded, int embeddedOrder ) const
2292+
void QgsProjectParser::addDrawingOrder( QDomElement elem, bool useDrawingOrder, QMap<int, QString>& orderedLayerList ) const
22942293
{
22952294
if ( elem.isNull() )
22962295
{
22972296
return;
22982297
}
22992298

2300-
if ( elem.tagName() == "legendlayer" )
2299+
if ( elem.tagName() == "legendgroup" )
23012300
{
2302-
if ( useDrawingOrder || embeddedOrder != -1 )
2301+
if ( elem.attribute( "embedded" ) == "1" )
23032302
{
2304-
int order = -1;
2305-
if ( embedded )
2306-
{
2307-
order = embeddedOrder;
2308-
}
2309-
else
2310-
{
2311-
order = drawingOrder( elem );
2312-
}
2313-
orderedLayerList.insertMulti( order + nEmbeddedGroupLayers, elem.attribute( "name" ) );
2303+
addDrawingOrderEmbeddedGroup( elem, orderedLayerList, useDrawingOrder );
23142304
}
23152305
else
23162306
{
2317-
orderedLayerList.insertMulti( orderedLayerList.size(), elem.attribute( "name" ) );
2318-
}
2319-
2320-
if ( embedded )
2321-
{
2322-
++nEmbeddedGroupLayers;
2307+
QDomNodeList groupChildren = elem.childNodes();
2308+
for ( int i = 0; i < groupChildren.size(); ++i )
2309+
{
2310+
addDrawingOrder( groupChildren.at( i ).toElement(), useDrawingOrder, orderedLayerList );
2311+
}
23232312
}
23242313
}
2325-
else if ( elem.tagName() == "legendgroup" )
2314+
else if ( elem.tagName() == "legendlayer" )
23262315
{
2327-
//embedded vs. not embedded
2328-
if ( elem.attribute( "embedded" ) == "1" && !embedded )
2316+
QString layerName = elem.attribute( "name" );
2317+
if ( useDrawingOrder )
23292318
{
2330-
//load layers / elements from project file
2331-
QString project = convertToAbsolutePath( elem.attribute( "project" ) );
2332-
QString embeddedGroupName = elem.attribute( "name" );
2333-
int embedDrawingOrder = elem.attribute( "drawingOrder", "-1" ).toInt();
2334-
QgsProjectParser* p = dynamic_cast<QgsProjectParser*>( QgsConfigCache::instance()->searchConfiguration( project ) );
2335-
if ( p )
2336-
{
2337-
QList<QDomElement> embeddedGroupElements = p->mLegendGroupElements;
2338-
foreach ( const QDomElement &groupElem, embeddedGroupElements )
2339-
{
2340-
if ( groupElem.attribute( "name" ) == embeddedGroupName )
2341-
{
2342-
addDrawingOrder( groupElem, false, orderedLayerList, nEmbeddedGroupLayers, true, embedDrawingOrder );
2343-
break;
2344-
}
2345-
}
2346-
}
2319+
int drawingOrder = elem.attribute( "drawingOrder", "-1" ).toInt();
2320+
orderedLayerList.insert( drawingOrder, layerName );
23472321
}
23482322
else
23492323
{
2350-
QDomNodeList childList = elem.childNodes();
2351-
QDomElement childElem;
2352-
for ( int i = 0; i < childList.size(); ++i )
2353-
{
2354-
addDrawingOrder( childList.at( i ).toElement(), useDrawingOrder, orderedLayerList, nEmbeddedGroupLayers,
2355-
embedded, embeddedOrder );
2356-
}
2324+
orderedLayerList.insert( orderedLayerList.size(), layerName );
23572325
}
23582326
}
23592327
}
23602328

23612329
void QgsProjectParser::addDrawingOrder( QDomElement& parentElem, QDomDocument& doc ) const
23622330
{
2363-
2364-
return; //soon...
2365-
2366-
#if 0
23672331
if ( !mXMLDoc )
23682332
{
23692333
return;
@@ -2377,14 +2341,13 @@ void QgsProjectParser::addDrawingOrder( QDomElement& parentElem, QDomDocument& d
23772341
}
23782342

23792343
bool useDrawingOrder = ( legendElement.attribute( "updateDrawingOrder" ) == "false" );
2380-
int nEmbeddedGroupLayers = 0;
23812344
QMap<int, QString> orderedLayerNames;
23822345

23832346
QDomNodeList legendChildren = legendElement.childNodes();
23842347
QDomElement childElem;
23852348
for ( int i = 0; i < legendChildren.size(); ++i )
23862349
{
2387-
addDrawingOrder( legendChildren.at( i ).toElement(), useDrawingOrder, orderedLayerNames, nEmbeddedGroupLayers, false );
2350+
addDrawingOrder( legendChildren.at( i ).toElement(), useDrawingOrder, orderedLayerNames );
23882351
}
23892352

23902353
QStringList layerList;
@@ -2398,7 +2361,6 @@ void QgsProjectParser::addDrawingOrder( QDomElement& parentElem, QDomDocument& d
23982361
QDomText drawingOrderText = doc.createTextNode( layerList.join( "," ) );
23992362
layerDrawingOrderElem.appendChild( drawingOrderText );
24002363
parentElem.appendChild( layerDrawingOrderElem );
2401-
#endif //0
24022364
}
24032365

24042366
void QgsProjectParser::projectLayerMap( QMap<QString, QgsMapLayer*>& layerMap ) const
@@ -2748,15 +2710,58 @@ void QgsProjectParser::drawAnnotationRectangle( QPainter* p, const QDomElement&
27482710
p->drawRect( QRectF( xPos, yPos, itemWidth, itemHeight ) );
27492711
}
27502712

2751-
int QgsProjectParser::drawingOrder( const QDomElement& elem )
2713+
void QgsProjectParser::addDrawingOrderEmbeddedGroup( const QDomElement& groupElem, QMap<int, QString>& orderedLayerList, bool useDrawingOrder ) const
27522714
{
2753-
QDomElement e = elem;
2754-
while ( !e.isNull() )
2715+
if ( groupElem.isNull() )
2716+
{
2717+
return;
2718+
}
2719+
2720+
QString project = convertToAbsolutePath( groupElem.attribute( "project" ) );
2721+
if ( project.isEmpty() )
2722+
{
2723+
return;
2724+
}
2725+
2726+
int embedDrawingOrder = groupElem.attribute( "drawingOrder", "-1" ).toInt();
2727+
QgsProjectParser* p = dynamic_cast<QgsProjectParser*>( QgsConfigCache::instance()->searchConfiguration( project ) );
2728+
if ( !p )
2729+
{
2730+
return;
2731+
}
2732+
2733+
QDomDocument* doc = p->mXMLDoc;
2734+
if ( !doc )
2735+
{
2736+
return;
2737+
}
2738+
2739+
QDomNodeList layerNodeList = doc->elementsByTagName( "legendlayer" );
2740+
QDomElement layerElem;
2741+
QStringList layerNames;
2742+
QString layerName;
2743+
for ( int i = 0; i < layerNodeList.size(); ++i )
27552744
{
2756-
if ( e.hasAttribute( "drawingOrder" ) )
2745+
layerElem = layerNodeList.at( i ).toElement();
2746+
layerName = layerElem.attribute( "name" );
2747+
if ( useDrawingOrder )
27572748
{
2758-
return e.attribute( "drawingOrder" ).toInt();
2749+
layerNames.push_back( layerName );
2750+
}
2751+
else
2752+
{
2753+
orderedLayerList.insert( orderedLayerList.size(), layerName );
2754+
}
2755+
}
2756+
2757+
if ( useDrawingOrder )
2758+
{
2759+
for ( int i = layerNames.size() - 1; i >= 0; --i )
2760+
{
2761+
if ( useDrawingOrder )
2762+
{
2763+
orderedLayerList.insertMulti( embedDrawingOrder, layerNames.at( i ) );
2764+
}
27592765
}
2760-
e = e.parentNode().toElement();
27612766
}
27622767
}

src/mapserver/qgsprojectparser.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -210,8 +210,7 @@ class QgsProjectParser: public QgsConfigParser
210210
/**Reads layer drawing order from the legend section of the project file and appends it to the parent elemen (usually the <Capability> element)*/
211211
void addDrawingOrder( QDomElement& parentElem, QDomDocument& doc ) const;
212212
/**Adds drawing order info from layer element or group element (recursive)*/
213-
void addDrawingOrder( QDomElement elem, bool useDrawingOrder, QMap<int, QString>& orderedLayerList, int& nEmbeddedGroupLayers,
214-
bool embedded = false, int embeddedOrder = -1 ) const;
213+
void addDrawingOrder( QDomElement elem, bool useDrawingOrder, QMap<int, QString>& orderedLayerList ) const;
215214
/**Returns project layers by id*/
216215
void projectLayerMap( QMap<QString, QgsMapLayer*>& layerMap ) const;
217216

@@ -248,8 +247,7 @@ class QgsProjectParser: public QgsConfigParser
248247
@param itemHeight item height in pixels in the QGIS project (screen pixels)*/
249248
static void drawAnnotationRectangle( QPainter* p, const QDomElement& elem, double scaleFactor, double xPos, double yPos, int itemWidth, int itemHeight );
250249

251-
/**Returns the drawing order attribute of the element or of one parent. Returns -1 if the element and all the parents don't have drawing order attribute*/
252-
static int drawingOrder( const QDomElement& elem );
250+
void addDrawingOrderEmbeddedGroup( const QDomElement& groupElem, QMap<int, QString>& orderedLayerList, bool useDrawingOrder ) const;
253251
};
254252

255253
#endif // QGSPROJECTPARSER_H

0 commit comments

Comments
 (0)