4242int QgsComposerMap::mCurrentComposerId = 0 ;
4343
4444QgsComposerMap::QgsComposerMap ( QgsComposition *composition, int x, int y, int width, int height )
45- : QgsComposerItem( x, y, width, height, composition )
45+ : QgsComposerItem( x, y, width, height, composition ), mKeepLayerSet( false )
4646{
4747 mComposition = composition;
4848 mMapRenderer = mComposition ->mapRenderer ();
@@ -69,7 +69,7 @@ QgsComposerMap::QgsComposerMap( QgsComposition *composition, int x, int y, int w
6969}
7070
7171QgsComposerMap::QgsComposerMap ( QgsComposition *composition )
72- : QgsComposerItem( 0 , 0 , 10 , 10 , composition )
72+ : QgsComposerItem( 0 , 0 , 10 , 10 , composition ), mKeepLayerSet( false )
7373{
7474 // Offset
7575 mXOffset = 0.0 ;
@@ -113,7 +113,16 @@ void QgsComposerMap::draw( QPainter *painter, const QgsRectangle& extent, const
113113 QgsMapRenderer theMapRenderer;
114114 theMapRenderer.setExtent ( extent );
115115 theMapRenderer.setOutputSize ( size, dpi );
116- theMapRenderer.setLayerSet ( mMapRenderer ->layerSet () );
116+
117+ // use stored layer set or read current set from main canvas
118+ if (mKeepLayerSet )
119+ {
120+ theMapRenderer.setLayerSet (mLayerSet );
121+ }
122+ else
123+ {
124+ theMapRenderer.setLayerSet ( mMapRenderer ->layerSet () );
125+ }
117126 theMapRenderer.setProjectionsEnabled ( mMapRenderer ->hasCrsTransformEnabled () );
118127 theMapRenderer.setDestinationSrs ( mMapRenderer ->destinationSrs () );
119128
@@ -240,6 +249,7 @@ void QgsComposerMap::paint( QPainter* painter, const QStyleOptionGraphicsItem* i
240249
241250void QgsComposerMap::updateCachedImage ( void )
242251{
252+ syncLayerSet (); // layer list may have changed
243253 mCacheUpdated = false ;
244254 cache ();
245255 QGraphicsRectItem::update ();
@@ -489,6 +499,15 @@ bool QgsComposerMap::writeXML( QDomElement& elem, QDomDocument & doc ) const
489499 composerMapElem.setAttribute ( " previewMode" , " Rectangle" );
490500 }
491501
502+ if (mKeepLayerSet )
503+ {
504+ composerMapElem.setAttribute ( " keepLayerSet" , " true" );
505+ }
506+ else
507+ {
508+ composerMapElem.setAttribute ( " keepLayerSet" , " false" );
509+ }
510+
492511 // extent
493512 QDomElement extentElem = doc.createElement ( " Extent" );
494513 extentElem.setAttribute ( " xmin" , QString::number ( mExtent .xMinimum () ) );
@@ -497,6 +516,18 @@ bool QgsComposerMap::writeXML( QDomElement& elem, QDomDocument & doc ) const
497516 extentElem.setAttribute ( " ymax" , QString::number ( mExtent .yMaximum () ) );
498517 composerMapElem.appendChild ( extentElem );
499518
519+ // layer set
520+ QDomElement layerSetElem = doc.createElement ( " LayerSet" );
521+ QStringList::const_iterator layerIt = mLayerSet .constBegin ();
522+ for (; layerIt != mLayerSet .constEnd (); ++layerIt)
523+ {
524+ QDomElement layerElem = doc.createElement ( " Layer" );
525+ QDomText layerIdText = doc.createTextNode (*layerIt);
526+ layerElem.appendChild (layerIdText);
527+ layerSetElem.appendChild (layerElem);
528+ }
529+ composerMapElem.appendChild (layerSetElem);
530+
500531#if 0
501532 // why is saving the map changing anything about the cache?
502533 mCacheUpdated = false;
@@ -545,6 +576,31 @@ bool QgsComposerMap::readXML( const QDomElement& itemElem, const QDomDocument& d
545576 mExtent = QgsRectangle ( xmin, ymin, xmax, ymax );
546577 }
547578
579+ // mKeepLayerSet flag
580+ QString keepLayerSetFlag = itemElem.attribute ( " keepLayerSet" );
581+ if (keepLayerSetFlag.compare (" true" , Qt::CaseInsensitive) == 0 )
582+ {
583+ mKeepLayerSet = true ;
584+ }
585+ else
586+ {
587+ mKeepLayerSet = false ;
588+ }
589+
590+ // mLayerSet
591+ QDomNodeList layerSetNodeList = itemElem.elementsByTagName (" LayerSet" );
592+ QStringList layerSet;
593+ if (layerSetNodeList.size () > 0 )
594+ {
595+ QDomElement layerSetElem = layerSetNodeList.at (0 ).toElement ();
596+ QDomNodeList layerIdNodeList = layerSetElem.elementsByTagName (" Layer" );
597+ for (int i = 0 ; i < layerIdNodeList.size (); ++i)
598+ {
599+ layerSet << layerIdNodeList.at (i).toElement ().text ();
600+ }
601+ }
602+ mLayerSet = layerSet;
603+
548604 mDrawing = false ;
549605 mNumCachedLayers = 0 ;
550606 mCacheUpdated = false ;
@@ -565,3 +621,28 @@ bool QgsComposerMap::readXML( const QDomElement& itemElem, const QDomDocument& d
565621
566622 return true ;
567623}
624+
625+ void QgsComposerMap::storeCurrentLayerSet ()
626+ {
627+ if (mMapRenderer )
628+ {
629+ mLayerSet = mMapRenderer ->layerSet ();
630+ }
631+ }
632+
633+ void QgsComposerMap::syncLayerSet ()
634+ {
635+ if (mLayerSet .size () < 1 && !mMapRenderer )
636+ {
637+ return ;
638+ }
639+
640+ QStringList currentLayerSet = mMapRenderer ->layerSet ();
641+ for (int i = mLayerSet .size () - 1 ; i >= 0 ; --i)
642+ {
643+ if (!currentLayerSet.contains (mLayerSet .at (i)))
644+ {
645+ mLayerSet .removeAt (i);
646+ }
647+ }
648+ }
0 commit comments