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 )
195 cboRenderers->setCurrentIndex( -1 );
196 cboRenderers->blockSignals(
false );
200 setRendererWidget( renderer->type() );
205 mSliderBrightness->setValue( brightnessFilter->brightness() );
206 mSliderContrast->setValue( brightnessFilter->contrast() );
207 mGammaSpinBox->setValue( brightnessFilter->gamma() );
210 btnColorizeColor->setColorDialogTitle( tr(
"Select Color" ) );
211 btnColorizeColor->setContext( u
"symbology"_s );
217 sliderSaturation->setValue( hueSaturationFilter->saturation() );
218 comboGrayscale->setCurrentIndex( (
int ) hueSaturationFilter->grayscaleMode() );
221 toggleSaturationControls(
static_cast<int>( hueSaturationFilter->grayscaleMode() ) );
224 mColorizeCheck->setChecked( hueSaturationFilter->colorizeOn() );
225 btnColorizeColor->setColor( hueSaturationFilter->colorizeColor() );
226 toggleColorizeControls( hueSaturationFilter->colorizeOn() );
227 sliderColorizeStrength->setValue( hueSaturationFilter->colorizeStrength() );
229 mInvertColorsCheck->setChecked( hueSaturationFilter->invertColors() );
234 mBlendModeComboBox->setBlendMode( mRasterLayer->blendMode() );
237 mResamplingUtils.refreshWidgetsFromLayer();
240void QgsRendererRasterPropertiesWidget::mResetColorRenderingBtn_clicked()
242 mBlendModeComboBox->setBlendMode( QPainter::CompositionMode_SourceOver );
243 mSliderBrightness->setValue( 0 );
244 mSliderContrast->setValue( 0 );
245 mGammaSpinBox->setValue( 1.0 );
246 sliderSaturation->setValue( 0 );
248 mColorizeCheck->setChecked(
false );
249 sliderColorizeStrength->setValue( 100 );
250 mInvertColorsCheck->setChecked(
false );
253void QgsRendererRasterPropertiesWidget::toggleSaturationControls(
int grayscaleMode )
256 if ( grayscaleMode == 0 )
258 sliderSaturation->setEnabled(
true );
259 spinBoxSaturation->setEnabled(
true );
263 sliderSaturation->setEnabled(
false );
264 spinBoxSaturation->setEnabled(
false );
269void QgsRendererRasterPropertiesWidget::toggleColorizeControls(
bool colorizeEnabled )
272 btnColorizeColor->setEnabled( colorizeEnabled );
273 sliderColorizeStrength->setEnabled( colorizeEnabled );
274 spinColorizeStrength->setEnabled( colorizeEnabled );
278void QgsRendererRasterPropertiesWidget::setRendererWidget(
const QString &rendererName )
281 QgsRasterRendererWidget *oldWidget = mRendererWidget;
286 if ( QgsRasterRenderer *oldRenderer = mRasterLayer->renderer() )
289 alphaBand = oldRenderer->alphaBand();
290 opacity = oldRenderer->opacity();
291 nodataColor = oldRenderer->nodataColor();
294 QgsRasterRendererRegistryEntry rendererEntry;
303 : mRasterLayer->extent();
306 std::unique_ptr<QgsRasterRenderer> oldRenderer( oldWidget->
renderer() );
307 if ( !oldRenderer || oldRenderer->type() != rendererName )
309 if ( rendererName ==
"singlebandgray"_L1 )
312 whileBlocking( mRasterLayer )->setDefaultContrastEnhancement();
314 else if ( rendererName ==
"multibandcolor"_L1 )
317 whileBlocking( mRasterLayer )->setDefaultContrastEnhancement();
321 mRasterLayer->renderer()->setAlphaBand( alphaBand );
322 mRasterLayer->renderer()->setOpacity( opacity );
323 mRasterLayer->renderer()->setNodataColor( nodataColor );
327 stackedWidget->addWidget( mRendererWidget );
328 stackedWidget->setCurrentWidget( mRendererWidget );
332 QgsRasterRenderer *oldRenderer = oldWidget->
renderer();
333 QgsRasterRenderer *newRenderer = mRendererWidget->renderer();
335 QList<int> oldBands = oldRenderer->
usesBands();
336 QList<int> newBands = newRenderer->
usesBands();
338 if ( oldBands != newBands )
340 populateTransparencyTable( newRenderer );
350 if ( mRendererWidget != oldWidget )
353 const int widgetIndex = cboRenderers->findData( rendererName );
354 if ( widgetIndex != -1 )
356 whileBlocking( cboRenderers )->setCurrentIndex( widgetIndex );
360void QgsRendererRasterPropertiesWidget::refreshAfterStyleChanged()
362 if ( mRendererWidget )
364 QgsRasterRenderer *renderer = mRasterLayer->renderer();
365 if ( QgsMultiBandColorRenderer *mbcr =
dynamic_cast<QgsMultiBandColorRenderer *
>( renderer ) )
367 const QgsContrastEnhancement *redCe = mbcr->redContrastEnhancement();
370 mRendererWidget->setMin( QLocale().toString( redCe->
minimumValue() ), 0 );
371 mRendererWidget->setMax( QLocale().toString( redCe->
maximumValue() ), 0 );
373 const QgsContrastEnhancement *greenCe = mbcr->greenContrastEnhancement();
376 mRendererWidget->setMin( QLocale().toString( greenCe->
minimumValue() ), 1 );
377 mRendererWidget->setMax( QLocale().toString( greenCe->
maximumValue() ), 1 );
379 const QgsContrastEnhancement *blueCe = mbcr->blueContrastEnhancement();
382 mRendererWidget->setMin( QLocale().toString( blueCe->
minimumValue() ), 2 );
383 mRendererWidget->setMax( QLocale().toString( blueCe->
maximumValue() ), 2 );
386 else if ( QgsSingleBandGrayRenderer *sbgr =
dynamic_cast<QgsSingleBandGrayRenderer *
>( renderer ) )
388 const QgsContrastEnhancement *ce = sbgr->contrastEnhancement();
391 mRendererWidget->setMin( QLocale().toString( ce->
minimumValue() ) );
392 mRendererWidget->setMax( QLocale().toString( ce->
maximumValue() ) );
398void QgsRendererRasterPropertiesWidget::updateGammaSpinBox(
int value )
400 mGammaSpinBox->setValue( value / 100.0 );
403void QgsRendererRasterPropertiesWidget::updateGammaSlider(
double value )
405 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