Skip to content

Commit

Permalink
[3d] Fix style copy/paste for 3D renderer (fixes #17540)
Browse files Browse the repository at this point in the history
  • Loading branch information
wonder-sk committed Dec 2, 2017
1 parent be76e23 commit f8788b9
Show file tree
Hide file tree
Showing 5 changed files with 66 additions and 23 deletions.
12 changes: 12 additions & 0 deletions python/core/qgsmaplayer.sip
Expand Up @@ -1155,6 +1155,18 @@ Read style manager's configuration (if any). To be called by subclasses.
Write style manager's configuration (if exists). To be called by subclasses.
%End

void writeCommonStyle( QDomElement &layerElement, QDomDocument &document, const QgsReadWriteContext &context ) const;
%Docstring
Write style data common to all layer types
.. versionadded:: 3.0
%End

void readCommonStyle( const QDomElement &layerElement, const QgsReadWriteContext &context );
%Docstring
Read style data common to all layer types
.. versionadded:: 3.0
%End


void appendError( const QgsErrorMessage &error );
%Docstring
Expand Down
50 changes: 29 additions & 21 deletions src/core/qgsmaplayer.cpp
Expand Up @@ -547,19 +547,6 @@ bool QgsMapLayer::readLayerXml( const QDomElement &layerElement, const QgsReadWr
QDomElement metadataElem = layerElement.firstChildElement( QStringLiteral( "resourceMetadata" ) );
mMetadata.readMetadataXml( metadataElem );

QgsAbstract3DRenderer *r3D = nullptr;
QDomElement renderer3DElem = layerElement.firstChildElement( QStringLiteral( "renderer-3d" ) );
if ( !renderer3DElem.isNull() )
{
QString type3D = renderer3DElem.attribute( QStringLiteral( "type" ) );
Qgs3DRendererAbstractMetadata *meta3D = QgsApplication::renderer3DRegistry()->rendererMetadata( type3D );
if ( meta3D )
{
r3D = meta3D->createRenderer( renderer3DElem, context );
}
}
setRenderer3D( r3D );

return true;
} // bool QgsMapLayer::readLayerXML

Expand Down Expand Up @@ -832,14 +819,6 @@ bool QgsMapLayer::writeLayerXml( QDomElement &layerElement, QDomDocument &docume
mMetadata.writeMetadataXml( myMetadataElem, document );
layerElement.appendChild( myMetadataElem );

if ( m3DRenderer )
{
QDomElement renderer3DElem = document.createElement( QStringLiteral( "renderer-3d" ) );
renderer3DElem.setAttribute( QStringLiteral( "type" ), m3DRenderer->type() );
m3DRenderer->writeXml( renderer3DElem, context );
layerElement.appendChild( renderer3DElem );
}

// now append layer node to map layer node

writeCustomProperties( layerElement, document );
Expand Down Expand Up @@ -1597,6 +1576,35 @@ bool QgsMapLayer::writeStyle( QDomNode &node, QDomDocument &doc, QString &errorM
}


void QgsMapLayer::writeCommonStyle( QDomElement &layerElement, QDomDocument &document, const QgsReadWriteContext &context ) const
{
if ( m3DRenderer )
{
QDomElement renderer3DElem = document.createElement( QStringLiteral( "renderer-3d" ) );
renderer3DElem.setAttribute( QStringLiteral( "type" ), m3DRenderer->type() );
m3DRenderer->writeXml( renderer3DElem, context );
layerElement.appendChild( renderer3DElem );
}
}


void QgsMapLayer::readCommonStyle( const QDomElement &layerElement, const QgsReadWriteContext &context )
{
QgsAbstract3DRenderer *r3D = nullptr;
QDomElement renderer3DElem = layerElement.firstChildElement( QStringLiteral( "renderer-3d" ) );
if ( !renderer3DElem.isNull() )
{
QString type3D = renderer3DElem.attribute( QStringLiteral( "type" ) );
Qgs3DRendererAbstractMetadata *meta3D = QgsApplication::renderer3DRegistry()->rendererMetadata( type3D );
if ( meta3D )
{
r3D = meta3D->createRenderer( renderer3DElem, context );
}
}
setRenderer3D( r3D );
}


QUndoStack *QgsMapLayer::undoStack()
{
return &mUndoStack;
Expand Down
12 changes: 12 additions & 0 deletions src/core/qgsmaplayer.h
Expand Up @@ -1095,6 +1095,18 @@ class CORE_EXPORT QgsMapLayer : public QObject
//! Write style manager's configuration (if exists). To be called by subclasses.
void writeStyleManager( QDomNode &layerNode, QDomDocument &doc ) const;

/**
* Write style data common to all layer types
* \since QGIS 3.0
*/
void writeCommonStyle( QDomElement &layerElement, QDomDocument &document, const QgsReadWriteContext &context ) const;

/**
* Read style data common to all layer types
* \since QGIS 3.0
*/
void readCommonStyle( const QDomElement &layerElement, const QgsReadWriteContext &context );

#ifndef SIP_RUN
#if 0
//! Debugging member - invoked when a connect() is made to this object
Expand Down
7 changes: 7 additions & 0 deletions src/core/qgsvectorlayer.cpp
Expand Up @@ -1712,6 +1712,9 @@ bool QgsVectorLayer::readSymbology( const QDomNode &layerNode, QString &errorMes

updateFields();

QDomElement layerElement = layerNode.toElement();
readCommonStyle( layerElement, context );

readStyle( layerNode, errorMessage, context );

mDisplayExpression = layerNode.namedItem( QStringLiteral( "previewExpression" ) ).toElement().text();
Expand Down Expand Up @@ -2052,8 +2055,12 @@ bool QgsVectorLayer::readStyle( const QDomNode &node, QString &errorMessage, con
return result;
}


bool QgsVectorLayer::writeSymbology( QDomNode &node, QDomDocument &doc, QString &errorMessage, const QgsReadWriteContext &context ) const
{
QDomElement layerElement = node.toElement();
writeCommonStyle( layerElement, doc, context );

( void )writeStyle( node, doc, errorMessage, context );

QDomElement fieldConfigurationElement = doc.createElement( QStringLiteral( "fieldConfiguration" ) );
Expand Down
8 changes: 6 additions & 2 deletions src/core/raster/qgsrasterlayer.cpp
Expand Up @@ -1294,9 +1294,11 @@ QImage QgsRasterLayer::previewAsImage( QSize size, const QColor &bgColor, QImage
bool QgsRasterLayer::readSymbology( const QDomNode &layer_node, QString &errorMessage, const QgsReadWriteContext &context )
{
Q_UNUSED( errorMessage );
Q_UNUSED( context );
QDomElement rasterRendererElem;

QDomElement layerElement = layer_node.toElement();
readCommonStyle( layerElement, context );

// pipe element was introduced in the end of 1.9 development when there were
// already many project files in use so we support 1.9 backward compatibility
// even it was never officially released -> use pipe element if present, otherwise
Expand Down Expand Up @@ -1536,7 +1538,9 @@ bool QgsRasterLayer::readXml( const QDomNode &layer_node, const QgsReadWriteCont
bool QgsRasterLayer::writeSymbology( QDomNode &layer_node, QDomDocument &document, QString &errorMessage, const QgsReadWriteContext &context ) const
{
Q_UNUSED( errorMessage );
Q_UNUSED( context );

QDomElement layerElement = layer_node.toElement();
writeCommonStyle( layerElement, document, context );

// Store pipe members (except provider) into pipe element, in future, it will be
// possible to add custom filters into the pipe
Expand Down

0 comments on commit f8788b9

Please sign in to comment.