diff --git a/src/core/composer/qgscomposermap.cpp b/src/core/composer/qgscomposermap.cpp index 73b19602773..c844cf91013 100644 --- a/src/core/composer/qgscomposermap.cpp +++ b/src/core/composer/qgscomposermap.cpp @@ -1214,7 +1214,15 @@ bool QgsComposerMap::writeXml( QDomElement &elem, QDomDocument &doc ) const for ( ; styleIt != mLayerStyleOverrides.constEnd(); ++styleIt ) { QDomElement styleElem = doc.createElement( QStringLiteral( "LayerStyle" ) ); - styleElem.setAttribute( QStringLiteral( "layerid" ), styleIt.key() ); + + QgsMapLayerRef ref( styleIt.key() ); + ref.resolve( mComposition->project() ); + + styleElem.setAttribute( QStringLiteral( "layerid" ), ref.layerId ); + styleElem.setAttribute( QStringLiteral( "name" ), ref.name ); + styleElem.setAttribute( QStringLiteral( "source" ), ref.source ); + styleElem.setAttribute( QStringLiteral( "provider" ), ref.provider ); + QgsMapLayerStyle style( styleIt.value() ); style.writeXml( styleElem ); stylesElem.appendChild( styleElem ); @@ -1365,9 +1373,15 @@ bool QgsComposerMap::readXml( const QDomElement &itemElem, const QDomDocument &d { const QDomElement &layerStyleElement = layerStyleNodeList.at( i ).toElement(); QString layerId = layerStyleElement.attribute( QStringLiteral( "layerid" ) ); + QString layerName = layerStyleElement.attribute( QStringLiteral( "name" ) ); + QString layerSource = layerStyleElement.attribute( QStringLiteral( "source" ) ); + QString layerProvider = layerStyleElement.attribute( QStringLiteral( "provider" ) ); + QgsMapLayerRef ref( layerId, layerName, layerSource, layerProvider ); + ref.resolveWeakly( mComposition->project() ); + QgsMapLayerStyle style; style.readXml( layerStyleElement ); - mLayerStyleOverrides.insert( layerId, style.xmlData() ); + mLayerStyleOverrides.insert( ref.layerId, style.xmlData() ); } } diff --git a/tests/src/core/testqgscomposition.cpp b/tests/src/core/testqgscomposition.cpp index 04c9b267c61..2899b5e4451 100644 --- a/tests/src/core/testqgscomposition.cpp +++ b/tests/src/core/testqgscomposition.cpp @@ -68,6 +68,7 @@ class TestQgsComposition : public QObject void legendRestoredFromTemplateAutoUpdate(); void attributeTableRestoredFromTemplate(); void mapLayersRestoredFromTemplate(); + void mapLayersStyleOverrideRestoredFromTemplate(); void atlasLayerRestoredFromTemplate(); private: @@ -913,6 +914,68 @@ void TestQgsComposition::mapLayersRestoredFromTemplate() QCOMPARE( map2->layers(), QList() << layer3 << layer4 ); } +void TestQgsComposition::mapLayersStyleOverrideRestoredFromTemplate() +{ + // load some layers + QFileInfo vectorFileInfo( QString( TEST_DATA_DIR ) + "/points.shp" ); + QgsVectorLayer *layer = new QgsVectorLayer( vectorFileInfo.filePath(), + vectorFileInfo.completeBaseName(), + "ogr" ); + QFileInfo vectorFileInfo2( QString( TEST_DATA_DIR ) + "/polys.shp" ); + QgsVectorLayer *layer2 = new QgsVectorLayer( vectorFileInfo2.filePath(), + vectorFileInfo2.completeBaseName(), + "ogr" ); + QgsProject p; + p.addMapLayer( layer2 ); + p.addMapLayer( layer ); + + // create composition + QgsComposition c( &p ); + // add a map + QgsComposerMap *map = new QgsComposerMap( &c, 1, 1, 10, 10 ); + c.addComposerMap( map ); + map->setKeepLayerStyles( true ); + QgsStringMap styles; + // just close your eyes and pretend these are real styles + styles.insert( layer->id(), QStringLiteral( "xxxxx" ) ); + styles.insert( layer2->id(), QStringLiteral( "yyyyy" ) ); + map->setLayerStyleOverrides( styles ); + + // save composition to template + QDomDocument doc; + QDomElement composerElem = doc.createElement( "Composer" ); + doc.appendChild( composerElem ); + c.writeXml( composerElem, doc ); + c.atlasComposition().writeXml( composerElem, doc ); + + // new project + QgsProject p2; + QgsVectorLayer *layer3 = new QgsVectorLayer( vectorFileInfo.filePath(), + vectorFileInfo.completeBaseName(), + "ogr" ); + QgsVectorLayer *layer4 = new QgsVectorLayer( vectorFileInfo2.filePath(), + vectorFileInfo2.completeBaseName(), + "ogr" ); + p2.addMapLayer( layer4 ); + p2.addMapLayer( layer3 ); + + // make a new composition from template + QgsComposition c2( &p2 ); + QVERIFY( c2.loadFromTemplate( doc ) ); + // get map from new composition + QList< QgsComposerMap * > maps; + c2.composerItems( maps ); + QgsComposerMap *map2 = static_cast< QgsComposerMap *>( maps.at( 0 ) ); + QVERIFY( map2 ); + QVERIFY( map2->keepLayerStyles() ); + + QgsStringMap restoredStyles = map2->layerStyleOverrides(); + QVERIFY( restoredStyles.contains( layer3->id() ) ); + QCOMPARE( restoredStyles.value( layer3->id() ).trimmed(), QStringLiteral( "xxxxx" ) ); + QVERIFY( restoredStyles.contains( layer4->id() ) ); + QCOMPARE( restoredStyles.value( layer4->id() ).trimmed(), QStringLiteral( "yyyyy" ) ); +} + void TestQgsComposition::atlasLayerRestoredFromTemplate() { // load some layers