diff --git a/python/core/auto_generated/symbology/qgssymbollayerutils.sip.in b/python/core/auto_generated/symbology/qgssymbollayerutils.sip.in index 1c671019d1e..873fc7d2436 100644 --- a/python/core/auto_generated/symbology/qgssymbollayerutils.sip.in +++ b/python/core/auto_generated/symbology/qgssymbollayerutils.sip.in @@ -321,7 +321,7 @@ Returns a pixmap preview for a color ramp. .. seealso:: :py:func:`symbolPreviewIcon` %End - static QPicture symbolLayerPreviewPicture( const QgsSymbolLayer *layer, QgsUnitTypes::RenderUnit units, QSize size, const QgsMapUnitScale &scale = QgsMapUnitScale() ); + static QPicture symbolLayerPreviewPicture( const QgsSymbolLayer *layer, QgsUnitTypes::RenderUnit units, QSize size, const QgsMapUnitScale &scale = QgsMapUnitScale(), Qgis::SymbolType parentSymbolType = Qgis::SymbolType::Hybrid ); %Docstring Draws a symbol layer preview to a QPicture @@ -329,6 +329,7 @@ Draws a symbol layer preview to a QPicture :param units: size units :param size: target size of preview picture :param scale: map unit scale for preview +:param parentSymbolType: since QGIS 3.22, can be used to specify the parent symbol type so that geometry generator preview icons are correctly calculated :return: QPicture containing symbol layer preview diff --git a/src/core/symbology/qgssymbollayerutils.cpp b/src/core/symbology/qgssymbollayerutils.cpp index 8cd66bb9c42..9903e802331 100644 --- a/src/core/symbology/qgssymbollayerutils.cpp +++ b/src/core/symbology/qgssymbollayerutils.cpp @@ -938,7 +938,7 @@ double QgsSymbolLayerUtils::estimateMaxSymbolBleed( QgsSymbol *symbol, const Qgs return maxBleed; } -QPicture QgsSymbolLayerUtils::symbolLayerPreviewPicture( const QgsSymbolLayer *layer, QgsUnitTypes::RenderUnit units, QSize size, const QgsMapUnitScale & ) +QPicture QgsSymbolLayerUtils::symbolLayerPreviewPicture( const QgsSymbolLayer *layer, QgsUnitTypes::RenderUnit units, QSize size, const QgsMapUnitScale &, Qgis::SymbolType parentSymbolType ) { QPicture picture; QPainter painter; @@ -948,6 +948,22 @@ QPicture QgsSymbolLayerUtils::symbolLayerPreviewPicture( const QgsSymbolLayer *l renderContext.setForceVectorOutput( true ); renderContext.setFlag( Qgis::RenderContextFlag::RenderSymbolPreview, true ); QgsSymbolRenderContext symbolContext( renderContext, units, 1.0, false, Qgis::SymbolRenderHints(), nullptr ); + + switch ( parentSymbolType ) + { + case Qgis::SymbolType::Marker: + symbolContext.setOriginalGeometryType( QgsWkbTypes::PointGeometry ); + break; + case Qgis::SymbolType::Line: + symbolContext.setOriginalGeometryType( QgsWkbTypes::LineGeometry ); + break; + case Qgis::SymbolType::Fill: + symbolContext.setOriginalGeometryType( QgsWkbTypes::PolygonGeometry ); + break; + case Qgis::SymbolType::Hybrid: + break; + } + std::unique_ptr< QgsSymbolLayer > layerClone( layer->clone() ); layerClone->drawPreviewIcon( symbolContext, size ); painter.end(); diff --git a/src/core/symbology/qgssymbollayerutils.h b/src/core/symbology/qgssymbollayerutils.h index 6a11c566f0e..1184048a902 100644 --- a/src/core/symbology/qgssymbollayerutils.h +++ b/src/core/symbology/qgssymbollayerutils.h @@ -309,11 +309,12 @@ class CORE_EXPORT QgsSymbolLayerUtils * \param units size units * \param size target size of preview picture * \param scale map unit scale for preview + * \param parentSymbolType since QGIS 3.22, can be used to specify the parent symbol type so that geometry generator preview icons are correctly calculated * \returns QPicture containing symbol layer preview * \see symbolLayerPreviewIcon() * \since QGIS 2.9 */ - static QPicture symbolLayerPreviewPicture( const QgsSymbolLayer *layer, QgsUnitTypes::RenderUnit units, QSize size, const QgsMapUnitScale &scale = QgsMapUnitScale() ); + static QPicture symbolLayerPreviewPicture( const QgsSymbolLayer *layer, QgsUnitTypes::RenderUnit units, QSize size, const QgsMapUnitScale &scale = QgsMapUnitScale(), Qgis::SymbolType parentSymbolType = Qgis::SymbolType::Hybrid ); /** * Draws a symbol layer preview to an icon. diff --git a/src/gui/symbology/qgslayerpropertieswidget.cpp b/src/gui/symbology/qgslayerpropertieswidget.cpp index 344da7f28de..1f808525caf 100644 --- a/src/gui/symbology/qgslayerpropertieswidget.cpp +++ b/src/gui/symbology/qgslayerpropertieswidget.cpp @@ -404,7 +404,7 @@ void QgsLayerPropertiesWidget::emitSignalChanged() mLayer->paintEffect()->setEnabled( false ); paintEffectToggled = true; } - mEffectWidget->setPreviewPicture( QgsSymbolLayerUtils::symbolLayerPreviewPicture( mLayer, QgsUnitTypes::RenderMillimeters, QSize( 60, 60 ) ) ); + mEffectWidget->setPreviewPicture( QgsSymbolLayerUtils::symbolLayerPreviewPicture( mLayer, QgsUnitTypes::RenderMillimeters, QSize( 60, 60 ), QgsMapUnitScale(), mSymbol ? mSymbol->type() : Qgis::SymbolType::Hybrid ) ); if ( paintEffectToggled ) { mLayer->paintEffect()->setEnabled( true );