@@ -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+
11491214QList<QgsMapLayer *> QgsLegend::layers ()
11501215{
11511216 QList<QgsMapLayer *> ls;
@@ -1160,14 +1225,58 @@ QList<QgsMapLayer *> QgsLegend::layers()
11601225
11611226QList<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
11731282void 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+
11891336bool 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
17461919void QgsLegend::adjustIconSize ()
17471920{
0 commit comments