Skip to content

Commit 632f9c5

Browse files
authoredJan 9, 2017
Fix for alphaBand and opacity loss upon renderer switch (style dock & properties window) (#3967)
* [styledock] maintain raster alpha band and opacity when switching renderer * [raster] fix alphaBand/opacity loss when opening layer properties (fixes #16044)
1 parent 015fdf2 commit 632f9c5

File tree

3 files changed

+35
-3
lines changed

3 files changed

+35
-3
lines changed
 

‎src/app/qgsrasterlayerproperties.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -540,6 +540,16 @@ void QgsRasterLayerProperties::setRendererWidget( const QString& rendererName )
540540
{
541541
QgsDebugMsg( "rendererName = " + rendererName );
542542
QgsRasterRendererWidget* oldWidget = mRendererWidget;
543+
QgsRasterRenderer* oldRenderer = mRasterLayer->renderer();
544+
545+
int alphaBand = -1;
546+
double opacity = 1;
547+
if ( oldRenderer )
548+
{
549+
// Retain alpha band and opacity when switching renderer
550+
alphaBand = oldRenderer->alphaBand();
551+
opacity = oldRenderer->opacity();
552+
}
543553

544554
QgsRasterRendererRegistryEntry rendererEntry;
545555
if ( QgsApplication::rasterRendererRegistry()->rendererData( rendererName, rendererEntry ) )
@@ -562,6 +572,8 @@ void QgsRasterLayerProperties::setRendererWidget( const QString& rendererName )
562572
whileBlocking( mRasterLayer )->setDefaultContrastEnhancement();
563573
}
564574
}
575+
mRasterLayer->renderer()->setAlphaBand( alphaBand );
576+
mRasterLayer->renderer()->setOpacity( opacity );
565577
mRendererWidget = rendererEntry.widgetCreateFunction( mRasterLayer, myExtent );
566578
mRendererWidget->setMapCanvas( mMapCanvas );
567579
mRendererStackedWidget->addWidget( mRendererWidget );

‎src/core/raster/qgsrasterlayer.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1258,7 +1258,11 @@ QDateTime QgsRasterLayer::timestamp() const
12581258
void QgsRasterLayer::setRenderer( QgsRasterRenderer* theRenderer )
12591259
{
12601260
QgsDebugMsgLevel( "Entered", 4 );
1261-
if ( !theRenderer ) { return; }
1261+
if ( !theRenderer )
1262+
{
1263+
return;
1264+
}
1265+
12621266
mPipe.set( theRenderer );
12631267
emit rendererChanged();
12641268
emit styleChanged();

‎src/gui/raster/qgsrendererrasterpropertieswidget.cpp

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
#include "qgssinglebandgrayrenderer.h"
3434

3535

36+
#include "qgsmessagelog.h"
37+
3638
static void _initRendererWidgetFunctions()
3739
{
3840
static bool initialized = false;
@@ -319,11 +321,21 @@ void QgsRendererRasterPropertiesWidget::setRendererWidget( const QString &render
319321
{
320322
QgsDebugMsg( "rendererName = " + rendererName );
321323
QgsRasterRendererWidget* oldWidget = mRendererWidget;
324+
QgsRasterRenderer* oldRenderer = mRasterLayer->renderer();
325+
326+
int alphaBand = -1;
327+
double opacity = 1;
328+
if ( oldRenderer )
329+
{
330+
// Retain alpha band and opacity when switching renderer
331+
alphaBand = oldRenderer->alphaBand();
332+
opacity = oldRenderer->opacity();
333+
}
322334

323335
QgsRasterRendererRegistryEntry rendererEntry;
324336
if ( QgsApplication::rasterRendererRegistry()->rendererData( rendererName, rendererEntry ) )
325337
{
326-
if ( rendererEntry.widgetCreateFunction ) //single band color data renderer e.g. has no widget
338+
if ( rendererEntry.widgetCreateFunction ) // Single band color data renderer e.g. has no widget
327339
{
328340
QgsDebugMsg( "renderer has widgetCreateFunction" );
329341
// Current canvas extent (used to calc min/max) in layer CRS
@@ -341,22 +353,26 @@ void QgsRendererRasterPropertiesWidget::setRendererWidget( const QString &render
341353
whileBlocking( mRasterLayer )->setDefaultContrastEnhancement();
342354
}
343355
}
356+
mRasterLayer->renderer()->setAlphaBand( alphaBand );
357+
mRasterLayer->renderer()->setOpacity( opacity );
344358
mRendererWidget = rendererEntry.widgetCreateFunction( mRasterLayer, myExtent );
345359
mRendererWidget->setMapCanvas( mMapCanvas );
346360
connect( mRendererWidget, SIGNAL( widgetChanged() ), this, SIGNAL( widgetChanged() ) );
347361
stackedWidget->addWidget( mRendererWidget );
348362
stackedWidget->setCurrentWidget( mRendererWidget );
349363
if ( oldWidget )
350364
{
351-
//compare used bands in new and old renderer and reset transparency dialog if different
365+
// Compare used bands in new and old renderer and reset transparency dialog if different
352366
QgsRasterRenderer* oldRenderer = oldWidget->renderer();
353367
QgsRasterRenderer* newRenderer = mRendererWidget->renderer();
354368
QList<int> oldBands = oldRenderer->usesBands();
355369
QList<int> newBands = newRenderer->usesBands();
370+
356371
// if ( oldBands != newBands )
357372
// {
358373
// populateTransparencyTable( newRenderer );
359374
// }
375+
360376
delete oldRenderer;
361377
delete newRenderer;
362378
}

0 commit comments

Comments
 (0)
Please sign in to comment.