42
42
int QgsComposerMap::mCurrentComposerId = 0 ;
43
43
44
44
QgsComposerMap::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 )
46
46
{
47
47
mComposition = composition;
48
48
mMapRenderer = mComposition ->mapRenderer ();
@@ -69,7 +69,7 @@ QgsComposerMap::QgsComposerMap( QgsComposition *composition, int x, int y, int w
69
69
}
70
70
71
71
QgsComposerMap::QgsComposerMap ( QgsComposition *composition )
72
- : QgsComposerItem( 0 , 0 , 10 , 10 , composition )
72
+ : QgsComposerItem( 0 , 0 , 10 , 10 , composition ), mKeepLayerSet( false )
73
73
{
74
74
// Offset
75
75
mXOffset = 0.0 ;
@@ -113,7 +113,16 @@ void QgsComposerMap::draw( QPainter *painter, const QgsRectangle& extent, const
113
113
QgsMapRenderer theMapRenderer;
114
114
theMapRenderer.setExtent ( extent );
115
115
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
+ }
117
126
theMapRenderer.setProjectionsEnabled ( mMapRenderer ->hasCrsTransformEnabled () );
118
127
theMapRenderer.setDestinationSrs ( mMapRenderer ->destinationSrs () );
119
128
@@ -240,6 +249,7 @@ void QgsComposerMap::paint( QPainter* painter, const QStyleOptionGraphicsItem* i
240
249
241
250
void QgsComposerMap::updateCachedImage ( void )
242
251
{
252
+ syncLayerSet (); // layer list may have changed
243
253
mCacheUpdated = false ;
244
254
cache ();
245
255
QGraphicsRectItem::update ();
@@ -489,6 +499,15 @@ bool QgsComposerMap::writeXML( QDomElement& elem, QDomDocument & doc ) const
489
499
composerMapElem.setAttribute ( " previewMode" , " Rectangle" );
490
500
}
491
501
502
+ if (mKeepLayerSet )
503
+ {
504
+ composerMapElem.setAttribute ( " keepLayerSet" , " true" );
505
+ }
506
+ else
507
+ {
508
+ composerMapElem.setAttribute ( " keepLayerSet" , " false" );
509
+ }
510
+
492
511
// extent
493
512
QDomElement extentElem = doc.createElement ( " Extent" );
494
513
extentElem.setAttribute ( " xmin" , QString::number ( mExtent .xMinimum () ) );
@@ -497,6 +516,18 @@ bool QgsComposerMap::writeXML( QDomElement& elem, QDomDocument & doc ) const
497
516
extentElem.setAttribute ( " ymax" , QString::number ( mExtent .yMaximum () ) );
498
517
composerMapElem.appendChild ( extentElem );
499
518
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
+
500
531
#if 0
501
532
// why is saving the map changing anything about the cache?
502
533
mCacheUpdated = false;
@@ -545,6 +576,31 @@ bool QgsComposerMap::readXML( const QDomElement& itemElem, const QDomDocument& d
545
576
mExtent = QgsRectangle ( xmin, ymin, xmax, ymax );
546
577
}
547
578
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
+
548
604
mDrawing = false ;
549
605
mNumCachedLayers = 0 ;
550
606
mCacheUpdated = false ;
@@ -565,3 +621,28 @@ bool QgsComposerMap::readXML( const QDomElement& itemElem, const QDomDocument& d
565
621
566
622
return true ;
567
623
}
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