Skip to content

Commit b3d0515

Browse files
authoredApr 19, 2017
Merge pull request #4370 from nyalldawson/backport_composer_template_fixes
Backport composer template fixes
2 parents 1cc2c41 + 4c7cff5 commit b3d0515

11 files changed

+691
-52
lines changed
 

‎src/core/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -672,6 +672,8 @@ SET(QGIS_CORE_HDRS
672672
qgslegendsettings.h
673673
qgslogger.h
674674
qgsmaphittest.h
675+
qgsmaplayerlistutils.h
676+
qgsmaplayerref.h
675677
qgsmaplayerrenderer.h
676678
qgsmaplayerstylemanager.h
677679
qgsmapsettings.h
@@ -723,6 +725,7 @@ SET(QGIS_CORE_HDRS
723725

724726
qgsvectordataprovider.h
725727
qgsvectorlayercache.h
728+
qgsvectorlayerref.h
726729
qgsvectorfilewriter.h
727730
qgsvectorlayerdiagramprovider.h
728731
qgsvectorlayereditutils.h

‎src/core/composer/qgsatlascomposition.cpp

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ QgsAtlasComposition::QgsAtlasComposition( QgsComposition* composition )
3535
, mEnabled( false )
3636
, mHideCoverage( false )
3737
, mFilenamePattern( "'output_'||@atlas_featurenumber" )
38-
, mCoverageLayer( nullptr )
3938
, mSingleFile( false )
4039
, mSortFeatures( false )
4140
, mSortAscending( true )
@@ -73,10 +72,10 @@ void QgsAtlasComposition::removeLayers( const QStringList& layers )
7372

7473
Q_FOREACH ( const QString& layerId, layers )
7574
{
76-
if ( layerId == mCoverageLayer->id() )
75+
if ( layerId == mCoverageLayer.layerId )
7776
{
7877
//current coverage layer removed
79-
mCoverageLayer = nullptr;
78+
mCoverageLayer.setLayer( nullptr );
8079
setEnabled( false );
8180
return;
8281
}
@@ -85,12 +84,12 @@ void QgsAtlasComposition::removeLayers( const QStringList& layers )
8584

8685
void QgsAtlasComposition::setCoverageLayer( QgsVectorLayer* layer )
8786
{
88-
if ( layer == mCoverageLayer )
87+
if ( layer == mCoverageLayer.get() )
8988
{
9089
return;
9190
}
9291

93-
mCoverageLayer = layer;
92+
mCoverageLayer.setLayer( layer );
9493
emit coverageLayerChanged( layer );
9594
}
9695

@@ -644,7 +643,10 @@ void QgsAtlasComposition::writeXML( QDomElement& elem, QDomDocument& doc ) const
644643

645644
if ( mCoverageLayer )
646645
{
647-
atlasElem.setAttribute( "coverageLayer", mCoverageLayer->id() );
646+
atlasElem.setAttribute( "coverageLayer", mCoverageLayer.layerId );
647+
atlasElem.setAttribute( "coverageLayerName", mCoverageLayer.name );
648+
atlasElem.setAttribute( "coverageLayerSource", mCoverageLayer.source );
649+
atlasElem.setAttribute( "coverageLayerProvider", mCoverageLayer.provider );
648650
}
649651
else
650652
{
@@ -682,16 +684,13 @@ void QgsAtlasComposition::readXML( const QDomElement& atlasElem, const QDomDocum
682684
}
683685

684686
// look for stored layer name
685-
mCoverageLayer = nullptr;
686-
QMap<QString, QgsMapLayer*> layers = QgsMapLayerRegistry::instance()->mapLayers();
687-
for ( QMap<QString, QgsMapLayer*>::const_iterator it = layers.begin(); it != layers.end(); ++it )
688-
{
689-
if ( it.key() == atlasElem.attribute( "coverageLayer" ) )
690-
{
691-
mCoverageLayer = dynamic_cast<QgsVectorLayer*>( it.value() );
692-
break;
693-
}
694-
}
687+
QString layerId = atlasElem.attribute( "coverageLayer" );
688+
QString layerName = atlasElem.attribute( "coverageLayerName" );
689+
QString layerSource = atlasElem.attribute( "coverageLayerSource" );
690+
QString layerProvider = atlasElem.attribute( "coverageLayerProvider" );
691+
692+
mCoverageLayer = QgsVectorLayerRef( layerId, layerName, layerSource, layerProvider );
693+
mCoverageLayer.resolveWeakly();
695694

696695
mPageNameExpression = atlasElem.attribute( "pageNameExpression", QString() );
697696
mSingleFile = atlasElem.attribute( "singleFile", "false" ) == "true" ? true : false;

‎src/core/composer/qgsatlascomposition.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "qgscoordinatetransform.h"
2020
#include "qgsfeature.h"
2121
#include "qgsgeometry.h"
22+
#include "qgsvectorlayerref.h"
2223

2324
#include <memory>
2425
#include <QString>
@@ -101,7 +102,7 @@ class CORE_EXPORT QgsAtlasComposition : public QObject
101102
* @returns atlas coverage layer
102103
* @see setCoverageLayer
103104
*/
104-
QgsVectorLayer* coverageLayer() const { return mCoverageLayer; }
105+
QgsVectorLayer* coverageLayer() const { return mCoverageLayer.get(); }
105106

106107
/** Sets the coverage layer to use for the atlas features
107108
* @param layer vector coverage layer
@@ -355,7 +356,7 @@ class CORE_EXPORT QgsAtlasComposition : public QObject
355356
bool mEnabled;
356357
bool mHideCoverage;
357358
QString mFilenamePattern;
358-
QgsVectorLayer* mCoverageLayer;
359+
QgsVectorLayerRef mCoverageLayer;
359360
bool mSingleFile;
360361

361362
QString mCurrentFilename;

‎src/core/composer/qgscomposerattributetablev2.cpp

Lines changed: 18 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@ bool QgsComposerAttributeTableCompareV2::operator()( const QgsComposerTableRow&
4949
QgsComposerAttributeTableV2::QgsComposerAttributeTableV2( QgsComposition* composition, bool createUndoCommands )
5050
: QgsComposerTableV2( composition, createUndoCommands )
5151
, mSource( LayerAttributes )
52-
, mVectorLayer( nullptr )
5352
, mCurrentAtlasLayer( nullptr )
5453
, mComposerMap( nullptr )
5554
, mMaximumNumberOfFeatures( 30 )
@@ -67,15 +66,15 @@ QgsComposerAttributeTableV2::QgsComposerAttributeTableV2( QgsComposition* compos
6766
QgsVectorLayer* vl = dynamic_cast<QgsVectorLayer*>( mapIt.value() );
6867
if ( vl )
6968
{
70-
mVectorLayer = vl;
69+
mVectorLayer.setLayer( vl );
7170
break;
7271
}
7372
}
7473
if ( mVectorLayer )
7574
{
7675
resetColumns();
7776
//listen for modifications to layer and refresh table when they occur
78-
connect( mVectorLayer, SIGNAL( layerModified() ), this, SLOT( refreshAttributes() ) );
77+
connect( mVectorLayer.get(), SIGNAL( layerModified() ), this, SLOT( refreshAttributes() ) );
7978
}
8079
connect( QgsMapLayerRegistry::instance(), SIGNAL( layerWillBeRemoved( QString ) ), this, SLOT( removeLayer( const QString& ) ) );
8180

@@ -104,14 +103,14 @@ QString QgsComposerAttributeTableV2::displayName() const
104103

105104
void QgsComposerAttributeTableV2::setVectorLayer( QgsVectorLayer* layer )
106105
{
107-
if ( layer == mVectorLayer )
106+
if ( layer == mVectorLayer.get() )
108107
{
109108
//no change
110109
return;
111110
}
112111

113112
QgsVectorLayer* prevLayer = sourceLayer();
114-
mVectorLayer = layer;
113+
mVectorLayer.setLayer( layer );
115114

116115
if ( mSource == QgsComposerAttributeTableV2::LayerAttributes && layer != prevLayer )
117116
{
@@ -125,7 +124,7 @@ void QgsComposerAttributeTableV2::setVectorLayer( QgsVectorLayer* layer )
125124
resetColumns();
126125

127126
//listen for modifications to layer and refresh table when they occur
128-
connect( mVectorLayer, SIGNAL( layerModified() ), this, SLOT( refreshAttributes() ) );
127+
connect( mVectorLayer.get(), SIGNAL( layerModified() ), this, SLOT( refreshAttributes() ) );
129128
}
130129

131130
refreshAttributes();
@@ -591,7 +590,7 @@ QgsExpressionContext *QgsComposerAttributeTableV2::createExpressionContext() con
591590

592591
if ( mSource == LayerAttributes )
593592
{
594-
context->appendScope( QgsExpressionContextUtils::layerScope( mVectorLayer ) );
593+
context->appendScope( QgsExpressionContextUtils::layerScope( mVectorLayer.get() ) );
595594
}
596595

597596
return context;
@@ -615,7 +614,7 @@ QgsVectorLayer *QgsComposerAttributeTableV2::sourceLayer()
615614
case QgsComposerAttributeTableV2::AtlasFeature:
616615
return mComposition->atlasComposition().coverageLayer();
617616
case QgsComposerAttributeTableV2::LayerAttributes:
618-
return mVectorLayer;
617+
return mVectorLayer.get();
619618
case QgsComposerAttributeTableV2::RelationChildren:
620619
{
621620
QgsRelation relation = QgsProject::instance()->relationManager()->relation( mRelationId );
@@ -631,7 +630,7 @@ void QgsComposerAttributeTableV2::removeLayer( const QString& layerId )
631630
{
632631
if ( layerId == mVectorLayer->id() )
633632
{
634-
mVectorLayer = nullptr;
633+
mVectorLayer.setLayer( nullptr );
635634
//remove existing columns
636635
qDeleteAll( mColumns );
637636
mColumns.clear();
@@ -709,7 +708,10 @@ bool QgsComposerAttributeTableV2::writeXML( QDomElement& elem, QDomDocument & do
709708
}
710709
if ( mVectorLayer )
711710
{
712-
composerTableElem.setAttribute( "vectorLayer", mVectorLayer->id() );
711+
composerTableElem.setAttribute( "vectorLayer", mVectorLayer.layerId );
712+
composerTableElem.setAttribute( "vectorLayerName", mVectorLayer.name );
713+
composerTableElem.setAttribute( "vectorLayerSource", mVectorLayer.source );
714+
composerTableElem.setAttribute( "vectorLayerProvider", mVectorLayer.provider );
713715
}
714716

715717
bool ok = QgsComposerTableV2::writeXML( composerTableElem, doc, ignoreFrames );
@@ -778,19 +780,12 @@ bool QgsComposerAttributeTableV2::readXML( const QDomElement& itemElem, const QD
778780
}
779781

780782
//vector layer
781-
QString layerId = itemElem.attribute( "vectorLayer", "not_existing" );
782-
if ( layerId == "not_existing" )
783-
{
784-
mVectorLayer = nullptr;
785-
}
786-
else
787-
{
788-
QgsMapLayer* ml = QgsMapLayerRegistry::instance()->mapLayer( layerId );
789-
if ( ml )
790-
{
791-
mVectorLayer = dynamic_cast<QgsVectorLayer*>( ml );
792-
}
793-
}
783+
QString layerId = itemElem.attribute( "vectorLayer" );
784+
QString layerName = itemElem.attribute( "vectorLayerName" );
785+
QString layerSource = itemElem.attribute( "vectorLayerSource" );
786+
QString layerProvider = itemElem.attribute( "vectorLayerProvider" );
787+
mVectorLayer = QgsVectorLayerRef( layerId, layerName, layerSource, layerProvider );
788+
mVectorLayer.resolveWeakly();
794789

795790
//connect to new layer
796791
connect( sourceLayer(), SIGNAL( layerModified() ), this, SLOT( refreshAttributes() ) );

‎src/core/composer/qgscomposerattributetablev2.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
#include "qgscomposertablev2.h"
2222
#include "qgscomposerattributetable.h"
23+
#include "qgsvectorlayerref.h"
2324

2425
class QgsComposerMap;
2526
class QgsVectorLayer;
@@ -120,7 +121,7 @@ class CORE_EXPORT QgsComposerAttributeTableV2: public QgsComposerTableV2
120121
* @returns attribute table's current vector layer
121122
* @see setVectorLayer
122123
*/
123-
QgsVectorLayer* vectorLayer() const { return mVectorLayer; }
124+
QgsVectorLayer* vectorLayer() const { return mVectorLayer.get(); }
124125

125126
/** Sets the relation id from which to display child features
126127
* @param relationId id for relation to display child features from
@@ -314,7 +315,7 @@ class CORE_EXPORT QgsComposerAttributeTableV2: public QgsComposerTableV2
314315
/** Attribute source*/
315316
ContentSource mSource;
316317
/** Associated vector layer*/
317-
QgsVectorLayer* mVectorLayer;
318+
QgsVectorLayerRef mVectorLayer;
318319
/** Relation id, if in relation children mode*/
319320
QString mRelationId;
320321

‎src/core/composer/qgscomposermap.cpp

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
#include "qgsexpression.h"
3636
#include "qgsvisibilitypresetcollection.h"
3737
#include "qgsannotation.h"
38+
#include "qgsvectorlayerref.h"
3839

3940
#include "qgslabel.h"
4041
#include "qgslabelattributes.h"
@@ -1323,12 +1324,21 @@ bool QgsComposerMap::writeXML( QDomElement& elem, QDomDocument & doc ) const
13231324

13241325
//layer set
13251326
QDomElement layerSetElem = doc.createElement( "LayerSet" );
1326-
QStringList::const_iterator layerIt = mLayerSet.constBegin();
1327-
for ( ; layerIt != mLayerSet.constEnd(); ++layerIt )
1327+
Q_FOREACH ( const QString &layerId, mLayerSet )
13281328
{
1329+
QgsVectorLayerRef layerRef( layerId );
1330+
layerRef.resolve();
1331+
1332+
if ( !layerRef )
1333+
continue;
1334+
13291335
QDomElement layerElem = doc.createElement( "Layer" );
1330-
QDomText layerIdText = doc.createTextNode( *layerIt );
1336+
QDomText layerIdText = doc.createTextNode( layerRef.layerId );
13311337
layerElem.appendChild( layerIdText );
1338+
layerElem.setAttribute( "name", layerRef.name );
1339+
layerElem.setAttribute( "source", layerRef.source );
1340+
layerElem.setAttribute( "provider", layerRef.provider );
1341+
13321342
layerSetElem.appendChild( layerElem );
13331343
}
13341344
composerMapElem.appendChild( layerSetElem );
@@ -1341,7 +1351,15 @@ bool QgsComposerMap::writeXML( QDomElement& elem, QDomDocument & doc ) const
13411351
for ( ; styleIt != mLayerStyleOverrides.constEnd(); ++styleIt )
13421352
{
13431353
QDomElement styleElem = doc.createElement( "LayerStyle" );
1344-
styleElem.setAttribute( "layerid", styleIt.key() );
1354+
1355+
QgsMapLayerRef ref( styleIt.key() );
1356+
ref.resolve();
1357+
1358+
styleElem.setAttribute( "layerid", ref.layerId );
1359+
styleElem.setAttribute( "name", ref.name );
1360+
styleElem.setAttribute( "source", ref.source );
1361+
styleElem.setAttribute( "provider", ref.provider );
1362+
13451363
QgsMapLayerStyle style( styleIt.value() );
13461364
style.writeXml( styleElem );
13471365
stylesElem.appendChild( styleElem );
@@ -1456,8 +1474,15 @@ bool QgsComposerMap::readXML( const QDomElement& itemElem, const QDomDocument& d
14561474
layerSet.reserve( layerIdNodeList.size() );
14571475
for ( int i = 0; i < layerIdNodeList.size(); ++i )
14581476
{
1459-
const QDomElement& layerIdElement = layerIdNodeList.at( i ).toElement();
1460-
layerSet << layerIdElement.text();
1477+
QDomElement layerElem = layerIdNodeList.at( i ).toElement();
1478+
QString layerId = layerElem.text();
1479+
QString layerName = layerElem.attribute( "name" );
1480+
QString layerSource = layerElem.attribute( "source" );
1481+
QString layerProvider = layerElem.attribute( "provider" );
1482+
1483+
QgsMapLayerRef ref( layerId, layerName, layerSource, layerProvider );
1484+
ref.resolveWeakly();
1485+
layerSet << ref.layerId;
14611486
}
14621487
}
14631488
mLayerSet = layerSet;
@@ -1473,9 +1498,15 @@ bool QgsComposerMap::readXML( const QDomElement& itemElem, const QDomDocument& d
14731498
{
14741499
const QDomElement& layerStyleElement = layerStyleNodeList.at( i ).toElement();
14751500
QString layerId = layerStyleElement.attribute( "layerid" );
1501+
QString layerName = layerStyleElement.attribute( "name" );
1502+
QString layerSource = layerStyleElement.attribute( "source" );
1503+
QString layerProvider = layerStyleElement.attribute( "provider" );
1504+
QgsMapLayerRef ref( layerId, layerName, layerSource, layerProvider );
1505+
ref.resolveWeakly();
1506+
14761507
QgsMapLayerStyle style;
14771508
style.readXml( layerStyleElement );
1478-
mLayerStyleOverrides.insert( layerId, style.xmlData() );
1509+
mLayerStyleOverrides.insert( ref.layerId, style.xmlData() );
14791510
}
14801511
}
14811512

0 commit comments

Comments
 (0)
Please sign in to comment.