@@ -841,6 +841,9 @@ QgsLegendGroup* QgsLegend::addEmbeddedGroup( const QString& groupName, const QSt
841
841
group = new QgsLegendGroup ( this , groupName );
842
842
}
843
843
844
+ group->setEmbedded ( true );
845
+ group->setProjectPath ( projectFilePath );
846
+
844
847
QFont groupFont;
845
848
groupFont.setItalic ( true );
846
849
group->setFont ( 0 , groupFont );
@@ -1146,6 +1149,68 @@ QList<QgsLegendLayer *> QgsLegend::legendLayers()
1146
1149
}
1147
1150
}
1148
1151
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
+
1149
1214
QList<QgsMapLayer *> QgsLegend::layers ()
1150
1215
{
1151
1216
QList<QgsMapLayer *> ls;
@@ -1160,14 +1225,58 @@ QList<QgsMapLayer *> QgsLegend::layers()
1160
1225
1161
1226
QList<QgsMapCanvasLayer> QgsLegend::canvasLayers ()
1162
1227
{
1163
- QList<QgsMapCanvasLayer> ls;
1228
+ QMap<int , QgsMapCanvasLayer> layers;
1229
+ QSet<QgsLegendLayer*> embeddedGroupChildren;
1230
+ int nEntries = 0 ;
1164
1231
1165
- foreach ( QgsLegendLayer *l, legendLayers () )
1232
+ QTreeWidgetItemIterator it ( this );
1233
+ while ( *it )
1166
1234
{
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;
1168
1277
}
1169
1278
1170
- return ls ;
1279
+ return layers. values () ;
1171
1280
}
1172
1281
1173
1282
void QgsLegend::setDrawingOrder ( QList<QgsMapLayer *> layers )
@@ -1186,6 +1295,44 @@ void QgsLegend::setDrawingOrder( QList<QgsMapLayer *> layers )
1186
1295
updateMapCanvasLayerSet ();
1187
1296
}
1188
1297
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
+
1189
1336
bool QgsLegend::setCurrentLayer ( QgsMapLayer *layer )
1190
1337
{
1191
1338
QgsLegendLayer *ll = findLegendLayer ( layer );
@@ -1405,6 +1552,11 @@ bool QgsLegend::writeXML( QList<QTreeWidgetItem *> items, QDomNode &node, QDomDo
1405
1552
{
1406
1553
legendgroupnode.setAttribute ( " embedded" , 1 );
1407
1554
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
+ }
1408
1560
}
1409
1561
else
1410
1562
{
@@ -1531,6 +1683,10 @@ bool QgsLegend::readXML( QgsLegendGroup *parent, const QDomNode &node )
1531
1683
if ( childelem.attribute ( " embedded" ) == " 1" )
1532
1684
{
1533
1685
theGroup = addEmbeddedGroup ( name, QgsProject::instance ()->readPath ( childelem.attribute ( " project" ) ) );
1686
+ if ( childelem.hasAttribute ( " drawingOrder" ) )
1687
+ {
1688
+ theGroup->setDrawingOrder ( childelem.attribute ( " drawingOrder" ).toInt () );
1689
+ }
1534
1690
updateGroupCheckStates ( theGroup );
1535
1691
}
1536
1692
else
@@ -1742,6 +1898,23 @@ QgsLegendLayer* QgsLegend::findLegendLayer( const QgsMapLayer *layer )
1742
1898
return 0 ;
1743
1899
}
1744
1900
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
+
1745
1918
1746
1919
void QgsLegend::adjustIconSize ()
1747
1920
{
0 commit comments