Skip to content

Commit

Permalink
Store original style as QDomDocument instead of an XML string
Browse files Browse the repository at this point in the history
  • Loading branch information
elpaso committed Nov 5, 2018
1 parent bc8574c commit eb02004
Show file tree
Hide file tree
Showing 7 changed files with 24 additions and 39 deletions.
4 changes: 2 additions & 2 deletions python/core/auto_generated/qgsmaplayer.sip.in
Expand Up @@ -1237,7 +1237,7 @@ Returns true if the refresh on provider nofification is enabled
.. versionadded:: 3.0 .. versionadded:: 3.0
%End %End


QString originalXmlProperties() const; QDomDocument originalXmlProperties() const;
%Docstring %Docstring
Returns the XML properties of the original layer as they were when the layer Returns the XML properties of the original layer as they were when the layer
was first read from the project file. In case of new layers this is normally empty. was first read from the project file. In case of new layers this is normally empty.
Expand All @@ -1247,7 +1247,7 @@ The storage format for the XML is qlr
.. versionadded:: 3.6 .. versionadded:: 3.6
%End %End


void setOriginalXmlProperties( const QString &originalXmlProperties ); void setOriginalXmlProperties( const QDomDocument &originalXmlProperties );
%Docstring %Docstring
Sets the original XML properties for the layer to ``originalXmlProperties`` Sets the original XML properties for the layer to ``originalXmlProperties``


Expand Down
19 changes: 5 additions & 14 deletions src/app/qgisapp.cpp
Expand Up @@ -6955,26 +6955,17 @@ void QgisApp::changeDataSource( QgsMapLayer *layer )
bool layerIsValid( layer->isValid() ); bool layerIsValid( layer->isValid() );
layer->setDataSource( uri.uri, layer->name(), uri.providerKey, QgsDataProvider::ProviderOptions() ); layer->setDataSource( uri.uri, layer->name(), uri.providerKey, QgsDataProvider::ProviderOptions() );
// Re-apply style // Re-apply style
if ( !( layerIsValid || layer->originalXmlProperties().isEmpty() ) ) if ( !( layerIsValid || layer->originalXmlProperties().isNull() ) )
{ {
QgsReadWriteContext context; QgsReadWriteContext context;
context.setPathResolver( QgsProject::instance()->pathResolver() ); context.setPathResolver( QgsProject::instance()->pathResolver() );
context.setProjectTranslator( QgsProject::instance() ); context.setProjectTranslator( QgsProject::instance() );
QString errorMsg; QString errorMsg;
QDomDocument doc; QDomDocument doc( layer->originalXmlProperties() );
if ( doc.setContent( layer->originalXmlProperties() ) ) QDomNode layer_node( doc.firstChild( ) );
if ( ! layer->readSymbology( layer_node, errorMsg, context ) )
{ {
QDomNode layer_node( doc.firstChild( ) ); QgsDebugMsg( QStringLiteral( "Failed to restore original layer style from stored XML for layer %1: %2" )
if ( ! layer->readSymbology( layer_node, errorMsg, context ) )
{
QgsDebugMsg( QStringLiteral( "Failed to restore original layer style from stored XML for layer %1: %2" )
.arg( layer->name( ) )
.arg( errorMsg ) );
}
}
else
{
QgsDebugMsg( QStringLiteral( "Failed to create XML QDomDocument for layer %1: %2" )
.arg( layer->name( ) ) .arg( layer->name( ) )
.arg( errorMsg ) ); .arg( errorMsg ) );
} }
Expand Down
5 changes: 1 addition & 4 deletions src/core/layertree/qgslayertreeutils.cpp
Expand Up @@ -329,10 +329,7 @@ void QgsLayerTreeUtils::storeOriginalLayersProperties( QgsLayerTreeGroup *group,
QDomDocument document( documentType ); QDomDocument document( documentType );
QDomElement element = mlNode.toElement(); QDomElement element = mlNode.toElement();
document.appendChild( element ); document.appendChild( element );
QString str; l->setOriginalXmlProperties( document );
QTextStream stream( &str );
document.save( stream, 4 /*indent*/ );
l->setOriginalXmlProperties( str );
} }
} }
} }
Expand Down
4 changes: 2 additions & 2 deletions src/core/qgsmaplayer.cpp
Expand Up @@ -1833,12 +1833,12 @@ bool QgsMapLayer::isReadOnly() const
return true; return true;
} }


QString QgsMapLayer::originalXmlProperties() const QDomDocument QgsMapLayer::originalXmlProperties() const
{ {
return mOriginalXmlProperties; return mOriginalXmlProperties;
} }


void QgsMapLayer::setOriginalXmlProperties( const QString &originalXmlProperties ) void QgsMapLayer::setOriginalXmlProperties( const QDomDocument &originalXmlProperties )
{ {
mOriginalXmlProperties = originalXmlProperties; mOriginalXmlProperties = originalXmlProperties;
} }
Expand Down
6 changes: 3 additions & 3 deletions src/core/qgsmaplayer.h
Expand Up @@ -1109,7 +1109,7 @@ class CORE_EXPORT QgsMapLayer : public QObject
* *
* \since QGIS 3.6 * \since QGIS 3.6
*/ */
QString originalXmlProperties() const; QDomDocument originalXmlProperties() const;


/** /**
* Sets the original XML properties for the layer to \a originalXmlProperties * Sets the original XML properties for the layer to \a originalXmlProperties
Expand All @@ -1118,7 +1118,7 @@ class CORE_EXPORT QgsMapLayer : public QObject
* *
* \since QGIS 3.6 * \since QGIS 3.6
*/ */
void setOriginalXmlProperties( const QString &originalXmlProperties ); void setOriginalXmlProperties( const QDomDocument &originalXmlProperties );


public slots: public slots:


Expand Down Expand Up @@ -1529,7 +1529,7 @@ class CORE_EXPORT QgsMapLayer : public QObject
* *
* This information can be used to pass through the bad layers or to reset changes on a good layer * This information can be used to pass through the bad layers or to reset changes on a good layer
*/ */
QString mOriginalXmlProperties; QDomDocument mOriginalXmlProperties;


}; };


Expand Down
13 changes: 3 additions & 10 deletions src/core/qgsproject.cpp
Expand Up @@ -1774,17 +1774,10 @@ bool QgsProject::writeProjectFile( const QString &filename )
maplayerElem = doc->createElement( QStringLiteral( "maplayer" ) ); maplayerElem = doc->createElement( QStringLiteral( "maplayer" ) );
ml->writeLayerXml( maplayerElem, *doc, context ); ml->writeLayerXml( maplayerElem, *doc, context );
} }
else if ( ! ml->originalXmlProperties().isEmpty() ) else if ( ! ml->originalXmlProperties().isNull() )
{ {
QDomDocument document; QDomDocument document( ml->originalXmlProperties() );
if ( document.setContent( ml->originalXmlProperties() ) ) maplayerElem = document.firstChildElement();
{
maplayerElem = document.firstChildElement();
}
else
{
QgsDebugMsg( QStringLiteral( "Could not restore layer properties for layer %1" ).arg( ml->id() ) );
}
} }


emit writeMapLayer( ml, maplayerElem, *doc ); emit writeMapLayer( ml, maplayerElem, *doc );
Expand Down
12 changes: 8 additions & 4 deletions tests/src/python/test_qgsprojectbadlayers.py
Expand Up @@ -35,6 +35,7 @@
from qgis.PyQt.QtGui import QFont, QColor from qgis.PyQt.QtGui import QFont, QColor
from qgis.PyQt.QtTest import QSignalSpy from qgis.PyQt.QtTest import QSignalSpy
from qgis.PyQt.QtCore import QT_VERSION_STR, QTemporaryDir, QSize from qgis.PyQt.QtCore import QT_VERSION_STR, QTemporaryDir, QSize
from qgis.PyQt.QtXml import QDomDocument, QDomNode, QDomImplementation


from qgis.testing import start_app, unittest from qgis.testing import start_app, unittest
from utilities import (unitTestDataPath, renderMapToImage) from utilities import (unitTestDataPath, renderMapToImage)
Expand Down Expand Up @@ -99,8 +100,12 @@ def test_project_roundtrip(self):
self.assertTrue(raster.originalXmlProperties() != '') self.assertTrue(raster.originalXmlProperties() != '')
self.assertTrue(raster_copy.originalXmlProperties() != '') self.assertTrue(raster_copy.originalXmlProperties() != '')
# Test setter # Test setter
raster.setOriginalXmlProperties('pippo') domimp = QDomImplementation()
self.assertEqual(raster.originalXmlProperties(), 'pippo') documentType = domimp.createDocumentType("qgis", "http://mrcc.com/qgis.dtd", "SYSTEM")
document = QDomDocument(documentType)
document.setContent("<pippo>pluto</pippo>")
raster.setOriginalXmlProperties(document)
self.assertEqual(raster.originalXmlProperties(), document)


# Now create and invalid project: # Now create and invalid project:
bad_project_path = os.path.join(temp_dir.path(), 'project_bad.qgs') bad_project_path = os.path.join(temp_dir.path(), 'project_bad.qgs')
Expand Down Expand Up @@ -144,7 +149,7 @@ def test_project_roundtrip(self):
self.assertTrue(raster_copy.isValid()) self.assertTrue(raster_copy.isValid())


def test_project_relations(self): def test_project_relations(self):
"""Tests that a project with bad layers and relations can be saved with relations""" """Tests that a project with bad layers and relations can be maintained"""


temp_dir = QTemporaryDir() temp_dir = QTemporaryDir()
p = QgsProject.instance() p = QgsProject.instance()
Expand Down Expand Up @@ -235,7 +240,6 @@ def testStyles(self):
p = QgsProject.instance() p = QgsProject.instance()
project_path = os.path.join(temp_dir.path(), 'good_layers_test.qgs') project_path = os.path.join(temp_dir.path(), 'good_layers_test.qgs')
copyfile(os.path.join(TEST_DATA_DIR, 'projects', 'good_layers_test.qgs'), project_path) copyfile(os.path.join(TEST_DATA_DIR, 'projects', 'good_layers_test.qgs'), project_path)
copyfile(os.path.join(TEST_DATA_DIR, 'projects', 'bad_layers_test.gpkg'), os.path.join(temp_dir.path(), 'bad_layers_test.gpkg'))
for f in ( for f in (
'bad_layer_raster_test.tfw', 'bad_layer_raster_test.tfw',
'bad_layer_raster_test.tiff', 'bad_layer_raster_test.tiff',
Expand Down

0 comments on commit eb02004

Please sign in to comment.