Skip to content

Commit 4c7cff5

Browse files
committedApr 19, 2017
[composer] Correctly handle restoring map layer style overrides from template
(when template was created in a different project) On behalf of Faunalia, sponsored by ENEL (cherry-picked from 58ded28)
1 parent 6c91d45 commit 4c7cff5

File tree

2 files changed

+81
-2
lines changed

2 files changed

+81
-2
lines changed
 

‎src/core/composer/qgscomposermap.cpp

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1351,7 +1351,15 @@ bool QgsComposerMap::writeXML( QDomElement& elem, QDomDocument & doc ) const
13511351
for ( ; styleIt != mLayerStyleOverrides.constEnd(); ++styleIt )
13521352
{
13531353
QDomElement styleElem = doc.createElement( "LayerStyle" );
1354-
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+
13551363
QgsMapLayerStyle style( styleIt.value() );
13561364
style.writeXml( styleElem );
13571365
stylesElem.appendChild( styleElem );
@@ -1490,9 +1498,15 @@ bool QgsComposerMap::readXML( const QDomElement& itemElem, const QDomDocument& d
14901498
{
14911499
const QDomElement& layerStyleElement = layerStyleNodeList.at( i ).toElement();
14921500
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+
14931507
QgsMapLayerStyle style;
14941508
style.readXml( layerStyleElement );
1495-
mLayerStyleOverrides.insert( layerId, style.xmlData() );
1509+
mLayerStyleOverrides.insert( ref.layerId, style.xmlData() );
14961510
}
14971511
}
14981512

‎tests/src/core/testqgscomposition.cpp

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ class TestQgsComposition : public QObject
6363
void legendRestoredFromTemplate();
6464
void attributeTableRestoredFromTemplate();
6565
void mapLayersRestoredFromTemplate();
66+
void mapLayersStyleOverrideRestoredFromTemplate();
6667
void atlasLayerRestoredFromTemplate();
6768

6869
private:
@@ -799,6 +800,70 @@ void TestQgsComposition::mapLayersRestoredFromTemplate()
799800
QCOMPARE( map2->layerSet(), QStringList() << layer3->id() << layer4->id() );
800801
}
801802

803+
void TestQgsComposition::mapLayersStyleOverrideRestoredFromTemplate()
804+
{
805+
QgsMapLayerRegistry::instance()->removeAllMapLayers();
806+
807+
// load some layers
808+
QFileInfo vectorFileInfo( QString( TEST_DATA_DIR ) + "/points.shp" );
809+
QgsVectorLayer *layer = new QgsVectorLayer( vectorFileInfo.filePath(),
810+
vectorFileInfo.completeBaseName(),
811+
"ogr" );
812+
QFileInfo vectorFileInfo2( QString( TEST_DATA_DIR ) + "/polys.shp" );
813+
QgsVectorLayer *layer2 = new QgsVectorLayer( vectorFileInfo2.filePath(),
814+
vectorFileInfo2.completeBaseName(),
815+
"ogr" );
816+
QgsMapLayerRegistry::instance()->addMapLayer( layer2 );
817+
QgsMapLayerRegistry::instance()->addMapLayer( layer );
818+
819+
// create composition
820+
QgsMapSettings ms;
821+
QgsComposition c( ms );
822+
// add a map
823+
QgsComposerMap *map = new QgsComposerMap( &c, 1, 1, 10, 10 );
824+
c.addComposerMap( map );
825+
map->setKeepLayerStyles( true );
826+
QgsStringMap styles;
827+
// just close your eyes and pretend these are real styles
828+
styles.insert( layer->id(), "<b>xxxxx</b>" );
829+
styles.insert( layer2->id(), "<blink>yyyyy</blink>" );
830+
map->setLayerStyleOverrides( styles );
831+
832+
// save composition to template
833+
QDomDocument doc;
834+
QDomElement composerElem = doc.createElement( "Composer" );
835+
doc.appendChild( composerElem );
836+
c.writeXML( composerElem, doc );
837+
c.atlasComposition().writeXML( composerElem, doc );
838+
839+
// new project
840+
QgsMapLayerRegistry::instance()->removeAllMapLayers();
841+
QgsVectorLayer *layer3 = new QgsVectorLayer( vectorFileInfo.filePath(),
842+
vectorFileInfo.completeBaseName(),
843+
"ogr" );
844+
QgsVectorLayer *layer4 = new QgsVectorLayer( vectorFileInfo2.filePath(),
845+
vectorFileInfo2.completeBaseName(),
846+
"ogr" );
847+
QgsMapLayerRegistry::instance()->addMapLayer( layer4 );
848+
QgsMapLayerRegistry::instance()->addMapLayer( layer3 );
849+
850+
// make a new composition from template
851+
QgsComposition c2( ms );
852+
QVERIFY( c2.loadFromTemplate( doc ) );
853+
// get map from new composition
854+
QList< QgsComposerMap * > maps;
855+
c2.composerItems( maps );
856+
QgsComposerMap *map2 = static_cast< QgsComposerMap *>( maps.at( 0 ) );
857+
QVERIFY( map2 );
858+
QVERIFY( map2->keepLayerStyles() );
859+
860+
QgsStringMap restoredStyles = map2->layerStyleOverrides();
861+
QVERIFY( restoredStyles.contains( layer3->id() ) );
862+
QCOMPARE( restoredStyles.value( layer3->id() ).trimmed(), QString( "<b>xxxxx</b>" ) );
863+
QVERIFY( restoredStyles.contains( layer4->id() ) );
864+
QCOMPARE( restoredStyles.value( layer4->id() ).trimmed(), QString( "<blink>yyyyy</blink>" ) );
865+
}
866+
802867
void TestQgsComposition::atlasLayerRestoredFromTemplate()
803868
{
804869
QgsMapLayerRegistry::instance()->removeAllMapLayers();

0 commit comments

Comments
 (0)
Please sign in to comment.