diff --git a/python/core/raster/qgsrasterrenderer.sip b/python/core/raster/qgsrasterrenderer.sip index 83c20edf88f..3da8feda437 100644 --- a/python/core/raster/qgsrasterrenderer.sip +++ b/python/core/raster/qgsrasterrenderer.sip @@ -57,6 +57,11 @@ class QgsRasterRenderer : QgsRasterInterface /** Sets base class members from xml. Usually called from create() methods of subclasses*/ void readXML( const QDomElement& rendererElem ); + /** Copies common properties like opacity / transparency data from other renderer. + * Useful when cloning renderers. + * @note added in 2.16 */ + void copyCommonProperties( const QgsRasterRenderer* other ); + /** Returns a list of band numbers used by the renderer*/ virtual QList usesBands() const; diff --git a/src/core/raster/qgshillshaderenderer.cpp b/src/core/raster/qgshillshaderenderer.cpp index efb5e79defe..0fcebeff6ec 100644 --- a/src/core/raster/qgshillshaderenderer.cpp +++ b/src/core/raster/qgshillshaderenderer.cpp @@ -38,12 +38,10 @@ QgsHillshadeRenderer::QgsHillshadeRenderer( QgsRasterInterface *input, int band, QgsHillshadeRenderer *QgsHillshadeRenderer::clone() const { QgsHillshadeRenderer* r = new QgsHillshadeRenderer( nullptr, mBand, mLightAzimuth, mLightAngle ); + r->copyCommonProperties( this ); + r->setZFactor( mZFactor ); r->setMultiDirectional( mMultiDirectional ); - // "Effects" - r->setOpacity( mOpacity ); - r->setAlphaBand( mAlphaBand ); - r->setRasterTransparency( mRasterTransparency ? new QgsRasterTransparency( *mRasterTransparency ) : nullptr ); return r; } diff --git a/src/core/raster/qgsmultibandcolorrenderer.cpp b/src/core/raster/qgsmultibandcolorrenderer.cpp index 1d2d9704e35..bb80178a4c3 100644 --- a/src/core/raster/qgsmultibandcolorrenderer.cpp +++ b/src/core/raster/qgsmultibandcolorrenderer.cpp @@ -48,6 +48,8 @@ QgsMultiBandColorRenderer::~QgsMultiBandColorRenderer() QgsMultiBandColorRenderer* QgsMultiBandColorRenderer::clone() const { QgsMultiBandColorRenderer * renderer = new QgsMultiBandColorRenderer( nullptr, mRedBand, mGreenBand, mBlueBand ); + renderer->copyCommonProperties( this ); + if ( mRedContrastEnhancement ) { renderer->setRedContrastEnhancement( new QgsContrastEnhancement( *mRedContrastEnhancement ) ); @@ -60,9 +62,6 @@ QgsMultiBandColorRenderer* QgsMultiBandColorRenderer::clone() const { renderer->setBlueContrastEnhancement( new QgsContrastEnhancement( *mBlueContrastEnhancement ) ); } - renderer->setOpacity( mOpacity ); - renderer->setAlphaBand( mAlphaBand ); - renderer->setRasterTransparency( mRasterTransparency ? new QgsRasterTransparency( *mRasterTransparency ) : nullptr ); return renderer; } diff --git a/src/core/raster/qgspalettedrasterrenderer.cpp b/src/core/raster/qgspalettedrasterrenderer.cpp index 65094b6ca9b..3e129ef3d8b 100644 --- a/src/core/raster/qgspalettedrasterrenderer.cpp +++ b/src/core/raster/qgspalettedrasterrenderer.cpp @@ -49,9 +49,8 @@ QgsPalettedRasterRenderer::~QgsPalettedRasterRenderer() QgsPalettedRasterRenderer* QgsPalettedRasterRenderer::clone() const { QgsPalettedRasterRenderer * renderer = new QgsPalettedRasterRenderer( nullptr, mBand, rgbArray(), mNColors ); - renderer->setOpacity( mOpacity ); - renderer->setAlphaBand( mAlphaBand ); - renderer->setRasterTransparency( mRasterTransparency ? new QgsRasterTransparency( *mRasterTransparency ) : nullptr ); + renderer->copyCommonProperties( this ); + renderer->mLabels = mLabels; return renderer; } diff --git a/src/core/raster/qgsrasterrenderer.cpp b/src/core/raster/qgsrasterrenderer.cpp index 4d45577ab91..e3e7c0044f4 100644 --- a/src/core/raster/qgsrasterrenderer.cpp +++ b/src/core/raster/qgsrasterrenderer.cpp @@ -134,6 +134,16 @@ void QgsRasterRenderer::readXML( const QDomElement& rendererElem ) } } +void QgsRasterRenderer::copyCommonProperties( const QgsRasterRenderer* other ) +{ + if ( !other ) + return; + + setOpacity( other->opacity() ); + setAlphaBand( other->alphaBand() ); + setRasterTransparency( other->rasterTransparency() ? new QgsRasterTransparency( *other->rasterTransparency() ) : nullptr ); +} + QString QgsRasterRenderer::minMaxOriginName( int theOrigin ) { if ( theOrigin == MinMaxUnknown ) diff --git a/src/core/raster/qgsrasterrenderer.h b/src/core/raster/qgsrasterrenderer.h index d367e03d937..a924ccf412d 100644 --- a/src/core/raster/qgsrasterrenderer.h +++ b/src/core/raster/qgsrasterrenderer.h @@ -88,6 +88,11 @@ class CORE_EXPORT QgsRasterRenderer : public QgsRasterInterface /** Sets base class members from xml. Usually called from create() methods of subclasses*/ void readXML( const QDomElement& rendererElem ) override; + /** Copies common properties like opacity / transparency data from other renderer. + * Useful when cloning renderers. + * @note added in 2.16 */ + void copyCommonProperties( const QgsRasterRenderer* other ); + /** Returns a list of band numbers used by the renderer*/ virtual QList usesBands() const { return QList(); } diff --git a/src/core/raster/qgssinglebandcolordatarenderer.cpp b/src/core/raster/qgssinglebandcolordatarenderer.cpp index 3333821f247..8e55796987c 100644 --- a/src/core/raster/qgssinglebandcolordatarenderer.cpp +++ b/src/core/raster/qgssinglebandcolordatarenderer.cpp @@ -35,9 +35,7 @@ QgsSingleBandColorDataRenderer::~QgsSingleBandColorDataRenderer() QgsSingleBandColorDataRenderer* QgsSingleBandColorDataRenderer::clone() const { QgsSingleBandColorDataRenderer * renderer = new QgsSingleBandColorDataRenderer( nullptr, mBand ); - renderer->setOpacity( mOpacity ); - renderer->setAlphaBand( mAlphaBand ); - renderer->setRasterTransparency( mRasterTransparency ? new QgsRasterTransparency( *mRasterTransparency ) : nullptr ); + renderer->copyCommonProperties( this ); return renderer; } diff --git a/src/core/raster/qgssinglebandgrayrenderer.cpp b/src/core/raster/qgssinglebandgrayrenderer.cpp index 649c21d3633..c4300750b8c 100644 --- a/src/core/raster/qgssinglebandgrayrenderer.cpp +++ b/src/core/raster/qgssinglebandgrayrenderer.cpp @@ -35,9 +35,8 @@ QgsSingleBandGrayRenderer::~QgsSingleBandGrayRenderer() QgsSingleBandGrayRenderer* QgsSingleBandGrayRenderer::clone() const { QgsSingleBandGrayRenderer * renderer = new QgsSingleBandGrayRenderer( nullptr, mGrayBand ); - renderer->setOpacity( mOpacity ); - renderer->setAlphaBand( mAlphaBand ); - renderer->setRasterTransparency( mRasterTransparency ? new QgsRasterTransparency( *mRasterTransparency ) : nullptr ); + renderer->copyCommonProperties( this ); + renderer->setGradient( mGradient ); if ( mContrastEnhancement ) { diff --git a/src/core/raster/qgssinglebandpseudocolorrenderer.cpp b/src/core/raster/qgssinglebandpseudocolorrenderer.cpp index be9b0cf0bcc..687808db512 100644 --- a/src/core/raster/qgssinglebandpseudocolorrenderer.cpp +++ b/src/core/raster/qgssinglebandpseudocolorrenderer.cpp @@ -69,10 +69,7 @@ QgsSingleBandPseudoColorRenderer* QgsSingleBandPseudoColorRenderer::clone() cons } } QgsSingleBandPseudoColorRenderer * renderer = new QgsSingleBandPseudoColorRenderer( nullptr, mBand, shader ); - - renderer->setOpacity( mOpacity ); - renderer->setAlphaBand( mAlphaBand ); - renderer->setRasterTransparency( mRasterTransparency ? new QgsRasterTransparency( *mRasterTransparency ) : nullptr ); + renderer->copyCommonProperties( this ); return renderer; } diff --git a/src/gui/raster/qgsrendererrasterpropertieswidget.cpp b/src/gui/raster/qgsrendererrasterpropertieswidget.cpp index 71822b1ec65..7e42ee6ff81 100644 --- a/src/gui/raster/qgsrendererrasterpropertieswidget.cpp +++ b/src/gui/raster/qgsrendererrasterpropertieswidget.cpp @@ -133,7 +133,15 @@ void QgsRendererRasterPropertiesWidget::apply() QgsRasterRendererWidget* rendererWidget = dynamic_cast( stackedWidget->currentWidget() ); if ( rendererWidget ) { - mRasterLayer->setRenderer( rendererWidget->renderer() ); + QgsRasterRenderer* newRenderer = rendererWidget->renderer(); + + // there are transparency related data stored in renderer instances, but they + // are not configured in the widget, so we need to copy them over from existing renderer + QgsRasterRenderer* oldRenderer = mRasterLayer->renderer(); + if ( oldRenderer ) + newRenderer->copyCommonProperties( oldRenderer ); + + mRasterLayer->setRenderer( newRenderer ); } // Hue and saturation controls