diff --git a/python/core/auto_additions/qgsmaplayerstyle.py b/python/core/auto_additions/qgsmaplayerstyle.py new file mode 100644 index 00000000000..f54782b4ef0 --- /dev/null +++ b/python/core/auto_additions/qgsmaplayerstyle.py @@ -0,0 +1,4 @@ +# The following has been generated automatically from src/core/qgsmaplayerstyle.h +QgsMapLayerStyle.StyleCategory.baseClass = QgsMapLayerStyle +QgsMapLayerStyle.StyleCategories.baseClass = QgsMapLayerStyle +StyleCategories = QgsMapLayerStyle # dirty hack since SIP seems to introduce the flags in module diff --git a/python/core/auto_generated/mesh/qgsmeshlayer.sip.in b/python/core/auto_generated/mesh/qgsmeshlayer.sip.in index a226e6a43d1..5fdc6110e42 100644 --- a/python/core/auto_generated/mesh/qgsmeshlayer.sip.in +++ b/python/core/auto_generated/mesh/qgsmeshlayer.sip.in @@ -109,10 +109,10 @@ QgsMeshLayer cannot be copied. virtual QgsMapLayerRenderer *createMapRenderer( QgsRenderContext &rendererContext ) /Factory/; - virtual bool readSymbology( const QDomNode &node, QString &errorMessage, QgsReadWriteContext &context ); - - virtual bool writeSymbology( QDomNode &node, QDomDocument &doc, QString &errorMessage, const QgsReadWriteContext &context ) const; - + virtual bool readSymbology( const QDomNode &node, QString &errorMessage, + QgsReadWriteContext &context, QgsMapLayerStyle::StyleCategories categories = QgsMapLayerStyle::All ); + virtual bool writeSymbology( QDomNode &node, QDomDocument &doc, QString &errorMessage, + const QgsReadWriteContext &context, QgsMapLayerStyle::StyleCategories categories = QgsMapLayerStyle::All ) const; virtual QString encodedSource( const QString &source, const QgsReadWriteContext &context ) const; virtual QString decodedSource( const QString &source, const QString &provider, const QgsReadWriteContext &context ) const; diff --git a/python/core/auto_generated/qgsmaplayer.sip.in b/python/core/auto_generated/qgsmaplayer.sip.in index 463817a3475..8458d921379 100644 --- a/python/core/auto_generated/qgsmaplayer.sip.in +++ b/python/core/auto_generated/qgsmaplayer.sip.in @@ -503,8 +503,8 @@ Sets state from Dom document The Dom node corresponds to a Dom document project file XML element read by :py:class:`QgsProject`. -This, in turn, calls readXml(), which is over-rideable by sub-classes so -that they can read their own specific state from the given Dom node. +This, in turn, calls readXml() (and then readSymbology()), which is over-rideable +by sub-classes so that they can read their own specific state from the given Dom node. Invoked by :py:func:`QgsProject.read()` @@ -523,8 +523,8 @@ Stores state in Dom node The Dom node corresponds to a Dom document project file XML element to be written by :py:class:`QgsProject`. -This, in turn, calls writeXml(), which is over-rideable by sub-classes so -that they can write their own specific state to the given Dom node. +This, in turn, calls writeXml() (and then writeSymbology), which is over-rideable +by sub-classes so that they can write their own specific state to the given Dom node. Invoked by :py:func:`QgsProject.write()` @@ -783,7 +783,8 @@ Import the properties of this layer from a QDomDocument .. versionadded:: 2.8 %End - virtual void exportNamedStyle( QDomDocument &doc, QString &errorMsg /Out/ ) const; + virtual void exportNamedStyle( QDomDocument &doc, QString &errorMsg /Out/, QgsReadWriteContext &context, + QgsMapLayerStyle::StyleCategories categories = QgsMapLayerStyle::All ) const; %Docstring Export the properties of this layer as named style in a QDomDocument @@ -865,7 +866,8 @@ Attempts to style the layer using the formatting from an SLD type file. - virtual bool readSymbology( const QDomNode &node, QString &errorMessage, QgsReadWriteContext &context ) = 0; + virtual bool readSymbology( const QDomNode &node, QString &errorMessage, + QgsReadWriteContext &context, QgsMapLayerStyle::StyleCategories categories = QgsMapLayerStyle::All ) = 0; %Docstring Read the symbology for the current layer from the Dom node supplied. @@ -876,7 +878,8 @@ Read the symbology for the current layer from the Dom node supplied. :return: true in case of success. %End - virtual bool readStyle( const QDomNode &node, QString &errorMessage, QgsReadWriteContext &context ); + virtual bool readStyle( const QDomNode &node, QString &errorMessage, + QgsReadWriteContext &context, QgsMapLayerStyle::StyleCategories categories = QgsMapLayerStyle::All ); %Docstring Read the style for the current layer from the Dom node supplied. @@ -893,21 +896,27 @@ Read the style for the current layer from the Dom node supplied. .. versionadded:: 2.16 %End - virtual bool writeSymbology( QDomNode &node, QDomDocument &doc, QString &errorMessage, const QgsReadWriteContext &context ) const = 0; + virtual bool writeSymbology( QDomNode &node, QDomDocument &doc, QString &errorMessage, const QgsReadWriteContext &context, + QgsMapLayerStyle::StyleCategories categories = QgsMapLayerStyle::All ) const = 0; %Docstring -Write the symbology for the layer into the docment provided. +Write the style for the layer into the docment provided. :param node: the node that will have the style element added to it. :param doc: the document that will have the QDomNode added. :param errorMessage: reference to string that will be updated with any error messages :param context: writing context (used for transform from absolute to relative paths) +.. note:: + + There is a confusion of terms with the GUI. This method actually writes what is called a style in the application. + :return: true in case of success. %End - virtual bool writeStyle( QDomNode &node, QDomDocument &doc, QString &errorMessage, const QgsReadWriteContext &context ) const; + virtual bool writeStyle( QDomNode &node, QDomDocument &doc, QString &errorMessage, const QgsReadWriteContext &context, + QgsMapLayerStyle::StyleCategories categories = QgsMapLayerStyle::All ) const; %Docstring -Write just the style information for the layer into the document +Write just the symbology information for the layer into the document :param node: the node that will have the style element added to it. :param doc: the document that will have the QDomNode added. @@ -920,6 +929,10 @@ Write just the style information for the layer into the document To be implemented in subclasses. Default implementation does nothing and returns false. +.. note:: + + There is a confusion of terms with the GUI. This method actually writes what is known as the symbology in the application. + .. versionadded:: 2.16 %End @@ -1475,14 +1488,17 @@ 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; + void writeCommonStyle( QDomElement &layerElement, QDomDocument &document, + const QgsReadWriteContext &context, + QgsMapLayerStyle::StyleCategories categories = QgsMapLayerStyle::All ) const; %Docstring Write style data common to all layer types .. versionadded:: 3.0 %End - void readCommonStyle( const QDomElement &layerElement, const QgsReadWriteContext &context ); + void readCommonStyle( const QDomElement &layerElement, const QgsReadWriteContext &context, + QgsMapLayerStyle::StyleCategories categories = QgsMapLayerStyle::All ); %Docstring Read style data common to all layer types diff --git a/python/core/auto_generated/qgsmaplayerstyle.sip.in b/python/core/auto_generated/qgsmaplayerstyle.sip.in index a4f7361344d..c00800cc5f5 100644 --- a/python/core/auto_generated/qgsmaplayerstyle.sip.in +++ b/python/core/auto_generated/qgsmaplayerstyle.sip.in @@ -26,6 +26,27 @@ only possible to read or write layer's current style. #include "qgsmaplayerstyle.h" %End public: + static const QMetaObject staticMetaObject; + + public: + + enum StyleCategory + { + LayerConfiguration, + Symbology, + Labels, + Fields, + Forms, + Actions, + Tooltips, + Diagrams, + AttributeTable, + Rendering, + CustomProperties, + All + }; + typedef QFlags StyleCategories; + QgsMapLayerStyle(); %Docstring @@ -72,6 +93,9 @@ Write style configuration (for project file writing) }; +QFlags operator|(QgsMapLayerStyle::StyleCategory f1, QFlags f2); + + class QgsMapLayerStyleOverride { diff --git a/python/core/auto_generated/qgsvectorlayer.sip.in b/python/core/auto_generated/qgsvectorlayer.sip.in index 6175700e430..df02ee796d4 100644 --- a/python/core/auto_generated/qgsvectorlayer.sip.in +++ b/python/core/auto_generated/qgsvectorlayer.sip.in @@ -870,8 +870,8 @@ Returns the current auxiliary layer. %End - virtual bool readSymbology( const QDomNode &layerNode, QString &errorMessage, QgsReadWriteContext &context ); - + virtual bool readSymbology( const QDomNode &layerNode, QString &errorMessage, + QgsReadWriteContext &context, QgsMapLayerStyle::StyleCategories categories = QgsMapLayerStyle::All ); %Docstring Read the symbology for the current layer from the Dom node supplied. @@ -882,8 +882,8 @@ Read the symbology for the current layer from the Dom node supplied. :return: true in case of success. %End - virtual bool readStyle( const QDomNode &node, QString &errorMessage, QgsReadWriteContext &context ); - + virtual bool readStyle( const QDomNode &node, QString &errorMessage, + QgsReadWriteContext &context, QgsMapLayerStyle::StyleCategories categories = QgsMapLayerStyle::All ); %Docstring Read the style for the current layer from the Dom node supplied. @@ -894,8 +894,8 @@ Read the style for the current layer from the Dom node supplied. :return: true in case of success. %End - virtual bool writeSymbology( QDomNode &node, QDomDocument &doc, QString &errorMessage, const QgsReadWriteContext &context ) const; - + virtual bool writeSymbology( QDomNode &node, QDomDocument &doc, QString &errorMessage, + const QgsReadWriteContext &context, QgsMapLayerStyle::StyleCategories categories = QgsMapLayerStyle::All ) const; %Docstring Write the symbology for the layer into the docment provided. @@ -907,8 +907,8 @@ Write the symbology for the layer into the docment provided. :return: true in case of success. %End - virtual bool writeStyle( QDomNode &node, QDomDocument &doc, QString &errorMessage, const QgsReadWriteContext &context ) const; - + virtual bool writeStyle( QDomNode &node, QDomDocument &doc, QString &errorMessage, + const QgsReadWriteContext &context, QgsMapLayerStyle::StyleCategories categories = QgsMapLayerStyle::All ) const; %Docstring Write just the style information for the layer into the document diff --git a/python/core/auto_generated/raster/qgsrasterlayer.sip.in b/python/core/auto_generated/raster/qgsrasterlayer.sip.in index e34414e314a..8e24194ed59 100644 --- a/python/core/auto_generated/raster/qgsrasterlayer.sip.in +++ b/python/core/auto_generated/raster/qgsrasterlayer.sip.in @@ -348,16 +348,16 @@ Draws a preview of the rasterlayer into a QImage void showStatusMessage( const QString &message ); protected: - virtual bool readSymbology( const QDomNode &node, QString &errorMessage, QgsReadWriteContext &context ); + virtual bool readSymbology( const QDomNode &node, QString &errorMessage, QgsReadWriteContext &context, QgsMapLayerStyle::StyleCategories categories = QgsMapLayerStyle::All ); - virtual bool readStyle( const QDomNode &node, QString &errorMessage, QgsReadWriteContext &context ); + virtual bool readStyle( const QDomNode &node, QString &errorMessage, QgsReadWriteContext &context, QgsMapLayerStyle::StyleCategories categories = QgsMapLayerStyle::All ); virtual bool readXml( const QDomNode &layer_node, QgsReadWriteContext &context ); - virtual bool writeSymbology( QDomNode &, QDomDocument &doc, QString &errorMessage, const QgsReadWriteContext &context ) const; - - virtual bool writeStyle( QDomNode &node, QDomDocument &doc, QString &errorMessage, const QgsReadWriteContext &context ) const; - + virtual bool writeSymbology( QDomNode &, QDomDocument &doc, QString &errorMessage, + const QgsReadWriteContext &context, QgsMapLayerStyle::StyleCategories categories = QgsMapLayerStyle::All ) const; + virtual bool writeStyle( QDomNode &node, QDomDocument &doc, QString &errorMessage, + const QgsReadWriteContext &context, QgsMapLayerStyle::StyleCategories categories = QgsMapLayerStyle::All ) const; virtual bool writeXml( QDomNode &layer_node, QDomDocument &doc, const QgsReadWriteContext &context ) const; virtual QString encodedSource( const QString &source, const QgsReadWriteContext &context ) const; diff --git a/src/app/qgisapp.cpp b/src/app/qgisapp.cpp index 6376fbd826b..5ecd25ea400 100644 --- a/src/app/qgisapp.cpp +++ b/src/app/qgisapp.cpp @@ -8855,7 +8855,8 @@ void QgisApp::copyStyle( QgsMapLayer *sourceLayer ) { QString errorMsg; QDomDocument doc( QStringLiteral( "qgis" ) ); - selectionLayer->exportNamedStyle( doc, errorMsg ); + QgsReadWriteContext context; + selectionLayer->exportNamedStyle( doc, errorMsg, context ); if ( !errorMsg.isEmpty() ) @@ -9730,7 +9731,8 @@ void QgisApp::duplicateLayers( const QList &lyrList ) // duplicate the layer style QString errMsg; QDomDocument style; - selectedLyr->exportNamedStyle( style, errMsg ); + QgsReadWriteContext context; + selectedLyr->exportNamedStyle( style, errMsg, context ); if ( errMsg.isEmpty() ) dupLayer->importNamedStyle( style, errMsg ); if ( !errMsg.isEmpty() ) diff --git a/src/core/mesh/qgsmeshlayer.cpp b/src/core/mesh/qgsmeshlayer.cpp index ec08cee9912..96918156122 100644 --- a/src/core/mesh/qgsmeshlayer.cpp +++ b/src/core/mesh/qgsmeshlayer.cpp @@ -242,10 +242,12 @@ QgsMapLayerRenderer *QgsMeshLayer::createMapRenderer( QgsRenderContext &renderer return new QgsMeshLayerRenderer( this, rendererContext ); } -bool QgsMeshLayer::readSymbology( const QDomNode &node, QString &errorMessage, QgsReadWriteContext &context ) +bool QgsMeshLayer::readSymbology( const QDomNode &node, QString &errorMessage, + QgsReadWriteContext &context, QgsMapLayerStyle::StyleCategories categories ) { Q_UNUSED( errorMessage ); Q_UNUSED( context ); + Q_UNUSED( categories ); QDomElement elem = node.toElement(); QDomElement elemRendererSettings = elem.firstChildElement( "mesh-renderer-settings" ); @@ -255,10 +257,12 @@ bool QgsMeshLayer::readSymbology( const QDomNode &node, QString &errorMessage, Q return true; } -bool QgsMeshLayer::writeSymbology( QDomNode &node, QDomDocument &doc, QString &errorMessage, const QgsReadWriteContext &context ) const +bool QgsMeshLayer::writeSymbology( QDomNode &node, QDomDocument &doc, QString &errorMessage, + const QgsReadWriteContext &context, QgsMapLayerStyle::StyleCategories categories ) const { Q_UNUSED( errorMessage ); Q_UNUSED( context ); + Q_UNUSED( categories ); QDomElement elem = node.toElement(); QDomElement elemRendererSettings = mRendererSettings.writeXml( doc ); diff --git a/src/core/mesh/qgsmeshlayer.h b/src/core/mesh/qgsmeshlayer.h index 9752bbae339..b61b0fd6394 100644 --- a/src/core/mesh/qgsmeshlayer.h +++ b/src/core/mesh/qgsmeshlayer.h @@ -125,8 +125,10 @@ class CORE_EXPORT QgsMeshLayer : public QgsMapLayer QgsMeshLayer *clone() const override SIP_FACTORY; QgsRectangle extent() const override; QgsMapLayerRenderer *createMapRenderer( QgsRenderContext &rendererContext ) override SIP_FACTORY; - bool readSymbology( const QDomNode &node, QString &errorMessage, QgsReadWriteContext &context ) override; - bool writeSymbology( QDomNode &node, QDomDocument &doc, QString &errorMessage, const QgsReadWriteContext &context ) const override; + bool readSymbology( const QDomNode &node, QString &errorMessage, + QgsReadWriteContext &context, QgsMapLayerStyle::StyleCategories categories = QgsMapLayerStyle::All ) override; + bool writeSymbology( QDomNode &node, QDomDocument &doc, QString &errorMessage, + const QgsReadWriteContext &context, QgsMapLayerStyle::StyleCategories categories = QgsMapLayerStyle::All ) const override; QString encodedSource( const QString &source, const QgsReadWriteContext &context ) const override; QString decodedSource( const QString &source, const QString &provider, const QgsReadWriteContext &context ) const override; bool readXml( const QDomNode &layer_node, QgsReadWriteContext &context ) override; diff --git a/src/core/qgsmaplayer.cpp b/src/core/qgsmaplayer.cpp index a26aca59249..c7593d82bcc 100644 --- a/src/core/qgsmaplayer.cpp +++ b/src/core/qgsmaplayer.cpp @@ -220,7 +220,7 @@ QPainter::CompositionMode QgsMapLayer::blendMode() const } -bool QgsMapLayer::readLayerXml( const QDomElement &layerElement, QgsReadWriteContext &context ) +bool QgsMapLayer::readLayerXml( const QDomElement &layerElement, QgsReadWriteContext &context ) { bool layerError; @@ -270,10 +270,6 @@ bool QgsMapLayer::readLayerXml( const QDomElement &layerElement, QgsReadWriteCo savedValidation = QgsCoordinateReferenceSystem::customCrsValidation(); QgsCoordinateReferenceSystem::setCustomCrsValidation( nullptr ); - // read custom properties before passing reading further to a subclass, so that - // the subclass can also read custom properties - readCustomProperties( layerElement ); - QgsReadWriteContextCategoryPopper p = context.enterCategory( tr( "Layer" ), mne.text() ); // now let the children grab what they need from the Dom node. @@ -306,20 +302,6 @@ bool QgsMapLayer::readLayerXml( const QDomElement &layerElement, QgsReadWriteCo } } - // use scale dependent visibility flag - setScaleBasedVisibility( layerElement.attribute( QStringLiteral( "hasScaleBasedVisibilityFlag" ) ).toInt() == 1 ); - if ( layerElement.hasAttribute( QStringLiteral( "minimumScale" ) ) ) - { - // older element, when scales were reversed - setMaximumScale( layerElement.attribute( QStringLiteral( "minimumScale" ) ).toDouble() ); - setMinimumScale( layerElement.attribute( QStringLiteral( "maximumScale" ) ).toDouble() ); - } - else - { - setMaximumScale( layerElement.attribute( QStringLiteral( "maxScale" ) ).toDouble() ); - setMinimumScale( layerElement.attribute( QStringLiteral( "minScale" ) ).toDouble() ); - } - setAutoRefreshInterval( layerElement.attribute( QStringLiteral( "autoRefreshTime" ), QStringLiteral( "0" ) ).toInt() ); setAutoRefreshEnabled( layerElement.attribute( QStringLiteral( "autoRefreshEnabled" ), QStringLiteral( "0" ) ).toInt() ); setRefreshOnNofifyMessage( layerElement.attribute( QStringLiteral( "refreshOnNotifyMessage" ), QString() ) ); @@ -403,25 +385,6 @@ bool QgsMapLayer::readLayerXml( const QDomElement &layerElement, QgsReadWriteCo QDomElement metadataElem = layerElement.firstChildElement( QStringLiteral( "resourceMetadata" ) ); mMetadata.readMetadataXml( metadataElem ); - // flags - QDomElement flagsElem = layerElement.firstChildElement( QStringLiteral( "flags" ) ); - QMetaEnum metaEnum = QMetaEnum::fromType(); - LayerFlags flags = mFlags; - for ( int idx = 0; idx < metaEnum.keyCount(); ++idx ) - { - const char *enumKey = metaEnum.key( idx ); - QDomNode flagNode = flagsElem.namedItem( QString( enumKey ) ); - if ( flagNode.isNull() ) - continue; - bool flagValue = flagNode.toElement().text() == "1" ? true : false; - QgsMapLayer::LayerFlag enumValue = static_cast( metaEnum.keyToValue( enumKey ) ); - if ( flags.testFlag( enumValue ) && !flagValue ) - flags &= ~enumValue; - else if ( !flags.testFlag( enumValue ) && flagValue ) - flags |= enumValue; - } - setFlags( flags ); - return true; } // bool QgsMapLayer::readLayerXML @@ -436,14 +399,8 @@ bool QgsMapLayer::readXml( const QDomNode &layer_node, QgsReadWriteContext &cont } // void QgsMapLayer::readXml - bool QgsMapLayer::writeLayerXml( QDomElement &layerElement, QDomDocument &document, const QgsReadWriteContext &context ) const { - // use scale dependent visibility flag - layerElement.setAttribute( QStringLiteral( "hasScaleBasedVisibilityFlag" ), hasScaleBasedVisibility() ? 1 : 0 ); - layerElement.setAttribute( QStringLiteral( "maxScale" ), QString::number( maximumScale() ) ); - layerElement.setAttribute( QStringLiteral( "minScale" ), QString::number( minimumScale() ) ); - if ( !extent().isNull() ) { layerElement.appendChild( QgsXmlUtils::writeRectangle( mExtent, document ) ); @@ -587,27 +544,52 @@ bool QgsMapLayer::writeLayerXml( QDomElement &layerElement, QDomDocument &docume mMetadata.writeMetadataXml( myMetadataElem, document ); layerElement.appendChild( myMetadataElem ); - // flags - // this code is saving automatically all the flags entries - QDomElement layerFlagsElem = document.createElement( QStringLiteral( "flags" ) ); - QMetaEnum metaEnum = QMetaEnum::fromType(); - for ( int idx = 0; idx < metaEnum.keyCount(); ++idx ) - { - const char *enumKey = metaEnum.key( idx ); - QgsMapLayer::LayerFlag enumValue = static_cast( metaEnum.keyToValue( enumKey ) ); - bool flagValue = mFlags.testFlag( enumValue ); - QDomElement flagElem = document.createElement( enumKey ); - flagElem.appendChild( document.createTextNode( QString::number( flagValue ) ) ); - layerFlagsElem.appendChild( flagElem ); - } - layerElement.appendChild( layerFlagsElem ); - // now append layer node to map layer node - - writeCustomProperties( layerElement, document ); - return writeXml( layerElement, document, context ); +} +void QgsMapLayer::writeCommonStyle( QDomElement &layerElement, QDomDocument &document, + const QgsReadWriteContext &context, QgsMapLayerStyle::StyleCategories categories ) const +{ + if ( categories.testFlag( QgsMapLayerStyle::Rendering ) ) + { + // use scale dependent visibility flag + layerElement.setAttribute( QStringLiteral( "hasScaleBasedVisibilityFlag" ), hasScaleBasedVisibility() ? 1 : 0 ); + layerElement.setAttribute( QStringLiteral( "maxScale" ), QString::number( maximumScale() ) ); + layerElement.setAttribute( QStringLiteral( "minScale" ), QString::number( minimumScale() ) ); + } + + if ( m3DRenderer ) + { + QDomElement renderer3DElem = document.createElement( QStringLiteral( "renderer-3d" ) ); + renderer3DElem.setAttribute( QStringLiteral( "type" ), m3DRenderer->type() ); + m3DRenderer->writeXml( renderer3DElem, context ); + layerElement.appendChild( renderer3DElem ); + } + + if ( categories.testFlag( QgsMapLayerStyle::LayerConfiguration ) ) + { + // flags + // this code is saving automatically all the flags entries + QDomElement layerFlagsElem = document.createElement( QStringLiteral( "flags" ) ); + QMetaEnum metaEnum = QMetaEnum::fromType(); + for ( int idx = 0; idx < metaEnum.keyCount(); ++idx ) + { + const char *enumKey = metaEnum.key( idx ); + QgsMapLayer::LayerFlag enumValue = static_cast( metaEnum.keyToValue( enumKey ) ); + bool flagValue = mFlags.testFlag( enumValue ); + QDomElement flagElem = document.createElement( enumKey ); + flagElem.appendChild( document.createTextNode( QString::number( flagValue ) ) ); + layerFlagsElem.appendChild( flagElem ); + } + layerElement.appendChild( layerFlagsElem ); + } + + // custom properties + if ( categories.testFlag( QgsMapLayerStyle::CustomProperties ) ) + { + writeCustomProperties( layerElement, document ); + } } @@ -1120,7 +1102,7 @@ void QgsMapLayer::exportNamedMetadata( QDomDocument &doc, QString &errorMsg ) co doc = myDocument; } -void QgsMapLayer::exportNamedStyle( QDomDocument &doc, QString &errorMsg ) const +void QgsMapLayer::exportNamedStyle( QDomDocument &doc, QString &errorMsg, QgsReadWriteContext &context, QgsMapLayerStyle::StyleCategories categories ) const { QDomImplementation DomImplementation; QDomDocumentType documentType = DomImplementation.createDocumentType( QStringLiteral( "qgis" ), QStringLiteral( "http://mrcc.com/qgis.dtd" ), QStringLiteral( "SYSTEM" ) ); @@ -1130,11 +1112,7 @@ void QgsMapLayer::exportNamedStyle( QDomDocument &doc, QString &errorMsg ) const myRootNode.setAttribute( QStringLiteral( "version" ), Qgis::QGIS_VERSION ); myDocument.appendChild( myRootNode ); - myRootNode.setAttribute( QStringLiteral( "hasScaleBasedVisibilityFlag" ), hasScaleBasedVisibility() ? 1 : 0 ); - myRootNode.setAttribute( QStringLiteral( "maxScale" ), QString::number( maximumScale() ) ); - myRootNode.setAttribute( QStringLiteral( "minScale" ), QString::number( minimumScale() ) ); - - if ( !writeSymbology( myRootNode, myDocument, errorMsg, QgsReadWriteContext() ) ) // TODO: support relative paths in QML? + if ( !writeSymbology( myRootNode, myDocument, errorMsg, QgsReadWriteContext(), categories ) ) // TODO: support relative paths in QML? { errorMsg = QObject::tr( "Could not save symbology because:\n%1" ).arg( errorMsg ); return; @@ -1215,7 +1193,8 @@ QString QgsMapLayer::saveNamedProperty( const QString &uri, QgsMapLayer::Propert break; case Style: - exportNamedStyle( myDocument, myErrorMessage ); + QgsReadWriteContext context; + exportNamedStyle( myDocument, myErrorMessage, context ); break; } @@ -1579,7 +1558,7 @@ QString QgsMapLayer::loadSldStyle( const QString &uri, bool &resultFlag ) return QString(); } -bool QgsMapLayer::readStyle( const QDomNode &node, QString &errorMessage, QgsReadWriteContext &context ) +bool QgsMapLayer::readStyle( const QDomNode &node, QString &errorMessage, QgsReadWriteContext &context, QgsMapLayerStyle::StyleCategories categories ) { Q_UNUSED( node ); Q_UNUSED( errorMessage ); @@ -1587,7 +1566,8 @@ bool QgsMapLayer::readStyle( const QDomNode &node, QString &errorMessage, QgsRea return false; } -bool QgsMapLayer::writeStyle( QDomNode &node, QDomDocument &doc, QString &errorMessage, const QgsReadWriteContext &context ) const +bool QgsMapLayer::writeStyle( QDomNode &node, QDomDocument &doc, QString &errorMessage, + const QgsReadWriteContext &context, QgsMapLayerStyle::StyleCategories categories ) const { Q_UNUSED( node ); Q_UNUSED( doc ); @@ -1596,19 +1576,8 @@ bool QgsMapLayer::writeStyle( QDomNode &node, QDomDocument &doc, QString &errorM return false; } - -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 ) +void QgsMapLayer::readCommonStyle( const QDomElement &layerElement, const QgsReadWriteContext &context, + QgsMapLayerStyle::StyleCategories categories ) { QgsAbstract3DRenderer *r3D = nullptr; QDomElement renderer3DElem = layerElement.firstChildElement( QStringLiteral( "renderer-3d" ) ); @@ -1622,6 +1591,43 @@ void QgsMapLayer::readCommonStyle( const QDomElement &layerElement, const QgsRea } } setRenderer3D( r3D ); + + // read custom properties before passing reading further to a subclass, so that + // the subclass can also read custom properties + readCustomProperties( layerElement ); + + // use scale dependent visibility flag + setScaleBasedVisibility( layerElement.attribute( QStringLiteral( "hasScaleBasedVisibilityFlag" ) ).toInt() == 1 ); + if ( layerElement.hasAttribute( QStringLiteral( "minimumScale" ) ) ) + { + // older element, when scales were reversed + setMaximumScale( layerElement.attribute( QStringLiteral( "minimumScale" ) ).toDouble() ); + setMinimumScale( layerElement.attribute( QStringLiteral( "maximumScale" ) ).toDouble() ); + } + else + { + setMaximumScale( layerElement.attribute( QStringLiteral( "maxScale" ) ).toDouble() ); + setMinimumScale( layerElement.attribute( QStringLiteral( "minScale" ) ).toDouble() ); + } + + // flags + QDomElement flagsElem = layerElement.firstChildElement( QStringLiteral( "flags" ) ); + QMetaEnum metaEnum = QMetaEnum::fromType(); + LayerFlags flags = mFlags; + for ( int idx = 0; idx < metaEnum.keyCount(); ++idx ) + { + const char *enumKey = metaEnum.key( idx ); + QDomNode flagNode = flagsElem.namedItem( QString( enumKey ) ); + if ( flagNode.isNull() ) + continue; + bool flagValue = flagNode.toElement().text() == "1" ? true : false; + QgsMapLayer::LayerFlag enumValue = static_cast( metaEnum.keyToValue( enumKey ) ); + if ( flags.testFlag( enumValue ) && !flagValue ) + flags &= ~enumValue; + else if ( !flags.testFlag( enumValue ) && flagValue ) + flags |= enumValue; + } + setFlags( flags ); } QUndoStack *QgsMapLayer::undoStack() diff --git a/src/core/qgsmaplayer.h b/src/core/qgsmaplayer.h index 77d4ebbe863..b8f3bd6720f 100644 --- a/src/core/qgsmaplayer.h +++ b/src/core/qgsmaplayer.h @@ -35,6 +35,7 @@ #include "qgsrendercontext.h" #include "qgsmaplayerdependency.h" #include "qgslayermetadata.h" +#include "qgsmaplayerstyle.h" class QgsAbstract3DRenderer; class QgsDataProvider; @@ -489,19 +490,19 @@ class CORE_EXPORT QgsMapLayer : public QObject /** * Sets state from Dom document - \param layerElement The Dom element corresponding to ``maplayer'' tag - \param context writing context (e.g. for conversion between relative and absolute paths) - \note - - The Dom node corresponds to a Dom document project file XML element read - by QgsProject. - - This, in turn, calls readXml(), which is over-rideable by sub-classes so - that they can read their own specific state from the given Dom node. - - Invoked by QgsProject::read(). - - \returns true if successful + * \param layerElement The Dom element corresponding to ``maplayer'' tag + * \param context writing context (e.g. for conversion between relative and absolute paths) + * \note + * + * The Dom node corresponds to a Dom document project file XML element read + * by QgsProject. + * + * This, in turn, calls readXml() (and then readSymbology()), which is over-rideable + * by sub-classes so that they can read their own specific state from the given Dom node. + * + * Invoked by QgsProject::read(). + * + * \returns true if successful */ bool readLayerXml( const QDomElement &layerElement, QgsReadWriteContext &context ); @@ -515,8 +516,8 @@ class CORE_EXPORT QgsMapLayer : public QObject * The Dom node corresponds to a Dom document project file XML element to be * written by QgsProject. * - * This, in turn, calls writeXml(), which is over-rideable by sub-classes so - * that they can write their own specific state to the given Dom node. + * This, in turn, calls writeXml() (and then writeSymbology), which is over-rideable + * by sub-classes so that they can write their own specific state to the given Dom node. * * Invoked by QgsProject::write(). * @@ -736,7 +737,8 @@ class CORE_EXPORT QgsMapLayer : public QObject * \param errorMsg this QString will be initialized on error * during the execution of writeSymbology */ - virtual void exportNamedStyle( QDomDocument &doc, QString &errorMsg SIP_OUT ) const; + virtual void exportNamedStyle( QDomDocument &doc, QString &errorMsg SIP_OUT, QgsReadWriteContext &context, + QgsMapLayerStyle::StyleCategories categories = QgsMapLayerStyle::All ) const; /** @@ -806,7 +808,8 @@ class CORE_EXPORT QgsMapLayer : public QObject * \param context reading context (used for transform from relative to absolute paths) * \returns true in case of success. */ - virtual bool readSymbology( const QDomNode &node, QString &errorMessage, QgsReadWriteContext &context ) = 0; + virtual bool readSymbology( const QDomNode &node, QString &errorMessage, + QgsReadWriteContext &context, QgsMapLayerStyle::StyleCategories categories = QgsMapLayerStyle::All ) = 0; /** * Read the style for the current layer from the Dom node supplied. @@ -817,29 +820,34 @@ class CORE_EXPORT QgsMapLayer : public QObject * \note To be implemented in subclasses. Default implementation does nothing and returns false. * \since QGIS 2.16 */ - virtual bool readStyle( const QDomNode &node, QString &errorMessage, QgsReadWriteContext &context ); + virtual bool readStyle( const QDomNode &node, QString &errorMessage, + QgsReadWriteContext &context, QgsMapLayerStyle::StyleCategories categories = QgsMapLayerStyle::All ); /** - * Write the symbology for the layer into the docment provided. + * Write the style for the layer into the docment provided. * \param node the node that will have the style element added to it. * \param doc the document that will have the QDomNode added. * \param errorMessage reference to string that will be updated with any error messages * \param context writing context (used for transform from absolute to relative paths) + * \note There is a confusion of terms with the GUI. This method actually writes what is called a style in the application. * \returns true in case of success. */ - virtual bool writeSymbology( QDomNode &node, QDomDocument &doc, QString &errorMessage, const QgsReadWriteContext &context ) const = 0; + virtual bool writeSymbology( QDomNode &node, QDomDocument &doc, QString &errorMessage, const QgsReadWriteContext &context, + QgsMapLayerStyle::StyleCategories categories = QgsMapLayerStyle::All ) const = 0; /** - * Write just the style information for the layer into the document + * Write just the symbology information for the layer into the document * \param node the node that will have the style element added to it. * \param doc the document that will have the QDomNode added. * \param errorMessage reference to string that will be updated with any error messages * \param context writing context (used for transform from absolute to relative paths) * \returns true in case of success. * \note To be implemented in subclasses. Default implementation does nothing and returns false. + * \note There is a confusion of terms with the GUI. This method actually writes what is known as the symbology in the application. * \since QGIS 2.16 */ - virtual bool writeStyle( QDomNode &node, QDomDocument &doc, QString &errorMessage, const QgsReadWriteContext &context ) const; + virtual bool writeStyle( QDomNode &node, QDomDocument &doc, QString &errorMessage, const QgsReadWriteContext &context, + QgsMapLayerStyle::StyleCategories categories = QgsMapLayerStyle::All ) const; //! Returns pointer to layer's undo stack QUndoStack *undoStack(); @@ -1284,13 +1292,16 @@ class CORE_EXPORT QgsMapLayer : public QObject * Write style data common to all layer types * \since QGIS 3.0 */ - void writeCommonStyle( QDomElement &layerElement, QDomDocument &document, const QgsReadWriteContext &context ) const; + void writeCommonStyle( QDomElement &layerElement, QDomDocument &document, + const QgsReadWriteContext &context, + QgsMapLayerStyle::StyleCategories categories = QgsMapLayerStyle::All ) const; /** * Read style data common to all layer types * \since QGIS 3.0 */ - void readCommonStyle( const QDomElement &layerElement, const QgsReadWriteContext &context ); + void readCommonStyle( const QDomElement &layerElement, const QgsReadWriteContext &context, + QgsMapLayerStyle::StyleCategories categories = QgsMapLayerStyle::All ); #ifndef SIP_RUN #if 0 diff --git a/src/core/qgsmaplayerstyle.cpp b/src/core/qgsmaplayerstyle.cpp index ff45a845fe4..68d5353cc7c 100644 --- a/src/core/qgsmaplayerstyle.cpp +++ b/src/core/qgsmaplayerstyle.cpp @@ -15,6 +15,7 @@ #include "qgsmaplayerstyle.h" #include "qgsmaplayerstylemanager.h" +#include "qgsreadwritecontext.h" #include "qgslogger.h" @@ -46,7 +47,8 @@ void QgsMapLayerStyle::readFromLayer( QgsMapLayer *layer ) { QString errorMsg; QDomDocument doc; - layer->exportNamedStyle( doc, errorMsg ); + QgsReadWriteContext context; + layer->exportNamedStyle( doc, errorMsg, context ); if ( !errorMsg.isEmpty() ) { QgsDebugMsg( "Failed to export style from layer: " + errorMsg ); diff --git a/src/core/qgsmaplayerstyle.h b/src/core/qgsmaplayerstyle.h index 4d68c4af33f..fe784d019a0 100644 --- a/src/core/qgsmaplayerstyle.h +++ b/src/core/qgsmaplayerstyle.h @@ -18,7 +18,6 @@ #include "qgis_core.h" #include "qgis_sip.h" -#include "qgsmaplayer.h" #include #include @@ -27,6 +26,7 @@ class QDomElement; +class QgsMapLayer; /** * \ingroup core @@ -39,8 +39,33 @@ class QDomElement; */ class CORE_EXPORT QgsMapLayerStyle { + Q_GADGET public: + /** + * Categories of style to distinguish appropriate sections for import/export + * \since QGIS 3.4 + */ + enum StyleCategory + { + LayerConfiguration = 1 << 0, //!< Flags, + Symbology = 1 << 1, + Labels = 1 << 2, + Fields = 1 << 3, //!< Aliases, WMS/WFS, expressions, constraints, virtual fields + Forms = 1 << 4, + Actions = 1 << 5, + Tooltips = 1 << 6, + Diagrams = 1 << 2, + AttributeTable = 7 << 8, + Rendering = 1 << 9, //!< Scale visibility, simplify method + CustomProperties = 1 << 10, + All = LayerConfiguration | Symbology | Labels | Fields | Forms | Actions | + Tooltips | Diagrams | AttributeTable | Rendering | CustomProperties, + }; + Q_ENUM( StyleCategory ) + Q_DECLARE_FLAGS( StyleCategories, StyleCategory ) + Q_FLAG( StyleCategories ) + //! construct invalid style QgsMapLayerStyle() = default; @@ -70,6 +95,8 @@ class CORE_EXPORT QgsMapLayerStyle QString mXmlData; }; +Q_DECLARE_OPERATORS_FOR_FLAGS( QgsMapLayerStyle::StyleCategories ) + /** * \ingroup core diff --git a/src/core/qgsofflineediting.cpp b/src/core/qgsofflineediting.cpp index e941a68668b..b771cdfe7b4 100644 --- a/src/core/qgsofflineediting.cpp +++ b/src/core/qgsofflineediting.cpp @@ -968,7 +968,8 @@ void QgsOfflineEditing::copySymbology( QgsVectorLayer *sourceLayer, QgsVectorLay { QString error; QDomDocument doc; - sourceLayer->exportNamedStyle( doc, error ); + QgsReadWriteContext context; + sourceLayer->exportNamedStyle( doc, error, context ); if ( error.isEmpty() ) { diff --git a/src/core/qgsvectorlayer.cpp b/src/core/qgsvectorlayer.cpp index 0d09a49bae1..4eaa546e9cb 100644 --- a/src/core/qgsvectorlayer.cpp +++ b/src/core/qgsvectorlayer.cpp @@ -1857,8 +1857,11 @@ void QgsVectorLayer::resolveReferences( QgsProject *project ) } -bool QgsVectorLayer::readSymbology( const QDomNode &layerNode, QString &errorMessage, QgsReadWriteContext &context ) +bool QgsVectorLayer::readSymbology( const QDomNode &layerNode, QString &errorMessage, + QgsReadWriteContext &context, QgsMapLayerStyle::StyleCategories categories ) { + Q_UNUSED( categories ); + QgsReadWriteContextCategoryPopper p = context.enterCategory( tr( "Symbology" ) ); if ( !mExpressionFieldBuffer ) @@ -2076,8 +2079,10 @@ bool QgsVectorLayer::readSymbology( const QDomNode &layerNode, QString &errorMes return true; } -bool QgsVectorLayer::readStyle( const QDomNode &node, QString &errorMessage, QgsReadWriteContext &context ) +bool QgsVectorLayer::readStyle( const QDomNode &node, QString &errorMessage, QgsReadWriteContext &context, QgsMapLayerStyle::StyleCategories categories ) { + Q_UNUSED( categories ); + bool result = true; emit readCustomSymbology( node.toElement(), errorMessage ); @@ -2243,8 +2248,11 @@ bool QgsVectorLayer::readStyle( const QDomNode &node, QString &errorMessage, Qgs } -bool QgsVectorLayer::writeSymbology( QDomNode &node, QDomDocument &doc, QString &errorMessage, const QgsReadWriteContext &context ) const +bool QgsVectorLayer::writeSymbology( QDomNode &node, QDomDocument &doc, QString &errorMessage, + const QgsReadWriteContext &context, QgsMapLayerStyle::StyleCategories categories ) const { + Q_UNUSED( categories ); + QDomElement layerElement = node.toElement(); writeCommonStyle( layerElement, doc, context ); @@ -2391,8 +2399,10 @@ bool QgsVectorLayer::writeSymbology( QDomNode &node, QDomDocument &doc, QString return true; } -bool QgsVectorLayer::writeStyle( QDomNode &node, QDomDocument &doc, QString &errorMessage, const QgsReadWriteContext &context ) const +bool QgsVectorLayer::writeStyle( QDomNode &node, QDomDocument &doc, QString &errorMessage, + const QgsReadWriteContext &context, QgsMapLayerStyle::StyleCategories categories ) const { + Q_UNUSED( categories ); QDomElement mapLayerNode = node.toElement(); emit writeCustomSymbology( mapLayerNode, doc, errorMessage ); @@ -4251,7 +4261,10 @@ QString QgsVectorLayer::htmlMetadata() const // feature count QLocale locale = QLocale(); locale.setNumberOptions( locale.numberOptions() &= ~QLocale::NumberOption::OmitGroupSeparator ); - myMetadata += QStringLiteral( "" ) + tr( "Feature count" ) + QStringLiteral( "" ) + ( featureCount() == -1 ? tr( "unknown" ) : locale.toString( ( qlonglong )featureCount() ) ) + QStringLiteral( "\n" ); + myMetadata += QStringLiteral( "" ) + + tr( "Feature count" ) + QStringLiteral( "" ) + + ( featureCount() == -1 ? tr( "unknown" ) : locale.toString( static_cast( featureCount() ) ) ) + + QStringLiteral( "\n" ); // End Provider section myMetadata += QLatin1String( "\n

" ); @@ -4453,7 +4466,8 @@ void QgsVectorLayer::saveStyleToDatabase( const QString &name, const QString &de } QDomDocument qmlDocument, sldDocument; - this->exportNamedStyle( qmlDocument, msgError ); + QgsReadWriteContext context; + exportNamedStyle( qmlDocument, msgError, context ); if ( !msgError.isNull() ) { return; diff --git a/src/core/qgsvectorlayer.h b/src/core/qgsvectorlayer.h index 4ec28ce81f6..94b8baf8689 100644 --- a/src/core/qgsvectorlayer.h +++ b/src/core/qgsvectorlayer.h @@ -880,7 +880,8 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer, public QgsExpressionConte * \param context reading context (used for transform from relative to absolute paths) * \returns true in case of success. */ - bool readSymbology( const QDomNode &layerNode, QString &errorMessage, QgsReadWriteContext &context ) override; + bool readSymbology( const QDomNode &layerNode, QString &errorMessage, + QgsReadWriteContext &context, QgsMapLayerStyle::StyleCategories categories = QgsMapLayerStyle::All ) override; /** * Read the style for the current layer from the Dom node supplied. @@ -889,7 +890,8 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer, public QgsExpressionConte * \param context reading context (used for transform from relative to absolute paths) * \returns true in case of success. */ - bool readStyle( const QDomNode &node, QString &errorMessage, QgsReadWriteContext &context ) override; + bool readStyle( const QDomNode &node, QString &errorMessage, + QgsReadWriteContext &context, QgsMapLayerStyle::StyleCategories categories = QgsMapLayerStyle::All ) override; /** * Write the symbology for the layer into the docment provided. @@ -899,7 +901,8 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer, public QgsExpressionConte * \param context writing context (used for transform from absolute to relative paths) * \returns true in case of success. */ - bool writeSymbology( QDomNode &node, QDomDocument &doc, QString &errorMessage, const QgsReadWriteContext &context ) const override; + bool writeSymbology( QDomNode &node, QDomDocument &doc, QString &errorMessage, + const QgsReadWriteContext &context, QgsMapLayerStyle::StyleCategories categories = QgsMapLayerStyle::All ) const override; /** * Write just the style information for the layer into the document @@ -909,7 +912,8 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer, public QgsExpressionConte * \param context writing context (used for transform from absolute to relative paths) * \returns true in case of success. */ - bool writeStyle( QDomNode &node, QDomDocument &doc, QString &errorMessage, const QgsReadWriteContext &context ) const override; + bool writeStyle( QDomNode &node, QDomDocument &doc, QString &errorMessage, + const QgsReadWriteContext &context, QgsMapLayerStyle::StyleCategories categories = QgsMapLayerStyle::All ) const override; /** * Writes the symbology of the layer into the document provided in SLD 1.1 format diff --git a/src/core/raster/qgsrasterlayer.cpp b/src/core/raster/qgsrasterlayer.cpp index e4d77d312ed..ac42e8b9954 100644 --- a/src/core/raster/qgsrasterlayer.cpp +++ b/src/core/raster/qgsrasterlayer.cpp @@ -1306,9 +1306,12 @@ QImage QgsRasterLayer::previewAsImage( QSize size, const QColor &bgColor, QImage * \param errorMessage reference to string that will be updated with any error messages * \return true in case of success. */ -bool QgsRasterLayer::readSymbology( const QDomNode &layer_node, QString &errorMessage, QgsReadWriteContext &context ) +bool QgsRasterLayer::readSymbology( const QDomNode &layer_node, QString &errorMessage, + QgsReadWriteContext &context, QgsMapLayerStyle::StyleCategories categories ) { Q_UNUSED( errorMessage ); + Q_UNUSED( categories ); + QDomElement rasterRendererElem; QDomElement layerElement = layer_node.toElement(); @@ -1398,9 +1401,9 @@ bool QgsRasterLayer::readSymbology( const QDomNode &layer_node, QString &errorMe return true; } -bool QgsRasterLayer::readStyle( const QDomNode &node, QString &errorMessage, QgsReadWriteContext &context ) +bool QgsRasterLayer::readStyle( const QDomNode &node, QString &errorMessage, QgsReadWriteContext &context, QgsMapLayerStyle::StyleCategories categories ) { - return readSymbology( node, errorMessage, context ); + return readSymbology( node, errorMessage, context, categories ); } bool QgsRasterLayer::readXml( const QDomNode &layer_node, QgsReadWriteContext &context ) @@ -1545,9 +1548,11 @@ bool QgsRasterLayer::readXml( const QDomNode &layer_node, QgsReadWriteContext &c * \param errorMessage reference to string that will be updated with any error messages * \return true in case of success. */ -bool QgsRasterLayer::writeSymbology( QDomNode &layer_node, QDomDocument &document, QString &errorMessage, const QgsReadWriteContext &context ) const +bool QgsRasterLayer::writeSymbology( QDomNode &layer_node, QDomDocument &document, QString &errorMessage, + const QgsReadWriteContext &context, QgsMapLayerStyle::StyleCategories categories ) const { Q_UNUSED( errorMessage ); + Q_UNUSED( categories ); QDomElement layerElement = layer_node.toElement(); writeCommonStyle( layerElement, document, context ); @@ -1574,9 +1579,9 @@ bool QgsRasterLayer::writeSymbology( QDomNode &layer_node, QDomDocument &documen return true; } -bool QgsRasterLayer::writeStyle( QDomNode &node, QDomDocument &doc, QString &errorMessage, const QgsReadWriteContext &context ) const +bool QgsRasterLayer::writeStyle( QDomNode &node, QDomDocument &doc, QString &errorMessage, const QgsReadWriteContext &context, QgsMapLayerStyle::StyleCategories categories ) const { - return writeSymbology( node, doc, errorMessage, context ); + return writeSymbology( node, doc, errorMessage, context, categories ); } // bool QgsRasterLayer::writeSymbology diff --git a/src/core/raster/qgsrasterlayer.h b/src/core/raster/qgsrasterlayer.h index c9765a21cef..b712c56a89e 100644 --- a/src/core/raster/qgsrasterlayer.h +++ b/src/core/raster/qgsrasterlayer.h @@ -404,11 +404,13 @@ class CORE_EXPORT QgsRasterLayer : public QgsMapLayer void showStatusMessage( const QString &message ); protected: - bool readSymbology( const QDomNode &node, QString &errorMessage, QgsReadWriteContext &context ) override; - bool readStyle( const QDomNode &node, QString &errorMessage, QgsReadWriteContext &context ) override; + bool readSymbology( const QDomNode &node, QString &errorMessage, QgsReadWriteContext &context, QgsMapLayerStyle::StyleCategories categories = QgsMapLayerStyle::All ) override; + bool readStyle( const QDomNode &node, QString &errorMessage, QgsReadWriteContext &context, QgsMapLayerStyle::StyleCategories categories = QgsMapLayerStyle::All ) override; bool readXml( const QDomNode &layer_node, QgsReadWriteContext &context ) override; - bool writeSymbology( QDomNode &, QDomDocument &doc, QString &errorMessage, const QgsReadWriteContext &context ) const override; - bool writeStyle( QDomNode &node, QDomDocument &doc, QString &errorMessage, const QgsReadWriteContext &context ) const override; + bool writeSymbology( QDomNode &, QDomDocument &doc, QString &errorMessage, + const QgsReadWriteContext &context, QgsMapLayerStyle::StyleCategories categories = QgsMapLayerStyle::All ) const override; + bool writeStyle( QDomNode &node, QDomDocument &doc, QString &errorMessage, + const QgsReadWriteContext &context, QgsMapLayerStyle::StyleCategories categories = QgsMapLayerStyle::All ) const override; bool writeXml( QDomNode &layer_node, QDomDocument &doc, const QgsReadWriteContext &context ) const override; QString encodedSource( const QString &source, const QgsReadWriteContext &context ) const override; QString decodedSource( const QString &source, const QString &provider, const QgsReadWriteContext &context ) const override;