diff --git a/python/PyQt6/core/auto_generated/symbology/qgsrenderer.sip.in b/python/PyQt6/core/auto_generated/symbology/qgsrenderer.sip.in index 3ef1a60e791..d1820bf91d5 100644 --- a/python/PyQt6/core/auto_generated/symbology/qgsrenderer.sip.in +++ b/python/PyQt6/core/auto_generated/symbology/qgsrenderer.sip.in @@ -628,6 +628,18 @@ Currently clones :param destRenderer: destination renderer for copied effect .. versionadded:: 3.22 +%End + + double maximumExtentBuffer( QgsRenderContext &context ) const; +%Docstring +Returns the maximum extent buffer found in this renderer's +symbols' symbol layers. + +.. note:: + + Returns 0 if the renderer doesn't have any symbols. + +.. versionadded:: 3.42 %End protected: diff --git a/python/core/auto_generated/symbology/qgsrenderer.sip.in b/python/core/auto_generated/symbology/qgsrenderer.sip.in index c17fb32bd6d..a704df505a7 100644 --- a/python/core/auto_generated/symbology/qgsrenderer.sip.in +++ b/python/core/auto_generated/symbology/qgsrenderer.sip.in @@ -628,6 +628,18 @@ Currently clones :param destRenderer: destination renderer for copied effect .. versionadded:: 3.22 +%End + + double maximumExtentBuffer( QgsRenderContext &context ) const; +%Docstring +Returns the maximum extent buffer found in this renderer's +symbols' symbol layers. + +.. note:: + + Returns 0 if the renderer doesn't have any symbols. + +.. versionadded:: 3.42 %End protected: diff --git a/src/core/symbology/qgsrenderer.cpp b/src/core/symbology/qgsrenderer.cpp index c6fb1aed272..ac3b980e885 100644 --- a/src/core/symbology/qgsrenderer.cpp +++ b/src/core/symbology/qgsrenderer.cpp @@ -38,6 +38,7 @@ #include #include #include +#include QgsPropertiesDefinition QgsFeatureRenderer::sPropertyDefinitions; @@ -417,6 +418,38 @@ QgsLegendSymbolList QgsFeatureRenderer::legendSymbolItems() const return QgsLegendSymbolList(); } +double QgsFeatureRenderer::maximumExtentBuffer( QgsRenderContext &context ) const +{ + const QgsSymbolList symbolList = symbols( context ); + + if ( symbolList.empty() ) + return 0; + + const QgsExpressionContext &expContext = context.expressionContext(); + + auto getValueFromSymbol = [ &expContext ]( const QgsSymbol * sym ) -> double + { + const QgsProperty property = sym->dataDefinedProperties().property( QgsSymbol::Property::ExtentBuffer ); + + if ( property.isActive() && ! property.expressionString().isEmpty() ) + { + return sym->dataDefinedProperties().valueAsDouble( QgsSymbol::Property::ExtentBuffer, expContext ); + } + + return sym->extentBuffer(); + }; + + if ( symbolList.size() == 1 ) + return getValueFromSymbol( symbolList[0] ); + + auto it = std::max_element( symbolList.constBegin(), symbolList.constEnd(), [ &getValueFromSymbol ]( const QgsSymbol * a, const QgsSymbol * b ) -> bool + { + return getValueFromSymbol( a ) < getValueFromSymbol( b ); + } ); + + return getValueFromSymbol( *it ); +} + QList QgsFeatureRenderer::createLegendNodes( QgsLayerTreeLayer *nodeLayer ) const { QList nodes; diff --git a/src/core/symbology/qgsrenderer.h b/src/core/symbology/qgsrenderer.h index 801b51136f0..0df51dc8642 100644 --- a/src/core/symbology/qgsrenderer.h +++ b/src/core/symbology/qgsrenderer.h @@ -653,6 +653,15 @@ class CORE_EXPORT QgsFeatureRenderer */ void copyRendererData( QgsFeatureRenderer *destRenderer ) const; + /** + * Returns the maximum extent buffer found in this renderer's + * symbols' symbol layers. + * + * \note Returns 0 if the renderer doesn't have any symbols. + * \since QGIS 3.42 + */ + double maximumExtentBuffer( QgsRenderContext &context ) const; + protected: QgsFeatureRenderer( const QString &type );