Skip to content

Commit b177abf

Browse files
committedNov 21, 2012
Merge branch 'drawing_order_embedded'
2 parents 0893db7 + d673606 commit b177abf

File tree

8 files changed

+364
-73
lines changed

8 files changed

+364
-73
lines changed
 

‎src/app/legend/qgslayerorder.cpp

Lines changed: 41 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
#include "qgsmaplayer.h"
2121
#include "qgslogger.h"
2222
#include "qgslegend.h"
23+
#include "qgslegendgroup.h"
24+
#include "qgslegendlayer.h"
2325
#include "qgslegendlayer.h"
2426
#include "qgsproject.h"
2527

@@ -33,10 +35,6 @@ QgsLayerOrder::QgsLayerOrder( QgsLegend *legend, QWidget * parent, const char *n
3335
{
3436
setObjectName( name );
3537

36-
// track visibility changed in legend
37-
connect( mLegend, SIGNAL( itemChanged( QTreeWidgetItem *, int ) ),
38-
this, SLOT( legendItemChanged( QTreeWidgetItem *, int ) ) );
39-
4038
// track if legend mode changes
4139
connect( mLegend, SIGNAL( updateDrawingOrderChecked( bool ) ),
4240
this, SLOT( updateDrawingOrderChecked( bool ) ) );
@@ -85,13 +83,14 @@ void QgsLayerOrder::refreshLayerList()
8583
{
8684
clear();
8785

88-
foreach ( QgsLegendLayer *layer, mLegend->legendLayers() )
86+
QList<DrawingOrderInfo> drawingOrderList = mLegend->drawingOrder();
87+
QList<DrawingOrderInfo>::const_iterator it = drawingOrderList.constBegin();
88+
for ( ; it != drawingOrderList.constEnd(); ++it )
8989
{
90-
QListWidgetItem *item = new QListWidgetItem( layer->layer()->name() );
91-
item->setData( 1, QString::number( layer->drawingOrder() ) );
92-
item->setData( Qt::UserRole, qVariantFromValue( qobject_cast<QObject*>( layer->layer() ) ) );
93-
item->setCheckState( layer->isVisible() ? Qt::Checked : Qt::Unchecked );
94-
QgsDebugMsg( QString( "add item=%1 at %2" ).arg( item ? item->text() : "(null item)" ).arg( count() ) );
90+
QListWidgetItem *item = new QListWidgetItem( it->name );
91+
item->setCheckState( it->checked ? Qt::Checked : Qt::Unchecked );
92+
item->setData( Qt::UserRole, it->id );
93+
item->setData( Qt::UserRole + 1, it->embeddedGroup );
9594
addItem( item );
9695
}
9796
}
@@ -113,35 +112,28 @@ QListWidgetItem *QgsLayerOrder::layerItem( QgsMapLayer *layer ) const
113112

114113
void QgsLayerOrder::itemChanged( QListWidgetItem *item )
115114
{
116-
QgsDebugMsg( "Entering." );
117-
QgsDebugMsg( QString( "item=%1" ).arg( item ? item->text() : "(null item)" ) );
118-
119-
QgsMapLayer *layer = qobject_cast<QgsMapLayer *>( item->data( Qt::UserRole ).value<QObject*>() );
120-
mLegend->setLayerVisible( layer, item->checkState() == Qt::Checked );
121-
115+
QString name = item->text();
116+
QString id = item->data( Qt::UserRole ).toString();
117+
bool embeddedGroup = item->data( Qt::UserRole + 1 ).toBool();
118+
if ( embeddedGroup )
119+
{
120+
QgsLegendGroup* grp = mLegend->findLegendGroup( name, id );
121+
if ( grp )
122+
{
123+
grp->setCheckState( 0, item->checkState() );
124+
}
125+
}
126+
else
127+
{
128+
QgsLegendLayer* ll = mLegend->findLegendLayer( id );
129+
if ( ll )
130+
{
131+
ll->setCheckState( 0, item->checkState() );
132+
}
133+
}
122134
updateLayerOrder();
123135
}
124136

125-
void QgsLayerOrder::legendItemChanged( QTreeWidgetItem *item, int col )
126-
{
127-
QgsDebugMsg( "Entering." );
128-
129-
if ( col != 0 )
130-
return;
131-
132-
QgsDebugMsg( QString( "legendItem changed=%1" ).arg( item ? item->text( 0 ) : "(null item)" ) );
133-
134-
QgsLegendLayer *ll = dynamic_cast< QgsLegendLayer * >( item );
135-
if ( !ll )
136-
return;
137-
138-
QListWidgetItem *lwi = layerItem( ll->layer() );
139-
if ( !lwi )
140-
return;
141-
142-
lwi->setCheckState( item->checkState( col ) );
143-
}
144-
145137
void QgsLayerOrder::mousePressEvent( QMouseEvent * e )
146138
{
147139
QgsDebugMsg( "Entering." );
@@ -261,14 +253,24 @@ void QgsLayerOrder::updateLayerOrder()
261253
if ( !isEnabled() )
262254
return;
263255

264-
QList<QgsMapLayer *> layers;
256+
QList<DrawingOrderInfo> drawingOrder;
265257

266258
for ( int i = 0; i < count(); i++ )
267259
{
268-
layers << qobject_cast<QgsMapLayer *>( item( i )->data( Qt::UserRole ).value<QObject*>() );
260+
QListWidgetItem* listItem = item( i );
261+
if ( !listItem )
262+
{
263+
continue;
264+
}
265+
DrawingOrderInfo info;
266+
info.name = listItem->text();
267+
info.id = listItem->data( Qt::UserRole ).toString();
268+
info.checked = listItem->checkState() == Qt::Checked;
269+
info.embeddedGroup = listItem->data( Qt::UserRole + 1 ).toBool();
270+
drawingOrder.push_back( info );
269271
}
270272

271-
mLegend->setDrawingOrder( layers );
273+
mLegend->setDrawingOrder( drawingOrder );
272274
}
273275

274276
void QgsLayerOrder::hideLine()

‎src/app/legend/qgslayerorder.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ class QgsLayerOrder : public QListWidget
4848
private slots:
4949
void updateDrawingOrderChecked( bool );
5050
void itemChanged( QListWidgetItem * );
51-
void legendItemChanged( QTreeWidgetItem *, int );
5251
void refreshLayerList();
5352

5453
private:

‎src/app/legend/qgslegend.cpp

Lines changed: 177 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -841,6 +841,9 @@ QgsLegendGroup* QgsLegend::addEmbeddedGroup( const QString& groupName, const QSt
841841
group = new QgsLegendGroup( this, groupName );
842842
}
843843

844+
group->setEmbedded( true );
845+
group->setProjectPath( projectFilePath );
846+
844847
QFont groupFont;
845848
groupFont.setItalic( true );
846849
group->setFont( 0, groupFont );
@@ -1146,6 +1149,68 @@ QList<QgsLegendLayer *> QgsLegend::legendLayers()
11461149
}
11471150
}
11481151

1152+
QList<DrawingOrderInfo> QgsLegend::drawingOrder()
1153+
{
1154+
QMap<int, DrawingOrderInfo> drawingOrder;
1155+
QSet<QgsLegendLayer*> embeddedGroupChildren;
1156+
int nEntries = 0;
1157+
1158+
QTreeWidgetItemIterator it( this );
1159+
while ( *it )
1160+
{
1161+
QgsLegendLayer* llayer = dynamic_cast<QgsLegendLayer *>( *it );
1162+
QgsLegendGroup* lgroup = dynamic_cast<QgsLegendGroup *>( *it );
1163+
if ( llayer )
1164+
{
1165+
if ( !embeddedGroupChildren.contains( llayer ) )
1166+
{
1167+
DrawingOrderInfo dInfo;
1168+
dInfo.name = llayer->layerName();
1169+
dInfo.id = llayer->layer()->id();
1170+
dInfo.checked = ( llayer->checkState( 0 ) == Qt::Checked );
1171+
dInfo.embeddedGroup = false;
1172+
if ( mUpdateDrawingOrder )
1173+
{
1174+
drawingOrder.insertMulti( nEntries, dInfo );
1175+
}
1176+
else
1177+
{
1178+
drawingOrder.insertMulti( llayer->drawingOrder(), dInfo );
1179+
}
1180+
++nEntries;
1181+
}
1182+
}
1183+
else if ( lgroup )
1184+
{
1185+
if ( lgroup->isEmbedded() && !( lgroup->parent() ) )
1186+
{
1187+
QList<QgsLegendLayer*> groupLayers = lgroup->legendLayers();
1188+
QList<QgsLegendLayer*>::const_iterator groupLayerIt = groupLayers.constBegin();
1189+
for ( ; groupLayerIt != groupLayers.constEnd(); ++groupLayerIt )
1190+
{
1191+
embeddedGroupChildren.insert( *groupLayerIt );
1192+
}
1193+
DrawingOrderInfo dInfo;
1194+
dInfo.name = lgroup->text( 0 );
1195+
dInfo.id = lgroup->projectPath();
1196+
dInfo.checked = ( lgroup->checkState( 0 ) != Qt::Unchecked );
1197+
dInfo.embeddedGroup = true;
1198+
if ( mUpdateDrawingOrder )
1199+
{
1200+
drawingOrder.insertMulti( nEntries, dInfo );
1201+
}
1202+
else
1203+
{
1204+
drawingOrder.insertMulti( lgroup->drawingOrder(), dInfo );
1205+
}
1206+
++nEntries;
1207+
}
1208+
}
1209+
++it;
1210+
}
1211+
return drawingOrder.values();
1212+
}
1213+
11491214
QList<QgsMapLayer *> QgsLegend::layers()
11501215
{
11511216
QList<QgsMapLayer *> ls;
@@ -1160,14 +1225,58 @@ QList<QgsMapLayer *> QgsLegend::layers()
11601225

11611226
QList<QgsMapCanvasLayer> QgsLegend::canvasLayers()
11621227
{
1163-
QList<QgsMapCanvasLayer> ls;
1228+
QMap<int, QgsMapCanvasLayer> layers;
1229+
QSet<QgsLegendLayer*> embeddedGroupChildren;
1230+
int nEntries = 0;
11641231

1165-
foreach ( QgsLegendLayer *l, legendLayers() )
1232+
QTreeWidgetItemIterator it( this );
1233+
while ( *it )
11661234
{
1167-
ls << l->canvasLayer();
1235+
QgsLegendLayer* llayer = dynamic_cast<QgsLegendLayer *>( *it );
1236+
QgsLegendGroup* lgroup = dynamic_cast<QgsLegendGroup *>( *it );
1237+
if ( llayer && !embeddedGroupChildren.contains( llayer ) )
1238+
{
1239+
QgsMapCanvasLayer canvasLayer = llayer->canvasLayer();
1240+
if ( mUpdateDrawingOrder )
1241+
{
1242+
layers.insertMulti( nEntries + embeddedGroupChildren.size(), canvasLayer );
1243+
}
1244+
else
1245+
{
1246+
layers.insertMulti( llayer->drawingOrder(), canvasLayer );
1247+
}
1248+
}
1249+
else if ( lgroup )
1250+
{
1251+
if ( lgroup->isEmbedded() )
1252+
{
1253+
int groupDrawingOrder = lgroup->drawingOrder();
1254+
QList<QgsLegendLayer*> groupLayers = lgroup->legendLayers();
1255+
for ( int i = groupLayers.size() - 1; i >= 0; --i )
1256+
{
1257+
QgsLegendLayer* ll = groupLayers.at( i );
1258+
if ( !ll || embeddedGroupChildren.contains( ll ) )
1259+
{
1260+
continue;
1261+
}
1262+
1263+
if ( mUpdateDrawingOrder )
1264+
{
1265+
layers.insertMulti( nEntries, ll->canvasLayer() );
1266+
}
1267+
else
1268+
{
1269+
layers.insertMulti( groupDrawingOrder, ll->canvasLayer() );
1270+
}
1271+
embeddedGroupChildren.insert( ll );
1272+
}
1273+
}
1274+
}
1275+
++it;
1276+
++nEntries;
11681277
}
11691278

1170-
return ls;
1279+
return layers.values();
11711280
}
11721281

11731282
void QgsLegend::setDrawingOrder( QList<QgsMapLayer *> layers )
@@ -1186,6 +1295,44 @@ void QgsLegend::setDrawingOrder( QList<QgsMapLayer *> layers )
11861295
updateMapCanvasLayerSet();
11871296
}
11881297

1298+
void QgsLegend::setDrawingOrder( const QList<DrawingOrderInfo>& order )
1299+
{
1300+
QList<QgsMapCanvasLayer> layers;
1301+
1302+
QList<DrawingOrderInfo>::const_iterator orderIt = order.constBegin();
1303+
int i = 0;
1304+
for ( ; orderIt != order.constEnd(); ++orderIt )
1305+
{
1306+
if ( orderIt->embeddedGroup )
1307+
{
1308+
//find group
1309+
QgsLegendGroup* group = findLegendGroup( orderIt->name, orderIt->id );
1310+
if ( group )
1311+
{
1312+
group->setDrawingOrder( i );
1313+
QList<QgsLegendLayer*> groupLayers = group->legendLayers();
1314+
QList<QgsLegendLayer*>::iterator groupIt = groupLayers.begin();
1315+
for ( ; groupIt != groupLayers.end(); ++groupIt )
1316+
{
1317+
layers.push_back(( *groupIt )->canvasLayer() );
1318+
}
1319+
++i;
1320+
}
1321+
}
1322+
else
1323+
{
1324+
QgsLegendLayer *ll = findLegendLayer( orderIt->id );
1325+
if ( ll )
1326+
{
1327+
ll->setDrawingOrder( i );
1328+
layers.push_back( ll->canvasLayer() );
1329+
++i;
1330+
}
1331+
}
1332+
}
1333+
mMapCanvas->setLayerSet( layers );
1334+
}
1335+
11891336
bool QgsLegend::setCurrentLayer( QgsMapLayer *layer )
11901337
{
11911338
QgsLegendLayer *ll = findLegendLayer( layer );
@@ -1405,6 +1552,11 @@ bool QgsLegend::writeXML( QList<QTreeWidgetItem *> items, QDomNode &node, QDomDo
14051552
{
14061553
legendgroupnode.setAttribute( "embedded", 1 );
14071554
legendgroupnode.setAttribute( "project", QgsProject::instance()->writePath( embedIt.value() ) );
1555+
QgsLegendGroup* group = dynamic_cast<QgsLegendGroup*>( item );
1556+
if ( group )
1557+
{
1558+
legendgroupnode.setAttribute( "drawingOrder", group->drawingOrder() );
1559+
}
14081560
}
14091561
else
14101562
{
@@ -1531,6 +1683,10 @@ bool QgsLegend::readXML( QgsLegendGroup *parent, const QDomNode &node )
15311683
if ( childelem.attribute( "embedded" ) == "1" )
15321684
{
15331685
theGroup = addEmbeddedGroup( name, QgsProject::instance()->readPath( childelem.attribute( "project" ) ) );
1686+
if ( childelem.hasAttribute( "drawingOrder" ) )
1687+
{
1688+
theGroup->setDrawingOrder( childelem.attribute( "drawingOrder" ).toInt() );
1689+
}
15341690
updateGroupCheckStates( theGroup );
15351691
}
15361692
else
@@ -1742,6 +1898,23 @@ QgsLegendLayer* QgsLegend::findLegendLayer( const QgsMapLayer *layer )
17421898
return 0;
17431899
}
17441900

1901+
QgsLegendGroup* QgsLegend::findLegendGroup( const QString& name, const QString& projectPath )
1902+
{
1903+
QgsLegendGroup* group = 0;
1904+
for ( QTreeWidgetItem* theItem = firstItem(); theItem; theItem = nextItem( theItem ) )
1905+
{
1906+
group = dynamic_cast<QgsLegendGroup*>( theItem );
1907+
if ( group )
1908+
{
1909+
if ( group->text( 0 ) == name && group->projectPath() == projectPath )
1910+
{
1911+
return group;
1912+
}
1913+
}
1914+
}
1915+
return 0;
1916+
}
1917+
17451918

17461919
void QgsLegend::adjustIconSize()
17471920
{

‎src/app/legend/qgslegend.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,14 @@ class QgsMapCanvasLayer;
4242
//value: containter with layer ids contained in the group
4343
typedef QPair< QString, QList<QString> > GroupLayerInfo;
4444

45+
struct DrawingOrderInfo
46+
{
47+
QString name;
48+
QString id;
49+
bool checked;
50+
bool embeddedGroup;
51+
};
52+
4553
/**
4654
\class QgsLegend
4755
\brief A Legend treeview for QGIS
@@ -120,8 +128,15 @@ class QgsLegend : public QTreeWidget
120128
//!Return all layers in drawing order
121129
QList<QgsLegendLayer *> legendLayers();
122130

131+
//!Return info about layers and embedded groups in drawing order
132+
QList<DrawingOrderInfo> drawingOrder();
133+
134+
QStringList drawingOrderLayers();
135+
123136
void setDrawingOrder( QList<QgsMapLayer *> );
124137

138+
void setDrawingOrder( const QList<DrawingOrderInfo>& order );
139+
125140
/*!set the current layer
126141
returns true if the layer exists, false otherwise*/
127142
bool setCurrentLayer( QgsMapLayer *layer );
@@ -212,6 +227,9 @@ class QgsLegend : public QTreeWidget
212227
/**Returns the legend layer to which a map layer belongs to*/
213228
QgsLegendLayer* findLegendLayer( const QgsMapLayer *layer );
214229

230+
/**Returns legend group by group name and project path (empty for not-embedded groups)*/
231+
QgsLegendGroup* findLegendGroup( const QString& name, const QString& projectPath = QString() );
232+
215233
public slots:
216234

217235
/*!Adds a new layer group with the maplayers to the canvas*/

‎src/app/legend/qgslegendgroup.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ QgsLegendGroup::QgsLegendGroup( QTreeWidgetItem * theItem, QString theName )
2727
setCheckState( 0, Qt::Checked );
2828
QIcon myIcon = QgsApplication::getThemeIcon( "/mActionFolder.png" );
2929
setIcon( 0, myIcon );
30+
mEmbedded = false;
31+
mDrawingOrder = -1;
3032
}
3133
QgsLegendGroup::QgsLegendGroup( QTreeWidget* theListView, QString theString )
3234
: QgsLegendItem( theListView, theString )
@@ -36,6 +38,8 @@ QgsLegendGroup::QgsLegendGroup( QTreeWidget* theListView, QString theString )
3638
setCheckState( 0, Qt::Checked );
3739
QIcon myIcon = QgsApplication::getThemeIcon( "/mActionFolder.png" );
3840
setIcon( 0, myIcon );
41+
mEmbedded = false;
42+
mDrawingOrder = -1;
3943
}
4044

4145
QgsLegendGroup::QgsLegendGroup( QString name ): QgsLegendItem()
@@ -46,6 +50,8 @@ QgsLegendGroup::QgsLegendGroup( QString name ): QgsLegendItem()
4650
QIcon myIcon = QgsApplication::getThemeIcon( + "/mActionFolder.png" );
4751
setText( 0, name );
4852
setIcon( 0, myIcon );
53+
mEmbedded = false;
54+
mDrawingOrder = -1;
4955
}
5056

5157
QgsLegendGroup::~QgsLegendGroup()

‎src/app/legend/qgslegendgroup.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,22 @@ class QgsLegendGroup : public QgsLegendItem
3737
QList<QgsLegendLayer*> legendLayers( bool recurse = true );
3838

3939
Qt::CheckState pendingCheckState();
40+
41+
bool isEmbedded() const { return mEmbedded; }
42+
void setEmbedded( bool b ) { mEmbedded = b; }
43+
44+
QString projectPath() const { return mProjectPath; }
45+
void setProjectPath( const QString& path ) { mProjectPath = path; }
46+
47+
int drawingOrder() const { return mDrawingOrder; }
48+
void setDrawingOrder( int i ) { mDrawingOrder = i; }
49+
50+
private:
51+
bool mEmbedded;
52+
/**Path to project from which the group is embedded. Empty for not-embedded groups*/
53+
QString mProjectPath;
54+
int mDrawingOrder;
55+
4056
};
4157

4258
#endif

‎src/mapserver/qgsprojectparser.cpp

Lines changed: 100 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2289,58 +2289,116 @@ QgsRectangle QgsProjectParser::layerBoundingBoxInProjectCRS( const QDomElement&
22892289
return BBox;
22902290
}
22912291

2292-
void QgsProjectParser::addDrawingOrder( QDomElement& parentElem, QDomDocument& doc ) const
2292+
void QgsProjectParser::addDrawingOrder( QDomElement elem, bool useDrawingOrder, QMap<int, QString>& orderedLayerList, int& nEmbeddedGroupLayers,
2293+
bool embedded, int embeddedOrder ) const
22932294
{
2294-
if ( !mXMLDoc )
2295+
if ( elem.isNull() )
22952296
{
22962297
return;
22972298
}
22982299

2299-
//find legend section
2300-
QDomElement legendElement = mXMLDoc->documentElement().firstChildElement( "legend" );
2301-
if ( legendElement.isNull() )
2300+
if ( elem.tagName() == "legendlayer" )
23022301
{
2303-
return;
2304-
}
2305-
2306-
QStringList layerList;
2302+
if ( useDrawingOrder || embeddedOrder != -1 )
2303+
{
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" ) );
2314+
}
2315+
else
2316+
{
2317+
orderedLayerList.insertMulti( orderedLayerList.size(), elem.attribute( "name" ) );
2318+
}
23072319

2308-
bool useDrawingOrder = ( legendElement.attribute( "updateDrawingOrder" ) == "false" );
2309-
QDomNodeList layerNodeList = legendElement.elementsByTagName( "legendlayer" );
2310-
if ( !useDrawingOrder ) //bottom to top
2311-
{
2312-
for ( int i = 0; i < layerNodeList.size(); ++i )
2320+
if ( embedded )
23132321
{
2314-
layerList.prepend( layerNodeList.at( i ).toElement().attribute( "name" ) );
2322+
++nEmbeddedGroupLayers;
23152323
}
23162324
}
2317-
else
2325+
else if ( elem.tagName() == "legendgroup" )
23182326
{
2319-
QMap<int, QString> orderedLayerNames;
2320-
for ( int i = 0; i < layerNodeList.size(); ++i )
2327+
//embedded vs. not embedded
2328+
if ( elem.attribute( "embedded" ) == "1" && !embedded )
23212329
{
2322-
QString layerName = layerNodeList.at( i ).toElement().attribute( "name" );
2323-
int order = layerNodeList.at( i ).toElement().attribute( "drawingOrder" ).toInt();
2324-
if ( order == -1 )
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 )
23252336
{
2326-
layerList.prepend( layerName );
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+
}
23272346
}
2328-
else
2347+
}
2348+
else
2349+
{
2350+
QDomNodeList childList = elem.childNodes();
2351+
QDomElement childElem;
2352+
for ( int i = 0; i < childList.size(); ++i )
23292353
{
2330-
orderedLayerNames.insert( order, layerName );
2354+
addDrawingOrder( childList.at( i ).toElement(), useDrawingOrder, orderedLayerList, nEmbeddedGroupLayers,
2355+
embedded, embeddedOrder );
23312356
}
23322357
}
2358+
}
2359+
}
23332360

2334-
QMap<int, QString>::const_iterator orderIt = orderedLayerNames.constBegin();
2335-
for ( ; orderIt != orderedLayerNames.constEnd(); ++orderIt )
2336-
{
2337-
layerList.prepend( *orderIt );
2338-
}
2361+
void QgsProjectParser::addDrawingOrder( QDomElement& parentElem, QDomDocument& doc ) const
2362+
{
2363+
2364+
return; //soon...
2365+
2366+
#if 0
2367+
if ( !mXMLDoc )
2368+
{
2369+
return;
23392370
}
2371+
2372+
//find legend section
2373+
QDomElement legendElement = mXMLDoc->documentElement().firstChildElement( "legend" );
2374+
if ( legendElement.isNull() )
2375+
{
2376+
return;
2377+
}
2378+
2379+
bool useDrawingOrder = ( legendElement.attribute( "updateDrawingOrder" ) == "false" );
2380+
int nEmbeddedGroupLayers = 0;
2381+
QMap<int, QString> orderedLayerNames;
2382+
2383+
QDomNodeList legendChildren = legendElement.childNodes();
2384+
QDomElement childElem;
2385+
for ( int i = 0; i < legendChildren.size(); ++i )
2386+
{
2387+
addDrawingOrder( legendChildren.at( i ).toElement(), useDrawingOrder, orderedLayerNames, nEmbeddedGroupLayers, false );
2388+
}
2389+
2390+
QStringList layerList;
2391+
QMap<int, QString>::const_iterator nameIt = orderedLayerNames.constBegin();
2392+
for ( ; nameIt != orderedLayerNames.constEnd(); ++nameIt )
2393+
{
2394+
layerList.prepend( nameIt.value() );
2395+
}
2396+
23402397
QDomElement layerDrawingOrderElem = doc.createElement( "LayerDrawingOrder" );
23412398
QDomText drawingOrderText = doc.createTextNode( layerList.join( "," ) );
23422399
layerDrawingOrderElem.appendChild( drawingOrderText );
23432400
parentElem.appendChild( layerDrawingOrderElem );
2401+
#endif //0
23442402
}
23452403

23462404
void QgsProjectParser::projectLayerMap( QMap<QString, QgsMapLayer*>& layerMap ) const
@@ -2689,3 +2747,16 @@ void QgsProjectParser::drawAnnotationRectangle( QPainter* p, const QDomElement&
26892747

26902748
p->drawRect( QRectF( xPos, yPos, itemWidth, itemHeight ) );
26912749
}
2750+
2751+
int QgsProjectParser::drawingOrder( const QDomElement& elem )
2752+
{
2753+
QDomElement e = elem;
2754+
while ( !e.isNull() )
2755+
{
2756+
if ( e.hasAttribute( "drawingOrder" ) )
2757+
{
2758+
return e.attribute( "drawingOrder" ).toInt();
2759+
}
2760+
e = e.parentNode().toElement();
2761+
}
2762+
}

‎src/mapserver/qgsprojectparser.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,9 @@ class QgsProjectParser: public QgsConfigParser
209209
void setMaxWidthHeight();
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;
212+
/**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;
212215
/**Returns project layers by id*/
213216
void projectLayerMap( QMap<QString, QgsMapLayer*>& layerMap ) const;
214217

@@ -244,6 +247,9 @@ class QgsProjectParser: public QgsConfigParser
244247
@param itemWidth item width in pixels in the QGIS project (screen pixels)
245248
@param itemHeight item height in pixels in the QGIS project (screen pixels)*/
246249
static void drawAnnotationRectangle( QPainter* p, const QDomElement& elem, double scaleFactor, double xPos, double yPos, int itemWidth, int itemHeight );
250+
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 );
247253
};
248254

249255
#endif // QGSPROJECTPARSER_H

0 commit comments

Comments
 (0)
Please sign in to comment.