Skip to content

Commit fc58edd

Browse files
committedMay 25, 2013
legend updates:
- when enabling explicit drawing order, intially take legend order - when loading projects with explicit drawing order enabled, verify that the order is actually fully set and take legend order otherwise (fixes #7623) - store/restore active layer
1 parent 9054ede commit fc58edd

File tree

2 files changed

+63
-5
lines changed

2 files changed

+63
-5
lines changed
 

‎src/app/legend/qgslegend.cpp

Lines changed: 60 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
#include "qgsvectorlayer.h"
3535
#include "qgsgenericprojectionselector.h"
3636
#include "qgsclipboard.h"
37+
#include "qgsmessagelog.h"
3738

3839
#include <QFont>
3940
#include <QDomDocument>
@@ -1453,7 +1454,7 @@ void QgsLegend::setDrawingOrder( QList<QgsMapLayer *> layers )
14531454
updateMapCanvasLayerSet();
14541455
}
14551456

1456-
void QgsLegend::setDrawingOrder( const QList<DrawingOrderInfo>& order )
1457+
void QgsLegend::setDrawingOrder( const QList<DrawingOrderInfo> &order )
14571458
{
14581459
QList<QgsMapCanvasLayer> layers;
14591460

@@ -1680,7 +1681,7 @@ bool QgsLegend::writeXML( QDomNode &legendnode, QDomDocument &document )
16801681

16811682
bool QgsLegend::writeXML( QList<QTreeWidgetItem *> items, QDomNode &node, QDomDocument &document )
16821683
{
1683-
foreach ( QTreeWidgetItem * currentItem, items )
1684+
foreach ( QTreeWidgetItem *currentItem, items )
16841685
{
16851686
QgsLegendItem *item = dynamic_cast<QgsLegendItem *>( currentItem );
16861687
if ( !item )
@@ -1827,6 +1828,9 @@ bool QgsLegend::readXML( QgsLegendGroup *parent, const QDomNode &node )
18271828
bkMapExtent = mMapCanvas->extent();
18281829
}
18291830

1831+
QString activeLayerId = node.toElement().attribute( "activeLayer" );
1832+
QgsLegendLayer *activeLayer = 0;
1833+
18301834
const QDomNodeList &l = node.childNodes();
18311835
for ( int i = 0; i < l.count(); i++ )
18321836
{
@@ -1899,6 +1903,9 @@ bool QgsLegend::readXML( QgsLegendGroup *parent, const QDomNode &node )
18991903
continue;
19001904
}
19011905

1906+
if ( currentLayer->layer() && currentLayer->layer()->id() == activeLayerId )
1907+
activeLayer = currentLayer;
1908+
19021909
if ( currentLayer->layer() && !QgsProject::instance()->layerIsEmbedded( currentLayer->layer()->id() ).isEmpty() )
19031910
{
19041911
// start with already set font style
@@ -1959,22 +1966,40 @@ bool QgsLegend::readXML( QgsLegendGroup *parent, const QDomNode &node )
19591966
}
19601967
}
19611968

1969+
if ( activeLayer )
1970+
setCurrentItem( activeLayer );
1971+
19621972
//restore canvas extent (could be changed by addLayer calls)
19631973
if ( !bkMapExtent.isEmpty() )
19641974
{
19651975
mMapCanvas->setExtent( bkMapExtent );
19661976
}
1977+
19671978
return true;
19681979
}
19691980

19701981
bool QgsLegend::readXML( QDomNode& legendnode )
19711982
{
19721983
clear(); //remove all items first
19731984
mEmbeddedGroups.clear();
1974-
mUpdateDrawingOrder = legendnode.toElement().attribute( "updateDrawingOrder", "true" ) == "true";
1985+
1986+
mUpdateDrawingOrder = true;
1987+
1988+
if( !readXML( 0, legendnode ) )
1989+
return false;
1990+
1991+
if( legendnode.toElement().attribute( "updateDrawingOrder", "true" ) != "true" )
1992+
{
1993+
if( !verifyDrawingOrder() )
1994+
QgsMessageLog::logMessage( tr( "Not fully defined drawing order set to legend order." ), tr( "Legend" ), QgsMessageLog::WARNING );
1995+
1996+
mUpdateDrawingOrder = false;
1997+
}
1998+
19751999
emit updateDrawingOrderChecked( mUpdateDrawingOrder );
19762000
emit updateDrawingOrderUnchecked( !mUpdateDrawingOrder );
1977-
return readXML( 0, legendnode );
2001+
2002+
return true;
19782003
}
19792004

19802005
QgsLegendLayer* QgsLegend::readLayerFromXML( QDomElement& childelem, bool& isOpen )
@@ -2794,6 +2819,8 @@ void QgsLegend::writeProject( QDomDocument & doc )
27942819

27952820
QDomElement mapcanvasNode = doc.createElement( "legend" );
27962821
mapcanvasNode.setAttribute( "updateDrawingOrder", mUpdateDrawingOrder ? "true" : "false" );
2822+
if ( currentLayer() )
2823+
mapcanvasNode.setAttribute( "activeLayer", currentLayer()->id() );
27972824
qgisNode.appendChild( mapcanvasNode );
27982825
writeXML( mapcanvasNode, doc );
27992826
}
@@ -2946,11 +2973,40 @@ bool QgsLegend::groupEmbedded( QTreeWidgetItem* item ) const
29462973
return mEmbeddedGroups.contains( gItem->text( 0 ) );
29472974
}
29482975

2976+
bool QgsLegend::verifyDrawingOrder()
2977+
{
2978+
Q_ASSERT( mUpdateDrawingOrder );
2979+
2980+
// check if the drawing order wasn't already initially set
2981+
bool hasUndefinedOrder = false;
2982+
for ( QTreeWidgetItemIterator it( this ); *it && !hasUndefinedOrder; it++ )
2983+
{
2984+
QgsLegendLayer *ll = dynamic_cast<QgsLegendLayer *>( *it );
2985+
hasUndefinedOrder |= ll && ll->drawingOrder() < 0;
2986+
}
2987+
2988+
if( !hasUndefinedOrder )
2989+
return true;
2990+
2991+
int i = 0;
2992+
foreach ( QgsLegendLayer *ll, legendLayers() )
2993+
{
2994+
ll->setDrawingOrder( i++ );
2995+
}
2996+
2997+
return false;
2998+
}
2999+
29493000
void QgsLegend::setUpdateDrawingOrder( bool updateDrawingOrder )
29503001
{
29513002
if ( mUpdateDrawingOrder == updateDrawingOrder )
29523003
return;
29533004

3005+
if ( !updateDrawingOrder )
3006+
{
3007+
verifyDrawingOrder();
3008+
}
3009+
29543010
mUpdateDrawingOrder = updateDrawingOrder;
29553011

29563012
QgsProject::instance()->dirty( true );

‎src/app/legend/qgslegend.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -577,7 +577,7 @@ class QgsLegend : public QTreeWidget
577577

578578
} mPixmaps;
579579

580-
//! Widget that holds the indicator line //
580+
//! Widget that holds the indicator line
581581
QWidget *mInsertionLine;
582582

583583
QMap< QgsMapLayer::LayerType, QList< LegendLayerAction > > mLegendLayerActionMap;
@@ -588,6 +588,8 @@ class QgsLegend : public QTreeWidget
588588

589589
void updateGroupCheckStates( QTreeWidgetItem *item );
590590

591+
bool verifyDrawingOrder();
592+
591593
signals:
592594
void itemAdded( QModelIndex index );
593595
void itemMoved( QModelIndex oldIndex, QModelIndex newIndex );

0 commit comments

Comments
 (0)
Please sign in to comment.