Skip to content

Commit cca79aa

Browse files
committed
Fix loss of transparency information in style dock (fixes #15229)
1 parent 5ae7802 commit cca79aa

10 files changed

+39
-21
lines changed

python/core/raster/qgsrasterrenderer.sip

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,11 @@ class QgsRasterRenderer : QgsRasterInterface
5757
/** Sets base class members from xml. Usually called from create() methods of subclasses*/
5858
void readXML( const QDomElement& rendererElem );
5959

60+
/** Copies common properties like opacity / transparency data from other renderer.
61+
* Useful when cloning renderers.
62+
* @note added in 2.16 */
63+
void copyCommonProperties( const QgsRasterRenderer* other );
64+
6065
/** Returns a list of band numbers used by the renderer*/
6166
virtual QList<int> usesBands() const;
6267

src/core/raster/qgshillshaderenderer.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,10 @@ QgsHillshadeRenderer::QgsHillshadeRenderer( QgsRasterInterface *input, int band,
3838
QgsHillshadeRenderer *QgsHillshadeRenderer::clone() const
3939
{
4040
QgsHillshadeRenderer* r = new QgsHillshadeRenderer( nullptr, mBand, mLightAzimuth, mLightAngle );
41+
r->copyCommonProperties( this );
42+
4143
r->setZFactor( mZFactor );
4244
r->setMultiDirectional( mMultiDirectional );
43-
// "Effects"
44-
r->setOpacity( mOpacity );
45-
r->setAlphaBand( mAlphaBand );
46-
r->setRasterTransparency( mRasterTransparency ? new QgsRasterTransparency( *mRasterTransparency ) : nullptr );
4745
return r;
4846
}
4947

src/core/raster/qgsmultibandcolorrenderer.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ QgsMultiBandColorRenderer::~QgsMultiBandColorRenderer()
4848
QgsMultiBandColorRenderer* QgsMultiBandColorRenderer::clone() const
4949
{
5050
QgsMultiBandColorRenderer * renderer = new QgsMultiBandColorRenderer( nullptr, mRedBand, mGreenBand, mBlueBand );
51+
renderer->copyCommonProperties( this );
52+
5153
if ( mRedContrastEnhancement )
5254
{
5355
renderer->setRedContrastEnhancement( new QgsContrastEnhancement( *mRedContrastEnhancement ) );
@@ -60,9 +62,6 @@ QgsMultiBandColorRenderer* QgsMultiBandColorRenderer::clone() const
6062
{
6163
renderer->setBlueContrastEnhancement( new QgsContrastEnhancement( *mBlueContrastEnhancement ) );
6264
}
63-
renderer->setOpacity( mOpacity );
64-
renderer->setAlphaBand( mAlphaBand );
65-
renderer->setRasterTransparency( mRasterTransparency ? new QgsRasterTransparency( *mRasterTransparency ) : nullptr );
6665

6766
return renderer;
6867
}

src/core/raster/qgspalettedrasterrenderer.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,8 @@ QgsPalettedRasterRenderer::~QgsPalettedRasterRenderer()
4949
QgsPalettedRasterRenderer* QgsPalettedRasterRenderer::clone() const
5050
{
5151
QgsPalettedRasterRenderer * renderer = new QgsPalettedRasterRenderer( nullptr, mBand, rgbArray(), mNColors );
52-
renderer->setOpacity( mOpacity );
53-
renderer->setAlphaBand( mAlphaBand );
54-
renderer->setRasterTransparency( mRasterTransparency ? new QgsRasterTransparency( *mRasterTransparency ) : nullptr );
52+
renderer->copyCommonProperties( this );
53+
5554
renderer->mLabels = mLabels;
5655
return renderer;
5756
}

src/core/raster/qgsrasterrenderer.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,16 @@ void QgsRasterRenderer::readXML( const QDomElement& rendererElem )
134134
}
135135
}
136136

137+
void QgsRasterRenderer::copyCommonProperties( const QgsRasterRenderer* other )
138+
{
139+
if ( !other )
140+
return;
141+
142+
setOpacity( other->opacity() );
143+
setAlphaBand( other->alphaBand() );
144+
setRasterTransparency( other->rasterTransparency() ? new QgsRasterTransparency( *other->rasterTransparency() ) : nullptr );
145+
}
146+
137147
QString QgsRasterRenderer::minMaxOriginName( int theOrigin )
138148
{
139149
if ( theOrigin == MinMaxUnknown )

src/core/raster/qgsrasterrenderer.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,11 @@ class CORE_EXPORT QgsRasterRenderer : public QgsRasterInterface
8888
/** Sets base class members from xml. Usually called from create() methods of subclasses*/
8989
void readXML( const QDomElement& rendererElem ) override;
9090

91+
/** Copies common properties like opacity / transparency data from other renderer.
92+
* Useful when cloning renderers.
93+
* @note added in 2.16 */
94+
void copyCommonProperties( const QgsRasterRenderer* other );
95+
9196
/** Returns a list of band numbers used by the renderer*/
9297
virtual QList<int> usesBands() const { return QList<int>(); }
9398

src/core/raster/qgssinglebandcolordatarenderer.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,7 @@ QgsSingleBandColorDataRenderer::~QgsSingleBandColorDataRenderer()
3535
QgsSingleBandColorDataRenderer* QgsSingleBandColorDataRenderer::clone() const
3636
{
3737
QgsSingleBandColorDataRenderer * renderer = new QgsSingleBandColorDataRenderer( nullptr, mBand );
38-
renderer->setOpacity( mOpacity );
39-
renderer->setAlphaBand( mAlphaBand );
40-
renderer->setRasterTransparency( mRasterTransparency ? new QgsRasterTransparency( *mRasterTransparency ) : nullptr );
38+
renderer->copyCommonProperties( this );
4139
return renderer;
4240
}
4341

src/core/raster/qgssinglebandgrayrenderer.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,8 @@ QgsSingleBandGrayRenderer::~QgsSingleBandGrayRenderer()
3535
QgsSingleBandGrayRenderer* QgsSingleBandGrayRenderer::clone() const
3636
{
3737
QgsSingleBandGrayRenderer * renderer = new QgsSingleBandGrayRenderer( nullptr, mGrayBand );
38-
renderer->setOpacity( mOpacity );
39-
renderer->setAlphaBand( mAlphaBand );
40-
renderer->setRasterTransparency( mRasterTransparency ? new QgsRasterTransparency( *mRasterTransparency ) : nullptr );
38+
renderer->copyCommonProperties( this );
39+
4140
renderer->setGradient( mGradient );
4241
if ( mContrastEnhancement )
4342
{

src/core/raster/qgssinglebandpseudocolorrenderer.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,7 @@ QgsSingleBandPseudoColorRenderer* QgsSingleBandPseudoColorRenderer::clone() cons
6969
}
7070
}
7171
QgsSingleBandPseudoColorRenderer * renderer = new QgsSingleBandPseudoColorRenderer( nullptr, mBand, shader );
72-
73-
renderer->setOpacity( mOpacity );
74-
renderer->setAlphaBand( mAlphaBand );
75-
renderer->setRasterTransparency( mRasterTransparency ? new QgsRasterTransparency( *mRasterTransparency ) : nullptr );
72+
renderer->copyCommonProperties( this );
7673

7774
return renderer;
7875
}

src/gui/raster/qgsrendererrasterpropertieswidget.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,15 @@ void QgsRendererRasterPropertiesWidget::apply()
133133
QgsRasterRendererWidget* rendererWidget = dynamic_cast<QgsRasterRendererWidget*>( stackedWidget->currentWidget() );
134134
if ( rendererWidget )
135135
{
136-
mRasterLayer->setRenderer( rendererWidget->renderer() );
136+
QgsRasterRenderer* newRenderer = rendererWidget->renderer();
137+
138+
// there are transparency related data stored in renderer instances, but they
139+
// are not configured in the widget, so we need to copy them over from existing renderer
140+
QgsRasterRenderer* oldRenderer = mRasterLayer->renderer();
141+
if ( oldRenderer )
142+
newRenderer->copyCommonProperties( oldRenderer );
143+
144+
mRasterLayer->setRenderer( newRenderer );
137145
}
138146

139147
// Hue and saturation controls

0 commit comments

Comments
 (0)