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 );
107 connect( mGammaSpinBox,
static_cast<void ( QDoubleSpinBox::* )(
double )
>( &QDoubleSpinBox::valueChanged ),
this, &
QgsPanelWidget::widgetChanged );
113 connect( mBlendModeComboBox,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &
QgsPanelWidget::widgetChanged );
114 connect( mZoomedInResamplingComboBox,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &
QgsPanelWidget::widgetChanged );
115 connect( mZoomedOutResamplingComboBox,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &
QgsPanelWidget::widgetChanged );
116 connect( mMaximumOversamplingSpinBox,
static_cast<void ( QDoubleSpinBox::* )(
double )
>( &QDoubleSpinBox::valueChanged ),
this, &
QgsPanelWidget::widgetChanged );
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();
156 newRenderer->copyCommonProperties( oldRenderer,
false );
157 mRasterLayer->setRenderer( newRenderer );
164 hueSaturationFilter->setSaturation( sliderSaturation->value() );
166 hueSaturationFilter->setColorizeOn( mColorizeCheck->checkState() );
167 hueSaturationFilter->setColorizeColor( btnColorizeColor->color() );
168 hueSaturationFilter->setColorizeStrength( sliderColorizeStrength->value() );
169 hueSaturationFilter->setInvertColors( mInvertColorsCheck->isChecked() );
172 mResamplingUtils.refreshLayerFromWidgets();
174 mRasterLayer->setBlendMode( mBlendModeComboBox->blendMode() );
179 mRasterLayer = layer;
181 cboRenderers->blockSignals(
true );
182 cboRenderers->clear();
185 for (
const QString &name : constRenderersList )
196 cboRenderers->setCurrentIndex( -1 );
197 cboRenderers->blockSignals(
false );
201 setRendererWidget( renderer->type() );
206 mSliderBrightness->setValue( brightnessFilter->brightness() );
207 mSliderContrast->setValue( brightnessFilter->contrast() );
208 mGammaSpinBox->setValue( brightnessFilter->gamma() );
211 btnColorizeColor->setColorDialogTitle( tr(
"Select Color" ) );
212 btnColorizeColor->setContext( u
"symbology"_s );
218 sliderSaturation->setValue( hueSaturationFilter->saturation() );
219 comboGrayscale->setCurrentIndex( (
int ) hueSaturationFilter->grayscaleMode() );
222 toggleSaturationControls(
static_cast<int>( hueSaturationFilter->grayscaleMode() ) );
225 mColorizeCheck->setChecked( hueSaturationFilter->colorizeOn() );
226 btnColorizeColor->setColor( hueSaturationFilter->colorizeColor() );
227 toggleColorizeControls( hueSaturationFilter->colorizeOn() );
228 sliderColorizeStrength->setValue( hueSaturationFilter->colorizeStrength() );
230 mInvertColorsCheck->setChecked( hueSaturationFilter->invertColors() );
235 mBlendModeComboBox->setBlendMode( mRasterLayer->blendMode() );
238 mResamplingUtils.refreshWidgetsFromLayer();
241void QgsRendererRasterPropertiesWidget::mResetColorRenderingBtn_clicked()
243 mBlendModeComboBox->setBlendMode( QPainter::CompositionMode_SourceOver );
244 mSliderBrightness->setValue( 0 );
245 mSliderContrast->setValue( 0 );
246 mGammaSpinBox->setValue( 1.0 );
247 sliderSaturation->setValue( 0 );
249 mColorizeCheck->setChecked(
false );
250 sliderColorizeStrength->setValue( 100 );
251 mInvertColorsCheck->setChecked(
false );
254void QgsRendererRasterPropertiesWidget::toggleSaturationControls(
int grayscaleMode )
257 if ( grayscaleMode == 0 )
259 sliderSaturation->setEnabled(
true );
260 spinBoxSaturation->setEnabled(
true );
264 sliderSaturation->setEnabled(
false );
265 spinBoxSaturation->setEnabled(
false );
270void QgsRendererRasterPropertiesWidget::toggleColorizeControls(
bool colorizeEnabled )
273 btnColorizeColor->setEnabled( colorizeEnabled );
274 sliderColorizeStrength->setEnabled( colorizeEnabled );
275 spinColorizeStrength->setEnabled( colorizeEnabled );
279void QgsRendererRasterPropertiesWidget::setRendererWidget(
const QString &rendererName )
282 QgsRasterRendererWidget *oldWidget = mRendererWidget;
287 if ( QgsRasterRenderer *oldRenderer = mRasterLayer->renderer() )
290 alphaBand = oldRenderer->alphaBand();
291 opacity = oldRenderer->opacity();
292 nodataColor = oldRenderer->nodataColor();
295 QgsRasterRendererRegistryEntry rendererEntry;
304 : mRasterLayer->extent();
307 std::unique_ptr<QgsRasterRenderer> oldRenderer( oldWidget->
renderer() );
308 if ( !oldRenderer || oldRenderer->type() != rendererName )
310 if ( rendererName ==
"singlebandgray"_L1 )
313 whileBlocking( mRasterLayer )->setDefaultContrastEnhancement();
315 else if ( rendererName ==
"multibandcolor"_L1 )
318 whileBlocking( mRasterLayer )->setDefaultContrastEnhancement();
322 mRasterLayer->renderer()->setAlphaBand( alphaBand );
323 mRasterLayer->renderer()->setOpacity( opacity );
324 mRasterLayer->renderer()->setNodataColor( nodataColor );
328 stackedWidget->addWidget( mRendererWidget );
329 stackedWidget->setCurrentWidget( mRendererWidget );
333 QgsRasterRenderer *oldRenderer = oldWidget->
renderer();
334 QgsRasterRenderer *newRenderer = mRendererWidget->renderer();
336 QList<int> oldBands = oldRenderer->
usesBands();
337 QList<int> newBands = newRenderer->
usesBands();
339 if ( oldBands != newBands )
341 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.
virtual QList< int > usesBands() const
Returns a list of band numbers used by the renderer.
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