From b7eac0772165233268c3ee37cf7aa3ecb32716ff Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Tue, 16 Jun 2020 14:40:50 +1000 Subject: [PATCH] Add a render context flag so we know when a render operation is occurring for drawing a symbol preview Because these have no map association, certain settings like sizes in "meters in map units" will have no meaning, and may need special handling Refs #28690 --- python/core/auto_generated/qgsrendercontext.sip.in | 1 + src/core/layertree/qgslayertreemodel.cpp | 1 + src/core/layertree/qgslayertreemodellegendnode.cpp | 1 + src/core/qgsrendercontext.h | 1 + src/core/symbology/qgssymbol.cpp | 2 ++ src/core/symbology/qgssymbollayerutils.cpp | 2 ++ 6 files changed, 8 insertions(+) diff --git a/python/core/auto_generated/qgsrendercontext.sip.in b/python/core/auto_generated/qgsrendercontext.sip.in index 23d29588dc3..e17e0a2a61e 100644 --- a/python/core/auto_generated/qgsrendercontext.sip.in +++ b/python/core/auto_generated/qgsrendercontext.sip.in @@ -43,6 +43,7 @@ to be rendered etc. RenderPartialOutput, RenderPreviewJob, RenderBlocking, + RenderSymbolPreview, }; typedef QFlags Flags; diff --git a/src/core/layertree/qgslayertreemodel.cpp b/src/core/layertree/qgslayertreemodel.cpp index cd11fd6f5ce..4407e6f51fa 100644 --- a/src/core/layertree/qgslayertreemodel.cpp +++ b/src/core/layertree/qgslayertreemodel.cpp @@ -1388,6 +1388,7 @@ QgsRenderContext *QgsLayerTreeModel::createTemporaryRenderContext() const context->setScaleFactor( dpi / 25.4 ); context->setRendererScale( scale ); context->setMapToPixel( QgsMapToPixel( mupp ) ); + context->setFlag( QgsRenderContext::RenderSymbolPreview ); return validData ? context.release() : nullptr; } diff --git a/src/core/layertree/qgslayertreemodellegendnode.cpp b/src/core/layertree/qgslayertreemodellegendnode.cpp index 08e43d6e611..caa28c178f5 100644 --- a/src/core/layertree/qgslayertreemodellegendnode.cpp +++ b/src/core/layertree/qgslayertreemodellegendnode.cpp @@ -405,6 +405,7 @@ QgsRenderContext *QgsLayerTreeModelLegendNode::createTemporaryRenderContext() co context->setRendererScale( scale ); context->setMapToPixel( QgsMapToPixel( mupp ) ); context->setFlag( QgsRenderContext::Antialiasing, true ); + context->setFlag( QgsRenderContext::RenderSymbolPreview, true ); return context.release(); } diff --git a/src/core/qgsrendercontext.h b/src/core/qgsrendercontext.h index 7b4a470fd6a..f07942a8082 100644 --- a/src/core/qgsrendercontext.h +++ b/src/core/qgsrendercontext.h @@ -79,6 +79,7 @@ class CORE_EXPORT QgsRenderContext : public QgsTemporalRangeObject RenderPartialOutput = 0x100, //!< Whether to make extra effort to update map image with partially rendered layers (better for interactive map canvas). Added in QGIS 3.0 RenderPreviewJob = 0x200, //!< Render is a 'canvas preview' render, and shortcuts should be taken to ensure fast rendering RenderBlocking = 0x400, //!< Render and load remote sources in the same thread to ensure rendering remote sources (svg and images). WARNING: this flag must NEVER be used from GUI based applications (like the main QGIS application) or crashes will result. Only for use in external scripts or QGIS server. + RenderSymbolPreview = 0x800, //!< The render is for a symbol preview only and map based properties may not be available, so care should be taken to handle map unit based sizes in an appropriate way. }; Q_DECLARE_FLAGS( Flags, Flag ) diff --git a/src/core/symbology/qgssymbol.cpp b/src/core/symbology/qgssymbol.cpp index c1323a1124e..d5d1e8a606f 100644 --- a/src/core/symbology/qgssymbol.cpp +++ b/src/core/symbology/qgssymbol.cpp @@ -511,6 +511,7 @@ void QgsSymbol::drawPreviewIcon( QPainter *painter, QSize size, QgsRenderContext { tempContext.reset( new QgsRenderContext( QgsRenderContext::fromQPainter( painter ) ) ); context = tempContext.get(); + context->setFlag( QgsRenderContext::RenderSymbolPreview, true ); } const bool prevForceVector = context->forceVectorOutput(); @@ -631,6 +632,7 @@ QImage QgsSymbol::bigSymbolPreviewImage( QgsExpressionContext *expressionContext } QgsRenderContext context = QgsRenderContext::fromQPainter( &p ); + context.setFlag( QgsRenderContext::RenderSymbolPreview ); if ( expressionContext ) context.setExpressionContext( *expressionContext ); diff --git a/src/core/symbology/qgssymbollayerutils.cpp b/src/core/symbology/qgssymbollayerutils.cpp index 978d0b50cc2..7e51123a8e4 100644 --- a/src/core/symbology/qgssymbollayerutils.cpp +++ b/src/core/symbology/qgssymbollayerutils.cpp @@ -838,6 +838,7 @@ QPicture QgsSymbolLayerUtils::symbolLayerPreviewPicture( const QgsSymbolLayer *l painter.setRenderHint( QPainter::Antialiasing ); QgsRenderContext renderContext = QgsRenderContext::fromQPainter( &painter ); renderContext.setForceVectorOutput( true ); + renderContext.setFlag( QgsRenderContext::RenderSymbolPreview, true ); QgsSymbolRenderContext symbolContext( renderContext, units, 1.0, false, nullptr, nullptr ); std::unique_ptr< QgsSymbolLayer > layerClone( layer->clone() ); layerClone->drawPreviewIcon( symbolContext, size ); @@ -853,6 +854,7 @@ QIcon QgsSymbolLayerUtils::symbolLayerPreviewIcon( const QgsSymbolLayer *layer, painter.begin( &pixmap ); painter.setRenderHint( QPainter::Antialiasing ); QgsRenderContext renderContext = QgsRenderContext::fromQPainter( &painter ); + renderContext.setFlag( QgsRenderContext::RenderSymbolPreview ); // build a minimal expression context QgsExpressionContext expContext; expContext.appendScopes( QgsExpressionContextUtils::globalProjectLayerScopes( nullptr ) );