void QgsRasterTransparencyWidget::syncToLayer() { if ( ! mRasterLayer->isValid() ) return; QgsRasterDataProvider *provider = mRasterLayer->dataProvider(); QgsRasterRenderer *renderer = mRasterLayer->renderer(); if ( provider ) { if ( provider->dataType( 1 ) == Qgis::ARGB32 || provider->dataType( 1 ) == Qgis::ARGB32_Premultiplied ) { gboxNoDataValue->setEnabled( false ); gboxCustomTransparency->setEnabled( false ); } cboxTransparencyBand->setShowNotSetOption( true, tr( "None" ) ); cboxTransparencyBand->setLayer( mRasterLayer ); mOpacityWidget->setOpacity( renderer->opacity() ); cboxTransparencyBand->setBand( renderer->alphaBand() ); } if ( mRasterLayer->dataProvider()->sourceHasNoDataValue( 1 ) ) { lblSrcNoDataValue->setText( QgsRasterBlock::printValue( mRasterLayer->dataProvider()->sourceNoDataValue( 1 ) ) ); } else { lblSrcNoDataValue->setText( tr( "not defined" ) ); } mSrcNoDataValueCheckBox->setChecked( mRasterLayer->dataProvider()->useSourceNoDataValue( 1 ) ); bool enableSrcNoData = mRasterLayer->dataProvider()->sourceHasNoDataValue( 1 ) && !std::isnan( mRasterLayer->dataProvider()->sourceNoDataValue( 1 ) ); mSrcNoDataValueCheckBox->setEnabled( enableSrcNoData ); lblSrcNoDataValue->setEnabled( enableSrcNoData ); QgsRasterRangeList noDataRangeList = mRasterLayer->dataProvider()->userNoDataValues( 1 ); QgsDebugMsg( QStringLiteral( "noDataRangeList.size = %1" ).arg( noDataRangeList.size() ) ); if ( !noDataRangeList.isEmpty() ) { leNoDataValue->insert( QgsRasterBlock::printValue( noDataRangeList.value( 0 ).min() ) ); } else { leNoDataValue->insert( QString() ); } populateTransparencyTable( mRasterLayer->renderer() ); }
void QgsRendererRasterPropertiesWidget::setRendererWidget( const QString &rendererName ) { QgsDebugMsg( "rendererName = " + rendererName ); QgsRasterRendererWidget *oldWidget = mRendererWidget; QgsRasterRenderer *oldRenderer = mRasterLayer->renderer(); int alphaBand = -1; double opacity = 1; if ( oldRenderer ) { // Retain alpha band and opacity when switching renderer alphaBand = oldRenderer->alphaBand(); opacity = oldRenderer->opacity(); } QgsRasterRendererRegistryEntry rendererEntry; if ( QgsApplication::rasterRendererRegistry()->rendererData( rendererName, rendererEntry ) ) { if ( rendererEntry.widgetCreateFunction ) // Single band color data renderer e.g. has no widget { QgsDebugMsg( QStringLiteral( "renderer has widgetCreateFunction" ) ); // Current canvas extent (used to calc min/max) in layer CRS QgsRectangle myExtent = mMapCanvas->mapSettings().outputExtentToLayerExtent( mRasterLayer, mMapCanvas->extent() ); if ( oldWidget ) { if ( rendererName == QLatin1String( "singlebandgray" ) ) { whileBlocking( mRasterLayer )->setRenderer( QgsApplication::rasterRendererRegistry()->defaultRendererForDrawingStyle( QgsRaster::SingleBandGray, mRasterLayer->dataProvider() ) ); whileBlocking( mRasterLayer )->setDefaultContrastEnhancement(); } else if ( rendererName == QLatin1String( "multibandcolor" ) ) { whileBlocking( mRasterLayer )->setRenderer( QgsApplication::rasterRendererRegistry()->defaultRendererForDrawingStyle( QgsRaster::MultiBandColor, mRasterLayer->dataProvider() ) ); whileBlocking( mRasterLayer )->setDefaultContrastEnhancement(); } } mRasterLayer->renderer()->setAlphaBand( alphaBand ); mRasterLayer->renderer()->setOpacity( opacity ); mRendererWidget = rendererEntry.widgetCreateFunction( mRasterLayer, myExtent ); mRendererWidget->setMapCanvas( mMapCanvas ); connect( mRendererWidget, &QgsRasterRendererWidget::widgetChanged, this, &QgsPanelWidget::widgetChanged ); stackedWidget->addWidget( mRendererWidget ); stackedWidget->setCurrentWidget( mRendererWidget ); if ( oldWidget ) { // Compare used bands in new and old renderer and reset transparency dialog if different QgsRasterRenderer *oldRenderer = oldWidget->renderer(); QgsRasterRenderer *newRenderer = mRendererWidget->renderer(); #if 0 QList<int> oldBands = oldRenderer->usesBands(); QList<int> newBands = newRenderer->usesBands(); if ( oldBands != newBands ) { populateTransparencyTable( newRenderer ); } #endif delete oldRenderer; delete newRenderer; } } } if ( mRendererWidget != oldWidget ) delete oldWidget; int widgetIndex = cboRenderers->findData( rendererName ); if ( widgetIndex != -1 ) { whileBlocking( cboRenderers )->setCurrentIndex( widgetIndex ); } }