39#include "moc_qgsrendererrasterpropertieswidget.cpp"
41using namespace Qt::StringLiterals;
43void QgsRendererRasterPropertiesWidget::initRendererWidgetFunctions()
45 static bool sInitialized =
false;
68 connect( mResetColorRenderingBtn, &QToolButton::clicked,
this, &QgsRendererRasterPropertiesWidget::mResetColorRenderingBtn_clicked );
70 initRendererWidgetFunctions();
72 mResamplingUtils.initWidgets( mRasterLayer, mZoomedInResamplingComboBox, mZoomedOutResamplingComboBox, mMaximumOversamplingSpinBox, mCbEarlyResampling );
76 connect( mSliderBrightness, &QAbstractSlider::valueChanged, mBrightnessSpinBox, &QSpinBox::setValue );
77 connect( mBrightnessSpinBox,
static_cast<void ( QSpinBox::* )(
int )
>( &QSpinBox::valueChanged ), mSliderBrightness, &QAbstractSlider::setValue );
78 mBrightnessSpinBox->setClearValue( 0 );
80 connect( mSliderContrast, &QAbstractSlider::valueChanged, mContrastSpinBox, &QSpinBox::setValue );
81 connect( mContrastSpinBox,
static_cast<void ( QSpinBox::* )(
int )
>( &QSpinBox::valueChanged ), mSliderContrast, &QAbstractSlider::setValue );
82 mContrastSpinBox->setClearValue( 0 );
84 connect( mSliderGamma, &QAbstractSlider::valueChanged,
this, &QgsRendererRasterPropertiesWidget::updateGammaSpinBox );
85 connect( mGammaSpinBox,
static_cast<void ( QDoubleSpinBox::* )(
double )
>( &QDoubleSpinBox::valueChanged ),
this, &QgsRendererRasterPropertiesWidget::updateGammaSlider );
86 mGammaSpinBox->setClearValue( 1.0 );
89 connect( sliderSaturation, &QAbstractSlider::valueChanged, spinBoxSaturation, &QSpinBox::setValue );
90 connect( spinBoxSaturation,
static_cast<void ( QSpinBox::* )(
int )
>( &QSpinBox::valueChanged ), sliderSaturation, &QAbstractSlider::setValue );
91 spinBoxSaturation->setClearValue( 0 );
94 connect( sliderColorizeStrength, &QAbstractSlider::valueChanged, spinColorizeStrength, &QSpinBox::setValue );
95 connect( spinColorizeStrength,
static_cast<void ( QSpinBox::* )(
int )
>( &QSpinBox::valueChanged ), sliderColorizeStrength, &QAbstractSlider::setValue );
96 spinColorizeStrength->setClearValue( 100 );
99 connect( comboGrayscale,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsRendererRasterPropertiesWidget::toggleSaturationControls );
102 connect( mColorizeCheck, &QAbstractButton::toggled,
this, &QgsRendererRasterPropertiesWidget::toggleColorizeControls );
105 connect( mBrightnessSpinBox,
static_cast<void ( QSpinBox::* )(
int )
>( &QSpinBox::valueChanged ),
this, &
QgsPanelWidget::changed );
106 connect( mContrastSpinBox,
static_cast<void ( QSpinBox::* )(
int )
>( &QSpinBox::valueChanged ),
this, &
QgsPanelWidget::changed );
107 connect( mGammaSpinBox,
static_cast<void ( QDoubleSpinBox::* )(
double )
>( &QDoubleSpinBox::valueChanged ),
this, &
QgsPanelWidget::changed );
108 connect( spinBoxSaturation,
static_cast<void ( QSpinBox::* )(
int )
>( &QSpinBox::valueChanged ),
this, &
QgsPanelWidget::changed );
109 connect( spinColorizeStrength,
static_cast<void ( QSpinBox::* )(
int )
>( &QSpinBox::valueChanged ),
this, &
QgsPanelWidget::changed );
113 connect( mBlendModeComboBox,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &
QgsPanelWidget::changed );
114 connect( mZoomedInResamplingComboBox,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &
QgsPanelWidget::changed );
115 connect( mZoomedOutResamplingComboBox,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &
QgsPanelWidget::changed );
116 connect( mMaximumOversamplingSpinBox,
static_cast<void ( QDoubleSpinBox::* )(
double )
>( &QDoubleSpinBox::valueChanged ),
this, &
QgsPanelWidget::changed );
133 const QString rendererName = cboRenderers->currentData().toString();
134 setRendererWidget( rendererName );
142 brightnessFilter->setBrightness( mSliderBrightness->value() );
143 brightnessFilter->setContrast( mSliderContrast->value() );
144 brightnessFilter->setGamma( mGammaSpinBox->value() );
149 rendererWidget->doComputations();
151 std::unique_ptr< QgsRasterRenderer > newRenderer( rendererWidget->renderer() );
157 newRenderer->copyCommonProperties( oldRenderer,
false );
158 mRasterLayer->setRenderer( newRenderer.release() );
165 hueSaturationFilter->setSaturation( sliderSaturation->value() );
167 hueSaturationFilter->setColorizeOn( mColorizeCheck->checkState() );
168 hueSaturationFilter->setColorizeColor( btnColorizeColor->color() );
169 hueSaturationFilter->setColorizeStrength( sliderColorizeStrength->value() );
170 hueSaturationFilter->setInvertColors( mInvertColorsCheck->isChecked() );
173 mResamplingUtils.refreshLayerFromWidgets();
175 mRasterLayer->setBlendMode( mBlendModeComboBox->blendMode() );
180 mRasterLayer =
layer;
182 cboRenderers->blockSignals(
true );
183 cboRenderers->clear();
186 for (
const QString &name : constRenderersList )
197 cboRenderers->setCurrentIndex( -1 );
198 cboRenderers->blockSignals(
false );
202 setRendererWidget( renderer->type() );
207 mSliderBrightness->setValue( brightnessFilter->brightness() );
208 mSliderContrast->setValue( brightnessFilter->contrast() );
209 mGammaSpinBox->setValue( brightnessFilter->gamma() );
212 btnColorizeColor->setColorDialogTitle( tr(
"Select Color" ) );
213 btnColorizeColor->setContext( u
"symbology"_s );
219 sliderSaturation->setValue( hueSaturationFilter->saturation() );
220 comboGrayscale->setCurrentIndex( (
int ) hueSaturationFilter->grayscaleMode() );
223 toggleSaturationControls(
static_cast<int>( hueSaturationFilter->grayscaleMode() ) );
226 mColorizeCheck->setChecked( hueSaturationFilter->colorizeOn() );
227 btnColorizeColor->setColor( hueSaturationFilter->colorizeColor() );
228 toggleColorizeControls( hueSaturationFilter->colorizeOn() );
229 sliderColorizeStrength->setValue( hueSaturationFilter->colorizeStrength() );
231 mInvertColorsCheck->setChecked( hueSaturationFilter->invertColors() );
236 mBlendModeComboBox->setBlendMode( mRasterLayer->blendMode() );
239 mResamplingUtils.refreshWidgetsFromLayer();
242void QgsRendererRasterPropertiesWidget::mResetColorRenderingBtn_clicked()
244 mBlendModeComboBox->setBlendMode( QPainter::CompositionMode_SourceOver );
245 mSliderBrightness->setValue( 0 );
246 mSliderContrast->setValue( 0 );
247 mGammaSpinBox->setValue( 1.0 );
248 sliderSaturation->setValue( 0 );
250 mColorizeCheck->setChecked(
false );
251 sliderColorizeStrength->setValue( 100 );
252 mInvertColorsCheck->setChecked(
false );
255void QgsRendererRasterPropertiesWidget::toggleSaturationControls(
int grayscaleMode )
258 if ( grayscaleMode == 0 )
260 sliderSaturation->setEnabled(
true );
261 spinBoxSaturation->setEnabled(
true );
265 sliderSaturation->setEnabled(
false );
266 spinBoxSaturation->setEnabled(
false );
271void QgsRendererRasterPropertiesWidget::toggleColorizeControls(
bool colorizeEnabled )
274 btnColorizeColor->setEnabled( colorizeEnabled );
275 sliderColorizeStrength->setEnabled( colorizeEnabled );
276 spinColorizeStrength->setEnabled( colorizeEnabled );
280void QgsRendererRasterPropertiesWidget::setRendererWidget(
const QString &rendererName )
283 QgsRasterRendererWidget *oldWidget = mRendererWidget;
288 if ( QgsRasterRenderer *oldRenderer = mRasterLayer->renderer() )
291 alphaBand = oldRenderer->alphaBand();
292 opacity = oldRenderer->opacity();
293 nodataColor = oldRenderer->nodataColor();
296 QgsRasterRendererRegistryEntry rendererEntry;
305 : mRasterLayer->extent();
308 std::unique_ptr<QgsRasterRenderer> oldRenderer( oldWidget->
renderer() );
309 if ( !oldRenderer || oldRenderer->type() != rendererName )
311 if ( rendererName ==
"singlebandgray"_L1 )
315 whileBlocking( mRasterLayer )->setDefaultContrastEnhancement();
317 else if ( rendererName ==
"multibandcolor"_L1 )
321 whileBlocking( mRasterLayer )->setDefaultContrastEnhancement();
325 mRasterLayer->renderer()->setAlphaBand( alphaBand );
326 mRasterLayer->renderer()->setOpacity( opacity );
327 mRasterLayer->renderer()->setNodataColor( nodataColor );
331 stackedWidget->addWidget( mRendererWidget );
332 stackedWidget->setCurrentWidget( mRendererWidget );
337 std::unique_ptr< QgsRasterRenderer > oldRenderer( oldWidget->
renderer() );
338 std::unique_ptr< QgsRasterRenderer > newRenderer( mRendererWidget->renderer() );
339 QList<int> oldBands = oldRenderer->usesBands();
340 QList<int> newBands = newRenderer->usesBands();
342 if ( oldBands != newBands )
344 populateTransparencyTable( newRenderer );
351 if ( mRendererWidget != oldWidget )
354 const int widgetIndex = cboRenderers->findData( rendererName );
355 if ( widgetIndex != -1 )
357 whileBlocking( cboRenderers )->setCurrentIndex( widgetIndex );
361void QgsRendererRasterPropertiesWidget::refreshAfterStyleChanged()
363 if ( mRendererWidget )
365 QgsRasterRenderer *renderer = mRasterLayer->renderer();
366 if ( QgsMultiBandColorRenderer *mbcr =
dynamic_cast<QgsMultiBandColorRenderer *
>( renderer ) )
368 const QgsContrastEnhancement *redCe = mbcr->redContrastEnhancement();
371 mRendererWidget->setMin( QLocale().toString( redCe->
minimumValue() ), 0 );
372 mRendererWidget->setMax( QLocale().toString( redCe->
maximumValue() ), 0 );
374 const QgsContrastEnhancement *greenCe = mbcr->greenContrastEnhancement();
377 mRendererWidget->setMin( QLocale().toString( greenCe->
minimumValue() ), 1 );
378 mRendererWidget->setMax( QLocale().toString( greenCe->
maximumValue() ), 1 );
380 const QgsContrastEnhancement *blueCe = mbcr->blueContrastEnhancement();
383 mRendererWidget->setMin( QLocale().toString( blueCe->
minimumValue() ), 2 );
384 mRendererWidget->setMax( QLocale().toString( blueCe->
maximumValue() ), 2 );
387 else if ( QgsSingleBandGrayRenderer *sbgr =
dynamic_cast<QgsSingleBandGrayRenderer *
>( renderer ) )
389 const QgsContrastEnhancement *ce = sbgr->contrastEnhancement();
392 mRendererWidget->setMin( QLocale().toString( ce->
minimumValue() ) );
393 mRendererWidget->setMax( QLocale().toString( ce->
maximumValue() ) );
399void QgsRendererRasterPropertiesWidget::updateGammaSpinBox(
int value )
401 mGammaSpinBox->setValue( value / 100.0 );
404void QgsRendererRasterPropertiesWidget::updateGammaSlider(
double value )
406 mSliderGamma->setValue( value * 100 );
@ SingleBandColorData
Single band containing color data.
@ SingleBandGray
A single band image drawn as a range of gray colors.
@ MultiBandColor
A layer containing 2 or more bands, mapped to RGB color space. In the case of a multiband with only t...
static QgsRasterRendererRegistry * rasterRendererRegistry()
Returns the application's raster renderer registry, used for managing raster layer renderers.
Brightness/contrast and gamma correction filter pipe for rasters.
double minimumValue() const
Returns the minimum value for the contrast enhancement range.
double maximumValue() const
Returns the maximum value for the contrast enhancement range.
Color and saturation filter pipe for rasters.
Map canvas is a class for displaying all GIS data types on a canvas.
Base class for all map layer types.
void styleChanged()
Signal emitted whenever a change affects the layer's style.
static bool layerIsContainedInGroupLayer(QgsProject *project, QgsMapLayer *layer)
Returns true if the specified layer is a child layer from any QgsGroupLayer in the given project.
static QgsProject * instance()
Returns the QgsProject singleton instance.
Represents a raster layer.
void insertWidgetFunction(const QString &rendererName, QgsRasterRendererWidgetCreateFunc func)
Sets the widget creation function for a renderer.
QStringList renderersList() const
Returns a list of the names of registered renderers.
Raster renderer pipe that applies colors to a raster.
QgsSignalBlocker< Object > whileBlocking(Object *object)
Temporarily blocks signals from a QObject while calling a single method from the object.
#define QgsDebugMsgLevel(str, level)
Registry for raster renderer entries.
QgsRasterRendererWidgetCreateFunc widgetCreateFunction