Ensure correct symbol geometry type is used for more preview icons

This commit is contained in:
Nyall Dawson 2021-11-01 13:29:55 +10:00
parent d915950707
commit dabc17bbcb
4 changed files with 22 additions and 4 deletions

View File

@ -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

View File

@ -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();

View File

@ -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.

View File

@ -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 );