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
{

0 commit comments

Comments
 (0)
Please sign in to comment.