|
34 | 34 | #include "qgsvectorlayer.h"
|
35 | 35 | #include "qgsgenericprojectionselector.h"
|
36 | 36 | #include "qgsclipboard.h"
|
| 37 | +#include "qgsmessagelog.h" |
37 | 38 |
|
38 | 39 | #include <QFont>
|
39 | 40 | #include <QDomDocument>
|
@@ -1453,7 +1454,7 @@ void QgsLegend::setDrawingOrder( QList<QgsMapLayer *> layers )
|
1453 | 1454 | updateMapCanvasLayerSet();
|
1454 | 1455 | }
|
1455 | 1456 |
|
1456 |
| -void QgsLegend::setDrawingOrder( const QList<DrawingOrderInfo>& order ) |
| 1457 | +void QgsLegend::setDrawingOrder( const QList<DrawingOrderInfo> &order ) |
1457 | 1458 | {
|
1458 | 1459 | QList<QgsMapCanvasLayer> layers;
|
1459 | 1460 |
|
@@ -1680,7 +1681,7 @@ bool QgsLegend::writeXML( QDomNode &legendnode, QDomDocument &document )
|
1680 | 1681 |
|
1681 | 1682 | bool QgsLegend::writeXML( QList<QTreeWidgetItem *> items, QDomNode &node, QDomDocument &document )
|
1682 | 1683 | {
|
1683 |
| - foreach ( QTreeWidgetItem * currentItem, items ) |
| 1684 | + foreach ( QTreeWidgetItem *currentItem, items ) |
1684 | 1685 | {
|
1685 | 1686 | QgsLegendItem *item = dynamic_cast<QgsLegendItem *>( currentItem );
|
1686 | 1687 | if ( !item )
|
@@ -1827,6 +1828,9 @@ bool QgsLegend::readXML( QgsLegendGroup *parent, const QDomNode &node )
|
1827 | 1828 | bkMapExtent = mMapCanvas->extent();
|
1828 | 1829 | }
|
1829 | 1830 |
|
| 1831 | + QString activeLayerId = node.toElement().attribute( "activeLayer" ); |
| 1832 | + QgsLegendLayer *activeLayer = 0; |
| 1833 | + |
1830 | 1834 | const QDomNodeList &l = node.childNodes();
|
1831 | 1835 | for ( int i = 0; i < l.count(); i++ )
|
1832 | 1836 | {
|
@@ -1899,6 +1903,9 @@ bool QgsLegend::readXML( QgsLegendGroup *parent, const QDomNode &node )
|
1899 | 1903 | continue;
|
1900 | 1904 | }
|
1901 | 1905 |
|
| 1906 | + if ( currentLayer->layer() && currentLayer->layer()->id() == activeLayerId ) |
| 1907 | + activeLayer = currentLayer; |
| 1908 | + |
1902 | 1909 | if ( currentLayer->layer() && !QgsProject::instance()->layerIsEmbedded( currentLayer->layer()->id() ).isEmpty() )
|
1903 | 1910 | {
|
1904 | 1911 | // start with already set font style
|
@@ -1959,22 +1966,40 @@ bool QgsLegend::readXML( QgsLegendGroup *parent, const QDomNode &node )
|
1959 | 1966 | }
|
1960 | 1967 | }
|
1961 | 1968 |
|
| 1969 | + if ( activeLayer ) |
| 1970 | + setCurrentItem( activeLayer ); |
| 1971 | + |
1962 | 1972 | //restore canvas extent (could be changed by addLayer calls)
|
1963 | 1973 | if ( !bkMapExtent.isEmpty() )
|
1964 | 1974 | {
|
1965 | 1975 | mMapCanvas->setExtent( bkMapExtent );
|
1966 | 1976 | }
|
| 1977 | + |
1967 | 1978 | return true;
|
1968 | 1979 | }
|
1969 | 1980 |
|
1970 | 1981 | bool QgsLegend::readXML( QDomNode& legendnode )
|
1971 | 1982 | {
|
1972 | 1983 | clear(); //remove all items first
|
1973 | 1984 | 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 | + |
1975 | 1999 | emit updateDrawingOrderChecked( mUpdateDrawingOrder );
|
1976 | 2000 | emit updateDrawingOrderUnchecked( !mUpdateDrawingOrder );
|
1977 |
| - return readXML( 0, legendnode ); |
| 2001 | + |
| 2002 | + return true; |
1978 | 2003 | }
|
1979 | 2004 |
|
1980 | 2005 | QgsLegendLayer* QgsLegend::readLayerFromXML( QDomElement& childelem, bool& isOpen )
|
@@ -2794,6 +2819,8 @@ void QgsLegend::writeProject( QDomDocument & doc )
|
2794 | 2819 |
|
2795 | 2820 | QDomElement mapcanvasNode = doc.createElement( "legend" );
|
2796 | 2821 | mapcanvasNode.setAttribute( "updateDrawingOrder", mUpdateDrawingOrder ? "true" : "false" );
|
| 2822 | + if ( currentLayer() ) |
| 2823 | + mapcanvasNode.setAttribute( "activeLayer", currentLayer()->id() ); |
2797 | 2824 | qgisNode.appendChild( mapcanvasNode );
|
2798 | 2825 | writeXML( mapcanvasNode, doc );
|
2799 | 2826 | }
|
@@ -2946,11 +2973,40 @@ bool QgsLegend::groupEmbedded( QTreeWidgetItem* item ) const
|
2946 | 2973 | return mEmbeddedGroups.contains( gItem->text( 0 ) );
|
2947 | 2974 | }
|
2948 | 2975 |
|
| 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 | + |
2949 | 3000 | void QgsLegend::setUpdateDrawingOrder( bool updateDrawingOrder )
|
2950 | 3001 | {
|
2951 | 3002 | if ( mUpdateDrawingOrder == updateDrawingOrder )
|
2952 | 3003 | return;
|
2953 | 3004 |
|
| 3005 | + if ( !updateDrawingOrder ) |
| 3006 | + { |
| 3007 | + verifyDrawingOrder(); |
| 3008 | + } |
| 3009 | + |
2954 | 3010 | mUpdateDrawingOrder = updateDrawingOrder;
|
2955 | 3011 |
|
2956 | 3012 | QgsProject::instance()->dirty( true );
|
|
0 commit comments