Skip to content

Commit f8788b9

Browse files
committed
[3d] Fix style copy/paste for 3D renderer (fixes #17540)
1 parent be76e23 commit f8788b9

File tree

5 files changed

+66
-23
lines changed

5 files changed

+66
-23
lines changed

python/core/qgsmaplayer.sip

+12
Original file line numberDiff line numberDiff line change
@@ -1155,6 +1155,18 @@ Read style manager's configuration (if any). To be called by subclasses.
11551155
Write style manager's configuration (if exists). To be called by subclasses.
11561156
%End
11571157

1158+
void writeCommonStyle( QDomElement &layerElement, QDomDocument &document, const QgsReadWriteContext &context ) const;
1159+
%Docstring
1160+
Write style data common to all layer types
1161+
.. versionadded:: 3.0
1162+
%End
1163+
1164+
void readCommonStyle( const QDomElement &layerElement, const QgsReadWriteContext &context );
1165+
%Docstring
1166+
Read style data common to all layer types
1167+
.. versionadded:: 3.0
1168+
%End
1169+
11581170

11591171
void appendError( const QgsErrorMessage &error );
11601172
%Docstring

src/core/qgsmaplayer.cpp

+29-21
Original file line numberDiff line numberDiff line change
@@ -547,19 +547,6 @@ bool QgsMapLayer::readLayerXml( const QDomElement &layerElement, const QgsReadWr
547547
QDomElement metadataElem = layerElement.firstChildElement( QStringLiteral( "resourceMetadata" ) );
548548
mMetadata.readMetadataXml( metadataElem );
549549

550-
QgsAbstract3DRenderer *r3D = nullptr;
551-
QDomElement renderer3DElem = layerElement.firstChildElement( QStringLiteral( "renderer-3d" ) );
552-
if ( !renderer3DElem.isNull() )
553-
{
554-
QString type3D = renderer3DElem.attribute( QStringLiteral( "type" ) );
555-
Qgs3DRendererAbstractMetadata *meta3D = QgsApplication::renderer3DRegistry()->rendererMetadata( type3D );
556-
if ( meta3D )
557-
{
558-
r3D = meta3D->createRenderer( renderer3DElem, context );
559-
}
560-
}
561-
setRenderer3D( r3D );
562-
563550
return true;
564551
} // bool QgsMapLayer::readLayerXML
565552

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

835-
if ( m3DRenderer )
836-
{
837-
QDomElement renderer3DElem = document.createElement( QStringLiteral( "renderer-3d" ) );
838-
renderer3DElem.setAttribute( QStringLiteral( "type" ), m3DRenderer->type() );
839-
m3DRenderer->writeXml( renderer3DElem, context );
840-
layerElement.appendChild( renderer3DElem );
841-
}
842-
843822
// now append layer node to map layer node
844823

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

15991578

1579+
void QgsMapLayer::writeCommonStyle( QDomElement &layerElement, QDomDocument &document, const QgsReadWriteContext &context ) const
1580+
{
1581+
if ( m3DRenderer )
1582+
{
1583+
QDomElement renderer3DElem = document.createElement( QStringLiteral( "renderer-3d" ) );
1584+
renderer3DElem.setAttribute( QStringLiteral( "type" ), m3DRenderer->type() );
1585+
m3DRenderer->writeXml( renderer3DElem, context );
1586+
layerElement.appendChild( renderer3DElem );
1587+
}
1588+
}
1589+
1590+
1591+
void QgsMapLayer::readCommonStyle( const QDomElement &layerElement, const QgsReadWriteContext &context )
1592+
{
1593+
QgsAbstract3DRenderer *r3D = nullptr;
1594+
QDomElement renderer3DElem = layerElement.firstChildElement( QStringLiteral( "renderer-3d" ) );
1595+
if ( !renderer3DElem.isNull() )
1596+
{
1597+
QString type3D = renderer3DElem.attribute( QStringLiteral( "type" ) );
1598+
Qgs3DRendererAbstractMetadata *meta3D = QgsApplication::renderer3DRegistry()->rendererMetadata( type3D );
1599+
if ( meta3D )
1600+
{
1601+
r3D = meta3D->createRenderer( renderer3DElem, context );
1602+
}
1603+
}
1604+
setRenderer3D( r3D );
1605+
}
1606+
1607+
16001608
QUndoStack *QgsMapLayer::undoStack()
16011609
{
16021610
return &mUndoStack;

src/core/qgsmaplayer.h

+12
Original file line numberDiff line numberDiff line change
@@ -1095,6 +1095,18 @@ class CORE_EXPORT QgsMapLayer : public QObject
10951095
//! Write style manager's configuration (if exists). To be called by subclasses.
10961096
void writeStyleManager( QDomNode &layerNode, QDomDocument &doc ) const;
10971097

1098+
/**
1099+
* Write style data common to all layer types
1100+
* \since QGIS 3.0
1101+
*/
1102+
void writeCommonStyle( QDomElement &layerElement, QDomDocument &document, const QgsReadWriteContext &context ) const;
1103+
1104+
/**
1105+
* Read style data common to all layer types
1106+
* \since QGIS 3.0
1107+
*/
1108+
void readCommonStyle( const QDomElement &layerElement, const QgsReadWriteContext &context );
1109+
10981110
#ifndef SIP_RUN
10991111
#if 0
11001112
//! Debugging member - invoked when a connect() is made to this object

src/core/qgsvectorlayer.cpp

+7
Original file line numberDiff line numberDiff line change
@@ -1712,6 +1712,9 @@ bool QgsVectorLayer::readSymbology( const QDomNode &layerNode, QString &errorMes
17121712

17131713
updateFields();
17141714

1715+
QDomElement layerElement = layerNode.toElement();
1716+
readCommonStyle( layerElement, context );
1717+
17151718
readStyle( layerNode, errorMessage, context );
17161719

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

2058+
20552059
bool QgsVectorLayer::writeSymbology( QDomNode &node, QDomDocument &doc, QString &errorMessage, const QgsReadWriteContext &context ) const
20562060
{
2061+
QDomElement layerElement = node.toElement();
2062+
writeCommonStyle( layerElement, doc, context );
2063+
20572064
( void )writeStyle( node, doc, errorMessage, context );
20582065

20592066
QDomElement fieldConfigurationElement = doc.createElement( QStringLiteral( "fieldConfiguration" ) );

src/core/raster/qgsrasterlayer.cpp

+6-2
Original file line numberDiff line numberDiff line change
@@ -1294,9 +1294,11 @@ QImage QgsRasterLayer::previewAsImage( QSize size, const QColor &bgColor, QImage
12941294
bool QgsRasterLayer::readSymbology( const QDomNode &layer_node, QString &errorMessage, const QgsReadWriteContext &context )
12951295
{
12961296
Q_UNUSED( errorMessage );
1297-
Q_UNUSED( context );
12981297
QDomElement rasterRendererElem;
12991298

1299+
QDomElement layerElement = layer_node.toElement();
1300+
readCommonStyle( layerElement, context );
1301+
13001302
// pipe element was introduced in the end of 1.9 development when there were
13011303
// already many project files in use so we support 1.9 backward compatibility
13021304
// even it was never officially released -> use pipe element if present, otherwise
@@ -1536,7 +1538,9 @@ bool QgsRasterLayer::readXml( const QDomNode &layer_node, const QgsReadWriteCont
15361538
bool QgsRasterLayer::writeSymbology( QDomNode &layer_node, QDomDocument &document, QString &errorMessage, const QgsReadWriteContext &context ) const
15371539
{
15381540
Q_UNUSED( errorMessage );
1539-
Q_UNUSED( context );
1541+
1542+
QDomElement layerElement = layer_node.toElement();
1543+
writeCommonStyle( layerElement, document, context );
15401544

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

0 commit comments

Comments
 (0)