75#include <QColorDialog>
76#include <QDesktopServices>
80#include <QLinearGradient>
86#include <QPainterPath>
88#include <QRegularExpression>
89#include <QRegularExpressionValidator>
92#include <QTableWidgetItem>
97#include "moc_qgsrasterlayerproperties.cpp"
99using namespace Qt::StringLiterals;
104 , TRSTRING_NOT_SET( tr(
"Not Set" ) )
107 mGrayMinimumMaximumEstimated =
true;
108 mRGBMinimumMaximumEstimated =
true;
113 mOptsPage_Information->layout()->addWidget( mMetadataViewer );
117 transparencyScrollArea->setWidget( mRasterTransparencyWidget );
120 QVBoxLayout *vl =
new QVBoxLayout();
121 vl->setContentsMargins( 0, 0, 0, 0 );
122 vl->addWidget( mLabelingWidget );
123 mOptsPage_Labeling->setLayout( vl );
125 connect( buttonBuildPyramids, &QPushButton::clicked,
this, &QgsRasterLayerProperties::buttonBuildPyramids_clicked );
127 connect( mRenderTypeComboBox,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsRasterLayerProperties::mRenderTypeComboBox_currentIndexChanged );
128 connect( mResetColorRenderingBtn, &QToolButton::clicked,
this, &QgsRasterLayerProperties::mResetColorRenderingBtn_clicked );
133 connect( buttonBox, &QDialogButtonBox::helpRequested,
this, &QgsRasterLayerProperties::showHelp );
135 mSourceGroupBox->hide();
137 mBtnStyle =
new QPushButton( tr(
"Style" ) );
138 buttonBox->addButton(
mBtnStyle, QDialogButtonBox::ResetRole );
152 connect( mSliderBrightness, &QAbstractSlider::valueChanged, mBrightnessSpinBox, &QSpinBox::setValue );
153 connect( mBrightnessSpinBox,
static_cast<void ( QSpinBox::* )(
int )
>( &QSpinBox::valueChanged ), mSliderBrightness, &QAbstractSlider::setValue );
154 mBrightnessSpinBox->setClearValue( 0 );
156 connect( mSliderContrast, &QAbstractSlider::valueChanged, mContrastSpinBox, &QSpinBox::setValue );
157 connect( mContrastSpinBox,
static_cast<void ( QSpinBox::* )(
int )
>( &QSpinBox::valueChanged ), mSliderContrast, &QAbstractSlider::setValue );
158 mContrastSpinBox->setClearValue( 0 );
161 connect( mSliderGamma, &QAbstractSlider::valueChanged,
this, &QgsRasterLayerProperties::updateGammaSpinBox );
162 connect( mGammaSpinBox,
static_cast<void ( QDoubleSpinBox::* )(
double )
>( &QDoubleSpinBox::valueChanged ),
this, &QgsRasterLayerProperties::updateGammaSlider );
163 mGammaSpinBox->setClearValue( 1.0 );
166 connect( sliderSaturation, &QAbstractSlider::valueChanged, spinBoxSaturation, &QSpinBox::setValue );
167 connect( spinBoxSaturation,
static_cast<void ( QSpinBox::* )(
int )
>( &QSpinBox::valueChanged ), sliderSaturation, &QAbstractSlider::setValue );
168 spinBoxSaturation->setClearValue( 0 );
171 connect( sliderColorizeStrength, &QAbstractSlider::valueChanged, spinColorizeStrength, &QSpinBox::setValue );
172 connect( spinColorizeStrength,
static_cast<void ( QSpinBox::* )(
int )
>( &QSpinBox::valueChanged ), sliderColorizeStrength, &QAbstractSlider::setValue );
173 spinColorizeStrength->setClearValue( 100 );
176 connect( comboGrayscale,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsRasterLayerProperties::toggleSaturationControls );
179 connect( mColorizeCheck, &QAbstractButton::toggled,
this, &QgsRasterLayerProperties::toggleColorizeControls );
182 connect( lbxPyramidResolutions, &QListWidget::itemSelectionChanged,
this, &QgsRasterLayerProperties::toggleBuildPyramidsButton );
184 mRefreshSettingsWidget->setLayer( mRasterLayer );
185 mMapLayerServerPropertiesWidget->setHasWfsTitle(
false );
186 mMapLayerServerPropertiesWidget->setServerProperties( mRasterLayer->serverProperties() );
189 mScaleRangeWidget->setMapCanvas(
mCanvas );
204 mEnableMapTips->setChecked( mRasterLayer->mapTipsEnabled() );
206 updateRasterAttributeTableOptionsPage();
210 connect( mCreateRasterAttributeTableButton, &QPushButton::clicked,
this, [
this] {
211 if ( mRasterLayer->canCreateRasterAttributeTable() )
216 if ( dlg.exec() == QDialog::Accepted )
218 updateRasterAttributeTableOptionsPage();
223 connect( mLoadRasterAttributeTableFromFileButton, &QPushButton::clicked,
this, [
this] {
227 if ( dlg.exec() == QDialog::Accepted )
229 updateRasterAttributeTableOptionsPage();
233 mBackupCrs = mRasterLayer->crs();
236 if (
mCanvas && mRasterTransparencyWidget->pixelSelectorTool() )
246 connect( mRasterTransparencyWidget->pbnAddValuesFromDisplay, &QPushButton::clicked,
this, [
this] {
251 mCanvas->window()->raise();
252 mCanvas->window()->activateWindow();
253 mCanvas->window()->setFocus();
259 mContext =
mCanvas->createExpressionContext();
273 connect( mInsertExpressionButton, &QAbstractButton::clicked,
this, [
this] {
275 int selectionStart = mMapTipWidget->selectionStart();
276 int selectionEnd = mMapTipWidget->selectionEnd();
280 exprDlg.setWindowTitle( tr(
"Insert Expression" ) );
281 if ( exprDlg.exec() == QDialog::Accepted && !exprDlg.
expressionText().trimmed().isEmpty() )
282 mMapTipWidget->insertText(
"[%" + exprDlg.
expressionText().trimmed() +
"%]" );
284 mMapTipWidget->setLinearSelection( selectionStart, selectionEnd );
293 cboResamplingMethod->clear();
296 for (
const QPair<QString, QString> &method : std::as_const( constProviderType ) )
298 cboResamplingMethod->addItem( method.second, method.first );
302 QString prefix = provider->name() +
"/driverOptions/_pyramids/";
304 QString defaultMethod = mySettings.
value( prefix +
"resampling",
"AVERAGE" ).toString();
305 int idx = cboResamplingMethod->findData( defaultMethod );
307 cboResamplingMethod->setCurrentIndex( idx );
311 const QList<QgsRasterPyramid> myPyramidList = provider->buildPyramidList();
315 if ( pyramid.getExists() )
317 lbxPyramidResolutions->addItem(
new QListWidgetItem( myPyramidPixmap, QString::number( pyramid.getXDim() ) + u
" x "_s + QString::number( pyramid.getYDim() ) ) );
321 lbxPyramidResolutions->addItem(
new QListWidgetItem( myNoPyramidPixmap, QString::number( pyramid.getXDim() ) + u
" x "_s + QString::number( pyramid.getYDim() ) ) );
328 mOptsPage_Pyramids->setEnabled(
false );
337 mOptsPage_Histogram->setEnabled(
false );
340 QVBoxLayout *layout =
new QVBoxLayout( metadataFrame );
341 layout->setContentsMargins( 0, 0, 0, 0 );
343 mMetadataWidget->layout()->setContentsMargins( 0, 0, 0, 0 );
344 mMetadataWidget->setMapCanvas(
mCanvas );
345 layout->addWidget( mMetadataWidget );
346 metadataFrame->setLayout( layout );
348 QVBoxLayout *temporalLayout =
new QVBoxLayout( temporalFrame );
349 temporalLayout->setContentsMargins( 0, 0, 0, 0 );
351 temporalLayout->addWidget( mTemporalWidget );
354 QgsDebugMsgLevel(
"Setting crs to " + mRasterLayer->crs().userFriendlyIdentifier(), 2 );
355 mCrsSelector->setCrs( mRasterLayer->crs() );
358 QString pyramidFormat( u
"<h2>%1</h2><p>%2 %3 %4</p><b><font color='red'><p>%5</p><p>%6</p>"_s );
359 QString pyramidHeader = tr(
"Description" );
360 QString pyramidSentence1 = tr(
"Large resolution raster layers can slow navigation in QGIS." );
361 QString pyramidSentence2 = tr(
"By creating lower resolution copies of the data (pyramids) performance can be considerably improved as QGIS selects the most suitable resolution to use depending on the level of zoom." );
362 QString pyramidSentence3 = tr(
"You must have write access in the directory where the original data is stored to build pyramids." );
363 QString pyramidSentence4 = tr(
"Please note that building internal pyramids may alter the original data file and once created they cannot be removed!" );
364 QString pyramidSentence5 = tr(
"Please note that building internal pyramids could corrupt your image - always make a backup of your data first!" );
366 tePyramidDescription->setHtml( pyramidFormat.arg( pyramidHeader, pyramidSentence1, pyramidSentence2, pyramidSentence3, pyramidSentence4, pyramidSentence5 ) );
369 mResamplingGroupBox->setSaveCheckedState(
true );
370 mResamplingUtils.initWidgets( mRasterLayer, mZoomedInResamplingComboBox, mZoomedOutResamplingComboBox, mMaximumOversamplingSpinBox, mCbEarlyResampling );
371 mResamplingUtils.refreshWidgetsFromLayer();
375 btnColorizeColor->setColorDialogTitle( tr(
"Select Color" ) );
376 btnColorizeColor->setContext( u
"symbology"_s );
381 if ( hueSaturationFilter )
383 sliderSaturation->setValue( hueSaturationFilter->
saturation() );
384 comboGrayscale->setCurrentIndex( (
int ) hueSaturationFilter->
grayscaleMode() );
387 toggleSaturationControls(
static_cast<int>( hueSaturationFilter->
grayscaleMode() ) );
390 mColorizeCheck->setChecked( hueSaturationFilter->
colorizeOn() );
391 btnColorizeColor->setColor( hueSaturationFilter->
colorizeColor() );
392 toggleColorizeControls( hueSaturationFilter->
colorizeOn() );
393 sliderColorizeStrength->setValue( hueSaturationFilter->
colorizeStrength() );
394 mInvertColorsCheck->setChecked( hueSaturationFilter->
invertColors() );
399 mBlendModeComboBox->setBlendMode( mRasterLayer->blendMode() );
404 mRasterTransparencyWidget->cboxTransparencyBand->setShowNotSetOption(
true, tr(
"None" ) );
405 mRasterTransparencyWidget->cboxTransparencyBand->setLayer( mRasterLayer );
414 cboxTransparencyBand->setCurrentIndex( cboxTransparencyBand->findData( renderer->
alphaBand() ) );
421 mHistogramWidget =
nullptr;
422 if ( mOptsPage_Histogram->isEnabled() )
425 mHistogramStackedWidget->addWidget( mHistogramWidget );
439 mDisableRenderTypeComboBoxCurrentIndexChanged =
true;
441 for (
const QString &name : constRenderersList )
451 mDisableRenderTypeComboBoxCurrentIndexChanged =
false;
456 QString rendererType = renderer->
type();
457 widgetIndex = mRenderTypeComboBox->findData( rendererType );
458 if ( widgetIndex != -1 )
460 mDisableRenderTypeComboBoxCurrentIndexChanged =
true;
461 mRenderTypeComboBox->setCurrentIndex( widgetIndex );
462 mDisableRenderTypeComboBoxCurrentIndexChanged =
false;
465 if ( rendererType ==
"singlebandcolordata"_L1 && mRenderTypeComboBox->count() == 1 )
468 QSizePolicy sizep = mBandRenderingGrpBx->sizePolicy();
469 sizep.setVerticalStretch( 0 );
470 sizep.setVerticalPolicy( QSizePolicy::Maximum );
471 mBandRenderingGrpBx->setSizePolicy( sizep );
472 mBandRenderingGrpBx->updateGeometry();
475 if ( mRasterLayer->providerType() !=
"wms"_L1 )
477 mWMSPrintGroupBox->hide();
478 mPublishDataSourceUrlCheckBox->hide();
479 mBackgroundLayerCheckBox->hide();
485 mRenderTypeComboBox_currentIndexChanged( widgetIndex );
489 QMenu *menuStyle =
new QMenu(
this );
492 menuStyle->addSeparator();
496 connect( menuStyle, &QMenu::aboutToShow,
this, &QgsRasterLayerProperties::aboutToShowStyleMenu );
498 mBtnMetadata =
new QPushButton( tr(
"Metadata" ),
this );
499 QMenu *menuMetadata =
new QMenu(
this );
502 menuMetadata->addSeparator();
506 buttonBox->addButton(
mBtnMetadata, QDialogButtonBox::ResetRole );
514 if ( !settings.
contains( u
"/Windows/RasterLayerProperties/tab"_s ) )
524 mOptsPage_Information->setProperty(
"helpPage", u
"working_with_raster/raster_properties.html#information-properties"_s );
525 mOptsPage_Source->setProperty(
"helpPage", u
"working_with_raster/raster_properties.html#source-properties"_s );
526 mOptsPage_Style->setProperty(
"helpPage", u
"working_with_raster/raster_properties.html#symbology-properties"_s );
527 mOptsPage_Transparency->setProperty(
"helpPage", u
"working_with_raster/raster_properties.html#transparency-properties"_s );
529 if ( mOptsPage_Histogram )
530 mOptsPage_Histogram->setProperty(
"helpPage", u
"working_with_raster/raster_properties.html#histogram-properties"_s );
532 mOptsPage_Rendering->setProperty(
"helpPage", u
"working_with_raster/raster_properties.html#rendering-properties"_s );
533 mOptsPage_Temporal->setProperty(
"helpPage", u
"working_with_raster/raster_properties.html#temporal-properties"_s );
535 if ( mOptsPage_Pyramids )
536 mOptsPage_Pyramids->setProperty(
"helpPage", u
"working_with_raster/raster_properties.html#pyramids-properties"_s );
538 if ( mOptsPage_Display )
539 mOptsPage_Display->setProperty(
"helpPage", u
"working_with_raster/raster_properties.html#display-properties"_s );
541 mOptsPage_Metadata->setProperty(
"helpPage", u
"working_with_raster/raster_properties.html#metadata-properties"_s );
542 mOptsPage_Legend->setProperty(
"helpPage", u
"working_with_raster/raster_properties.html#legend-properties"_s );
543 mOptsPage_Server->setProperty(
"helpPage", u
"working_with_raster/raster_properties.html#server-properties"_s );
563 if ( beforePage.isEmpty() )
571 mTemporalWidget->addWidget( page );
581void QgsRasterLayerProperties::updateRasterAttributeTableOptionsPage()
583 if ( mRasterAttributeTableWidget )
585 mOptsPage_RasterAttributeTable->layout()->removeWidget( mRasterAttributeTableWidget );
586 mRasterAttributeTableWidget =
nullptr;
590 if ( mRasterLayer->attributeTableCount() > 0 )
592 mRasterAttributeTableWidget =
new QgsRasterAttributeTableWidget(
this, mRasterLayer );
593 mOptsPage_RasterAttributeTable->layout()->addWidget( mRasterAttributeTableWidget );
596 mNoRasterAttributeTableWidget->hide();
600 mNoRasterAttributeTableWidget->show();
601 mCreateRasterAttributeTableButton->setEnabled( mRasterLayer->canCreateRasterAttributeTable() );
605void QgsRasterLayerProperties::setRendererWidget(
const QString &rendererName )
608 QgsRasterRendererWidget *oldWidget = mRendererWidget;
609 QgsRasterRenderer *oldRenderer = mRasterLayer->renderer();
614 const QList<int> oldBands = oldRenderer ? oldRenderer->
usesBands() : QList<int>();
619 opacity = oldRenderer->
opacity();
623 QgsRasterRendererRegistryEntry rendererEntry;
630 QgsRectangle myExtent =
mCanvas->mapSettings().outputExtentToLayerExtent( mRasterLayer,
mCanvas->extent() );
631 if ( oldWidget && ( !oldRenderer || rendererName != oldRenderer->
type() ) )
633 if ( rendererName ==
"singlebandgray"_L1 )
636 whileBlocking( mRasterLayer )->setDefaultContrastEnhancement();
638 else if ( rendererName ==
"multibandcolor"_L1 )
641 whileBlocking( mRasterLayer )->setDefaultContrastEnhancement();
644 mRasterLayer->renderer()->setAlphaBand( alphaBand );
645 mRasterLayer->renderer()->setOpacity( opacity );
646 mRasterLayer->renderer()->setNodataColor( nodataColor );
648 mRendererWidget->setMapCanvas(
mCanvas );
649 mRendererStackedWidget->addWidget( mRendererWidget );
653 std::unique_ptr<QgsRasterRenderer> newRenderer;
654 newRenderer.reset( mRendererWidget->renderer() );
655 const QList<int> newBands = newRenderer->usesBands();
656 if ( oldBands != newBands )
658 mRasterTransparencyWidget->syncToLayer();
664 const int widgetIndex = mRenderTypeComboBox->findData( rendererName );
665 if ( widgetIndex != -1 )
667 mDisableRenderTypeComboBoxCurrentIndexChanged =
true;
668 mRenderTypeComboBox->setCurrentIndex( widgetIndex );
669 mDisableRenderTypeComboBoxCurrentIndexChanged =
false;
672 if ( mRendererWidget != oldWidget )
675 if ( mHistogramWidget )
677 mHistogramWidget->setRendererWidget( rendererName, mRendererWidget );
681void QgsRasterLayerProperties::sync()
683 QgsSettings myQSettings;
685 if ( !mSourceWidget )
690 QHBoxLayout *layout =
new QHBoxLayout();
691 layout->addWidget( mSourceWidget );
692 mSourceGroupBox->setLayout( layout );
693 if ( !mSourceWidget->groupTitle().isEmpty() )
694 mSourceGroupBox->setTitle( mSourceWidget->groupTitle() );
695 mSourceGroupBox->show();
698 buttonBox->button( QDialogButtonBox::Apply )->setEnabled( isValid );
699 buttonBox->button( QDialogButtonBox::Ok )->setEnabled( isValid );
706 mSourceWidget->setMapCanvas(
mCanvas );
707 mSourceWidget->setSourceUri( mRasterLayer->source() );
710 const QgsRasterDataProvider *provider = mRasterLayer->dataProvider();
714 mRasterTransparencyWidget->syncToLayer();
715 mLabelingWidget->syncToLayer( mRasterLayer );
720 mRasterTransparencyWidget->gboxNoDataValue->setEnabled(
false );
721 mRasterTransparencyWidget->gboxCustomTransparency->setEnabled(
false );
722 mOptionsStackedWidget->setCurrentWidget( mOptsPage_Server );
729 if ( mOptsPage_Pyramids )
731 delete mOptsPage_Pyramids;
732 mOptsPage_Pyramids =
nullptr;
738 if ( mOptsPage_Histogram )
740 delete mOptsPage_Histogram;
741 mOptsPage_Histogram =
nullptr;
742 delete mHistogramWidget;
743 mHistogramWidget =
nullptr;
754 QgsBrightnessContrastFilter *brightnessFilter = mRasterLayer->brightnessFilter();
755 if ( brightnessFilter )
757 mSliderBrightness->setValue( brightnessFilter->
brightness() );
758 mSliderContrast->setValue( brightnessFilter->
contrast() );
759 mGammaSpinBox->setValue( brightnessFilter->
gamma() );
763 const QgsHueSaturationFilter *hueSaturationFilter = mRasterLayer->hueSaturationFilter();
765 if ( hueSaturationFilter )
767 sliderSaturation->setValue( hueSaturationFilter->
saturation() );
768 comboGrayscale->setCurrentIndex( (
int ) hueSaturationFilter->
grayscaleMode() );
771 toggleSaturationControls(
static_cast<int>( hueSaturationFilter->
grayscaleMode() ) );
774 mColorizeCheck->setChecked( hueSaturationFilter->
colorizeOn() );
775 btnColorizeColor->setColor( hueSaturationFilter->
colorizeColor() );
776 toggleColorizeControls( hueSaturationFilter->
colorizeOn() );
777 sliderColorizeStrength->setValue( hueSaturationFilter->
colorizeStrength() );
778 mInvertColorsCheck->setChecked( hueSaturationFilter->
invertColors() );
782 mResamplingUtils.refreshWidgetsFromLayer();
784 mRefreshSettingsWidget->syncToLayer();
785 mMapLayerServerPropertiesWidget->sync();
792 mLayerOrigNameLineEd->setText( mRasterLayer->name() );
799 updateInformationContent();
801 mEnableMapTips->setChecked( mRasterLayer->mapTipsEnabled() );
802 mMapTipWidget->setText( mRasterLayer->mapTipTemplate() );
805 QVariant wmsPrintLayer = mRasterLayer->customProperty( u
"WMSPrintLayer"_s );
806 if ( wmsPrintLayer.isValid() )
808 mWMSPrintLayerLineEdit->setText( wmsPrintLayer.toString() );
811 QVariant wmsPublishDataSourceUrl = mRasterLayer->customProperty( u
"WMSPublishDataSourceUrl"_s,
false );
812 mPublishDataSourceUrlCheckBox->setChecked( wmsPublishDataSourceUrl.toBool() );
814 QVariant wmsBackgroundLayer = mRasterLayer->customProperty( u
"WMSBackgroundLayer"_s,
false );
815 mBackgroundLayerCheckBox->setChecked( wmsBackgroundLayer.toBool() );
817 mLegendPlaceholderWidget->setLastPathSettingsKey( u
"lastLegendPlaceholderDir"_s );
818 mLegendPlaceholderWidget->setSource( mRasterLayer->legendPlaceholderImage() );
819 mLegendConfigEmbeddedWidget->setLayer( mRasterLayer );
822 mTemporalWidget->syncToLayer();
824 mPropertyCollection = mRasterLayer->pipe()->dataDefinedProperties();
825 updateDataDefinedButtons();
827 for ( QgsMapLayerConfigWidget *page : std::as_const(
mConfigWidgets ) )
829 page->syncToLayer( mRasterLayer );
837 const QString newSource = mSourceWidget->sourceUri();
838 if ( newSource != mRasterLayer->source() )
845 if ( !mRasterLayer->isValid() )
858 mRasterLayer->setLegendPlaceholderImage( mLegendPlaceholderWidget->source() );
859 mLegendConfigEmbeddedWidget->applyToLayer();
869 mRasterLayer->brightnessFilter()->setBrightness( mSliderBrightness->value() );
870 mRasterLayer->brightnessFilter()->setContrast( mSliderContrast->value() );
871 mRasterLayer->brightnessFilter()->setGamma( mGammaSpinBox->value() );
878 mRasterTransparencyWidget->applyToRasterProvider( mRasterLayer->dataProvider() );
882 if ( rendererWidget )
886 mRasterLayer->setRenderer( rendererWidget->
renderer() );
889 mBackupCrs = mRasterLayer->crs();
890 mMetadataWidget->acceptMetadata();
891 mMetadataFilled =
false;
895 mRasterTransparencyWidget->applyToRasterRenderer( rasterRenderer );
897 mLabelingWidget->apply();
899 if ( rasterRenderer )
902 mRasterLayer->emitStyleChanged();
909 mRasterLayer->setName( mLayerOrigNameLineEd->text() );
912 mRasterLayer->setScaleBasedVisibility( chkUseScaleDependentRendering->isChecked() );
913 mRasterLayer->setMinimumScale( mScaleRangeWidget->minimumScale() );
914 mRasterLayer->setMaximumScale( mScaleRangeWidget->maximumScale() );
916 mRefreshSettingsWidget->saveToLayer();
917 if ( mMapLayerServerPropertiesWidget->save() )
918 mMetadataFilled =
true;
925 mResamplingUtils.refreshLayerFromWidgets();
929 if ( hueSaturationFilter )
931 hueSaturationFilter->
setSaturation( sliderSaturation->value() );
933 hueSaturationFilter->
setColorizeOn( mColorizeCheck->checkState() );
936 hueSaturationFilter->
setInvertColors( mInvertColorsCheck->isChecked() );
940 mRasterLayer->setBlendMode( mBlendModeComboBox->blendMode() );
943 mTemporalWidget->saveTemporalProperties();
945 mRasterLayer->setCrs( mCrsSelector->crs() );
947 if ( !mWMSPrintLayerLineEdit->text().isEmpty() )
949 mRasterLayer->setCustomProperty( u
"WMSPrintLayer"_s, mWMSPrintLayerLineEdit->text() );
952 mRasterLayer->setCustomProperty(
"WMSPublishDataSourceUrl", mPublishDataSourceUrlCheckBox->isChecked() );
953 mRasterLayer->setCustomProperty(
"WMSBackgroundLayer", mBackgroundLayerCheckBox->isChecked() );
955 mRasterLayer->pipe()->setDataDefinedProperties( mPropertyCollection );
957 mRasterLayer->setMapTipsEnabled( mEnableMapTips->isChecked() );
958 mRasterLayer->setMapTipTemplate( mMapTipWidget->text() );
968 mRasterLayer->triggerRepaint();
974void QgsRasterLayerProperties::buttonBuildPyramids_clicked()
978 auto feedback = std::make_unique<QgsRasterBlockFeedback>();
986 for (
int myCounterInt = 0; myCounterInt < lbxPyramidResolutions->count(); myCounterInt++ )
988 QListWidgetItem *myItem = lbxPyramidResolutions->item( myCounterInt );
990 myPyramidList[myCounterInt].setBuild( myItem->isSelected() || myPyramidList[myCounterInt].getExists() );
994 QString prefix = provider->
name() +
"/driverOptions/_pyramids/";
995 QgsSettings mySettings;
996 QString resamplingMethod( cboResamplingMethod->currentData().toString() );
997 mySettings.
setValue( prefix +
"resampling", resamplingMethod );
1004 QApplication::setOverrideCursor( Qt::WaitCursor );
1012 QApplication::restoreOverrideCursor();
1013 mPyramidProgress->setValue( 0 );
1014 buttonBuildPyramids->setEnabled(
false );
1015 if ( !res.isNull() )
1017 if ( res ==
"CANCELED"_L1 )
1021 else if ( res ==
"ERROR_WRITE_ACCESS"_L1 )
1023 QMessageBox::warning(
this, tr(
"Building Pyramids" ), tr(
"Write access denied. Adjust the file permissions and try again." ) );
1025 else if ( res ==
"ERROR_WRITE_FORMAT"_L1 )
1027 QMessageBox::warning(
this, tr(
"Building Pyramids" ), tr(
"The file was not writable. Some formats do not "
1028 "support pyramid overviews. Consult the GDAL documentation if in doubt." ) );
1030 else if ( res ==
"FAILED_NOT_SUPPORTED"_L1 )
1032 QMessageBox::warning(
this, tr(
"Building Pyramids" ), tr(
"Building pyramid overviews is not supported on this type of raster." ) );
1034 else if ( res ==
"ERROR_JPEG_COMPRESSION"_L1 )
1036 QMessageBox::warning(
this, tr(
"Building Pyramids" ), tr(
"Building internal pyramid overviews is not supported on raster layers with JPEG compression and your current libtiff library." ) );
1038 else if ( res ==
"ERROR_VIRTUAL"_L1 )
1040 QMessageBox::warning(
this, tr(
"Building Pyramids" ), tr(
"Building pyramid overviews is not supported on this type of raster." ) );
1047 lbxPyramidResolutions->clear();
1053 for (
const QgsRasterPyramid &pyramid : std::as_const( myPyramidList ) )
1055 if ( pyramid.getExists() )
1057 lbxPyramidResolutions->addItem(
new QListWidgetItem( myPyramidPixmap, QString::number( pyramid.getXDim() ) + u
" x "_s + QString::number( pyramid.getYDim() ) ) );
1061 lbxPyramidResolutions->addItem(
new QListWidgetItem( myNoPyramidPixmap, QString::number( pyramid.getXDim() ) + u
" x "_s + QString::number( pyramid.getYDim() ) ) );
1070 updateInformationContent();
1073void QgsRasterLayerProperties::mRenderTypeComboBox_currentIndexChanged(
int index )
1075 if ( index < 0 || mDisableRenderTypeComboBoxCurrentIndexChanged || !mRasterLayer->renderer() )
1080 QString rendererName = mRenderTypeComboBox->itemData( index ).toString();
1081 setRendererWidget( rendererName );
1087 mRasterLayer->setCrs( crs );
1088 mMetadataWidget->crsChanged();
1091void QgsRasterLayerProperties::aboutToShowStyleMenu()
1095 QMenu *m = qobject_cast<QMenu *>( sender() );
1105 QgsRasterRenderer *renderer = mRasterLayer->renderer();
1108 setRendererWidget( renderer->
type() );
1111 mRasterLayer->triggerRepaint();
1118 if ( !mHistogramWidget )
1123 mHistogramWidget->setActive(
true );
1127 mHistogramWidget->setActive(
false );
1130 if ( index ==
mOptStackedWidget->indexOf( mOptsPage_Information ) || !mMetadataFilled )
1133 updateInformationContent();
1139 button->blockSignals(
true );
1143 button->blockSignals(
false );
1146void QgsRasterLayerProperties::updateDataDefinedButtons()
1148 const QList<QgsPropertyOverrideButton *> propertyOverrideButtons { findChildren<QgsPropertyOverrideButton *>() };
1149 for ( QgsPropertyOverrideButton *button : propertyOverrideButtons )
1151 updateDataDefinedButton( button );
1167void QgsRasterLayerProperties::updateProperty()
1169 QgsPropertyOverrideButton *button = qobject_cast<QgsPropertyOverrideButton *>( sender() );
1171 mPropertyCollection.setProperty( key, button->
toProperty() );
1174void QgsRasterLayerProperties::toggleSaturationControls(
int grayscaleMode )
1177 if ( grayscaleMode == 0 )
1179 sliderSaturation->setEnabled(
true );
1180 spinBoxSaturation->setEnabled(
true );
1184 sliderSaturation->setEnabled(
false );
1185 spinBoxSaturation->setEnabled(
false );
1189void QgsRasterLayerProperties::toggleColorizeControls(
bool colorizeEnabled )
1192 btnColorizeColor->setEnabled( colorizeEnabled );
1193 sliderColorizeStrength->setEnabled( colorizeEnabled );
1194 spinColorizeStrength->setEnabled( colorizeEnabled );
1198QLinearGradient QgsRasterLayerProperties::redGradient()
1202 QLinearGradient myGradient = QLinearGradient( mGradientWidth, 0, mGradientWidth, mGradientHeight );
1203 myGradient.setColorAt( 0.0, QColor( 242, 14, 25, 190 ) );
1204 myGradient.setColorAt( 0.5, QColor( 175, 29, 37, 190 ) );
1205 myGradient.setColorAt( 1.0, QColor( 114, 17, 22, 190 ) );
1208QLinearGradient QgsRasterLayerProperties::greenGradient()
1212 QLinearGradient myGradient = QLinearGradient( mGradientWidth, 0, mGradientWidth, mGradientHeight );
1213 myGradient.setColorAt( 0.0, QColor( 48, 168, 5, 190 ) );
1214 myGradient.setColorAt( 0.8, QColor( 36, 122, 4, 190 ) );
1215 myGradient.setColorAt( 1.0, QColor( 21, 71, 2, 190 ) );
1218QLinearGradient QgsRasterLayerProperties::blueGradient()
1222 QLinearGradient myGradient = QLinearGradient( mGradientWidth, 0, mGradientWidth, mGradientHeight );
1223 myGradient.setColorAt( 0.0, QColor( 30, 0, 106, 190 ) );
1224 myGradient.setColorAt( 0.2, QColor( 30, 72, 128, 190 ) );
1225 myGradient.setColorAt( 1.0, QColor( 30, 223, 196, 190 ) );
1228QLinearGradient QgsRasterLayerProperties::grayGradient()
1232 QLinearGradient myGradient = QLinearGradient( mGradientWidth, 0, mGradientWidth, mGradientHeight );
1233 myGradient.setColorAt( 0.0, QColor( 5, 5, 5, 190 ) );
1234 myGradient.setColorAt( 0.8, QColor( 122, 122, 122, 190 ) );
1235 myGradient.setColorAt( 1.0, QColor( 220, 220, 220, 190 ) );
1238QLinearGradient QgsRasterLayerProperties::highlightGradient()
1242 QLinearGradient myGradient = QLinearGradient( mGradientWidth, 0, mGradientWidth, mGradientHeight );
1243 myGradient.setColorAt( 1.0, QColor( 255, 255, 255, 50 ) );
1244 myGradient.setColorAt( 0.5, QColor( 255, 255, 255, 100 ) );
1245 myGradient.setColorAt( 0.0, QColor( 255, 255, 255, 150 ) );
1260void QgsRasterLayerProperties::restoreWindowModality()
1269void QgsRasterLayerProperties::toggleBuildPyramidsButton()
1271 if ( lbxPyramidResolutions->selectedItems().empty() )
1273 buttonBuildPyramids->setEnabled(
false );
1277 buttonBuildPyramids->setEnabled(
true );
1281void QgsRasterLayerProperties::mResetColorRenderingBtn_clicked()
1283 mBlendModeComboBox->setBlendMode( QPainter::CompositionMode_SourceOver );
1284 mSliderBrightness->setValue( 0 );
1285 mSliderContrast->setValue( 0 );
1286 mGammaSpinBox->setValue( 1.0 );
1287 sliderSaturation->setValue( 0 );
1289 mColorizeCheck->setChecked(
false );
1290 sliderColorizeStrength->setValue( 100 );
1291 mInvertColorsCheck->setChecked(
false );
1294bool QgsRasterLayerProperties::rasterIsMultiBandColor()
1296 return mRasterLayer &&
nullptr !=
dynamic_cast<QgsMultiBandColorRenderer *
>( mRasterLayer->renderer() );
1299void QgsRasterLayerProperties::updateInformationContent()
1303 const QString html { mRasterLayer->htmlMetadata().replace(
"<head>"_L1, QStringLiteral( R
"raw(<head><style type="text/css">%1</style>)raw" ) ).arg( myStyle ) };
1304 mMetadataViewer->setHtml( html );
1305 mMetadataFilled = true;
1311 if ( mRasterAttributeTableWidget && mRasterAttributeTableWidget->isDirty() )
1313 mRasterAttributeTableWidget->setEditable(
false,
false );
1317 if ( mBackupCrs != mRasterLayer->crs() )
1318 mRasterLayer->setCrs( mBackupCrs );
1321void QgsRasterLayerProperties::showHelp()
1323 const QVariant helpPage = mOptionsStackedWidget->currentWidget()->property(
"helpPage" );
1325 if ( helpPage.isValid() )
1335void QgsRasterLayerProperties::updateGammaSpinBox(
int value )
1340void QgsRasterLayerProperties::updateGammaSlider(
double value )
1349 if ( obj == mMapTipPreviewContainer && ev->type() == QEvent::Resize )
1353 return QgsOptionsDialogBase::eventFilter( obj, ev );
1356void QgsRasterLayerProperties::initMapTipPreview()
1359 mMapTipSplitter->setSizes( { 400, 200 } );
1361 mMapTipPreviewContainer->installEventFilter(
this );
1365 mMapTipPreview =
new QgsWebView( mMapTipPreviewContainer );
1366 mMapTipPreviewLayout->addWidget( mMapTipPreview );
1368 mMapTipPreview->page()->settings()->setAttribute( QWebSettings::DeveloperExtrasEnabled,
true );
1369 mMapTipPreview->page()->settings()->setAttribute( QWebSettings::JavascriptEnabled,
true );
1370 mMapTipPreview->page()->settings()->setAttribute( QWebSettings::LocalStorageEnabled,
true );
1373 mMapTipPreview->page()->mainFrame()->setScrollBarPolicy( Qt::Horizontal, Qt::ScrollBarAlwaysOff );
1374 mMapTipPreview->page()->mainFrame()->setScrollBarPolicy( Qt::Vertical, Qt::ScrollBarAlwaysOff );
1378 connect( mMapTipWidget, &QgsCodeEditorHTML::textChanged,
this, &QgsRasterLayerProperties::updateMapTipPreview );
1381void QgsRasterLayerProperties::updateMapTipPreview()
1383 mMapTipPreview->setMaximumSize( mMapTipPreviewContainer->width(), mMapTipPreviewContainer->height() );
1385 mMapTipPreview->setHtml( htmlContent );
1388void QgsRasterLayerProperties::resizeMapTip()
1391 mMapTipPreview->setMaximumSize( mMapTipPreviewContainer->width(), mMapTipPreviewContainer->height() );
1392 mMapTipPreview->adjustSize();
@ BuildPyramids
Supports building of pyramids (overviews) (since QGIS 3.38 – this is a replacement for RasterInterfac...
@ SingleBandColorData
Single band containing color data.
RasterPyramidFormat
Raster pyramid formats.
@ GeoTiff
Geotiff .ovr (external).
@ Erdas
Erdas Image .aux (external).
@ 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...
@ BuildPyramids
Supports building of pyramids (overviews) (Deprecated since QGIS 3.38 – use RasterProviderCapability:...
@ Size
Original data source size (and thus resolution) is known, it is not always available,...
@ ExcludeByDefault
If set, the layer should not be included in legends by default, and must be manually added by a user.
@ ARGB32_Premultiplied
Color, alpha, red, green, blue, 4 bytes the same as QImage::Format_ARGB32_Premultiplied.
@ ARGB32
Color, alpha, red, green, blue, 4 bytes the same as QImage::Format_ARGB32.
@ Preferred
Preferred format, matching the most recent WKT ISO standard. Currently an alias to WKT2_2019,...
static QString reportStyleSheet(QgsApplication::StyleSheetType styleSheetType=QgsApplication::StyleSheetType::Qt)
Returns a css style sheet for reports, the styleSheetType argument determines what type of stylesheet...
static QgsRasterRendererRegistry * rasterRendererRegistry()
Returns the application's raster renderer registry, used for managing raster layer renderers.
@ WebBrowser
StyleSheet for embedded browsers (QtWebKit), supports full standard CSS.
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
int contrast() const
Returns current contrast level.
int brightness() const
Returns current brightness level.
double gamma() const
Returns current gamma value.
Represents a coordinate reference system (CRS).
A dialog which collects the information required to create a new raster attribute table.
void setOpenWhenDoneVisible(bool visible)
Sets the visibility of the "Open newly created raster attribute table" option to visible,...
virtual QString name() const =0
Returns a provider name.
A generic dialog for building expression strings.
static QgsExpressionContextScope * projectScope(const QgsProject *project)
Creates a new scope which contains variables and functions relating to a QGIS project.
static QgsExpressionContextScope * atlasScope(const QgsLayoutAtlas *atlas)
Creates a new scope which contains variables and functions relating to a QgsLayoutAtlas.
static QgsExpressionContextScope * mapLayerPositionScope(const QgsPointXY &position)
Sets the expression context variables which are available for expressions triggered by moving the mou...
static QgsExpressionContextScope * mapSettingsScope(const QgsMapSettings &mapSettings)
Creates a new scope which contains variables and functions relating to a QgsMapSettings object.
static QgsExpressionContextScope * layerScope(const QgsMapLayer *layer)
Creates a new scope which contains variables and functions relating to a QgsMapLayer.
static QgsExpressionContextScope * globalScope()
Creates a new scope which contains variables and functions relating to the global QGIS context.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
static QString findAndSelectActiveExpression(QgsCodeEditor *editor, const QString &pattern=QString())
Find the expression under the cursor in the given editor and select it.
void progressChanged(double progress)
Emitted when the feedback object reports a progress change.
static QgsProviderSourceWidgetProviderRegistry * sourceWidgetProviderRegistry()
Returns the registry of provider source widget providers.
static void openHelp(const QString &key)
Opens help topic for the given help key using default system web browser.
Color and saturation filter pipe for rasters.
void setColorizeOn(bool colorizeOn)
void setSaturation(int saturation)
int colorizeStrength() const
bool invertColors() const
Returns true if the filter inverts colors.
void setGrayscaleMode(QgsHueSaturationFilter::GrayscaleMode grayscaleMode)
void setInvertColors(bool invertColors)
Sets whether the filter will invert colors.
QgsHueSaturationFilter::GrayscaleMode grayscaleMode() const
void setColorizeColor(const QColor &colorizeColor)
void setColorizeStrength(int colorizeStrength)
QColor colorizeColor() const
QPushButton * mBtnStyle
Style button.
void saveMetadataToFile()
Allows the user to save the layer's metadata as a file.
virtual void rollback()
Rolls back changes made to the layer.
void optionsStackedWidget_CurrentChanged(int index) override
void saveStyleAsDefault()
Saves the current layer style as the default for the layer.
QList< QgsMapLayerConfigWidget * > mConfigWidgets
Layer config widgets.
void setMetadataWidget(QgsMetadataWidget *widget, QWidget *page)
Sets the metadata widget and page associated with the dialog.
void loadDefaultStyle()
Reloads the default style for the layer.
void saveStyleAs()
Saves a style when appriate button is pressed.
virtual void syncToLayer()=0
Resets the dialog to the current layer state.
void loadStyle()
Triggers a dialog to load a saved style.
QgsMapCanvas * mCanvas
Associated map canvas.
void loadDefaultMetadata()
Reloads the default layer metadata for the layer.
QgsLayerPropertiesDialog(QgsMapLayer *layer, QgsMapCanvas *canvas, const QString &settingsKey, QWidget *parent=nullptr, Qt::WindowFlags fl=Qt::WindowFlags(), QgsSettings *settings=nullptr)
Constructor for QgsLayerPropertiesDialog.
void loadMetadataFromFile()
Allows the user to load layer metadata from a file.
QPushButton * mBtnMetadata
Metadata button.
void initialize()
Initialize the dialog.
void saveMetadataAsDefault()
Saves the current layer metadata as the default for the layer.
A dialog allowing selection of a VAT.DBF file and associating the resulting raster attribute table wi...
void setOpenWhenDoneVisible(bool visible)
Sets the visibility of the "Open newly created raster attribute table" option to visible,...
Map canvas is a class for displaying all GIS data types on a canvas.
An abstract interface for implementations of legends for one map layer.
static QgsMapLayerLegend * defaultRasterLegend(QgsRasterLayer *rl)
Create new legend implementation for raster layer.
void removesExtraMenuSeparators(QMenu *m)
removes extra separators from the menu
void addStyleManagerActions(QMenu *m, QgsMapLayer *layer)
adds actions to the menu in accordance to the layer
static QgsMapLayerStyleGuiUtils * instance()
returns a singleton instance of this class
void currentStyleChanged(const QString ¤tName)
Emitted when the current style has been changed.
Base class for all map layer types.
void rendererChanged()
Signal emitted when renderer is changed.
bool hasScaleBasedVisibility() const
Returns whether scale based visibility is enabled for the layer.
double minimumScale() const
Returns the minimum map scale (i.e.
QgsMapLayerStyleManager * styleManager() const
Gets access to the layer's style manager.
double maximumScale() const
Returns the maximum map scale (i.e.
Contains configuration for rendering maps.
static QString rasterMapTipPreviewText(QgsMapLayer *layer, QgsMapCanvas *mapCanvas, const QString &mapTemplate)
Returns the html that would be displayed in a maptip for a given layer.
void addPage(const QString &title, const QString &tooltip, const QIcon &icon, QWidget *widget, const QStringList &path=QStringList(), const QString &key=QString())
Adds a new page to the dialog pages.
QStackedWidget * mOptStackedWidget
void initOptionsBase(bool restoreUi=true, const QString &title=QString())
Set up the base ui connections for vertical tabs.
void insertPage(const QString &title, const QString &tooltip, const QIcon &icon, QWidget *widget, const QString &before, const QStringList &path=QStringList(), const QString &key=QString())
Inserts a new page into the dialog pages.
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.
void setDirty(bool b=true)
Flag the project as dirty (modified).
Base class for raster data providers.
virtual QString buildPyramids(const QList< QgsRasterPyramid > &pyramidList, const QString &resamplingMethod="NEAREST", Qgis::RasterPyramidFormat format=Qgis::RasterPyramidFormat::GeoTiff, const QStringList &configOptions=QStringList(), QgsRasterBlockFeedback *feedback=nullptr)
Creates pyramid overviews.
Qgis::DataType dataType(int bandNo) const override=0
Returns data type for the band specified by number.
virtual Qgis::RasterProviderCapabilities providerCapabilities() const
Returns flags containing the supported capabilities of the data provider.
static QList< QPair< QString, QString > > pyramidResamplingMethods(const QString &providerKey)
Returns a list of pyramid resampling method name and label pairs for given provider.
virtual QList< QgsRasterPyramid > buildPyramidList(const QList< int > &overviewList=QList< int >())
Returns the raster layers pyramid list.
virtual Qgis::RasterInterfaceCapabilities capabilities() const
Returns the capabilities supported by the interface.
void addPropertiesPageFactory(const QgsMapLayerConfigWidgetFactory *factory) final
Adds properties page from a factory.
Q_DECL_DEPRECATED void saveDefaultStyle()
Saves the default style when appropriate button is pressed.
QgsRasterLayerProperties(QgsMapLayer *lyr, QgsMapCanvas *canvas, QWidget *parent=nullptr, Qt::WindowFlags=QgsGuiUtils::ModalDialogFlags)
Constructor.
bool eventFilter(QObject *obj, QEvent *ev) override
void optionsStackedWidget_CurrentChanged(int index) final
QgsExpressionContext createExpressionContext() const override
This method needs to be reimplemented in all classes which implement this interface and return an exp...
Represents a raster layer.
QgsRasterDataProvider * dataProvider() override
Returns the source data provider.
Property
Data definable properties.
@ RendererOpacity
Raster renderer global opacity.
static QgsPropertiesDefinition propertyDefinitions()
Returns the definitions for data defined properties available for use in raster pipes.
This struct is used to store pyramid info for the 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.
QColor nodataColor() const
Returns the color to use for shading nodata pixels.
virtual QString type() const
Returns a unique string representation of the renderer type.
double opacity() const
Returns the opacity for the renderer, where opacity is a value between 0 (totally transparent) and 1....
virtual QList< int > usesBands() const
Returns a list of band numbers used by the renderer.
Stores settings for use within QGIS.
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
bool contains(const QString &key, QgsSettings::Section section=QgsSettings::NoSection) const
Returns true if there exists a setting called key; returns false otherwise.
void setValue(const QString &key, const QVariant &value, QgsSettings::Section section=QgsSettings::NoSection)
Sets the value of setting key to value.
A collection of stubs to mimic the API of QWebView on systems where the real library is not available...
QgsSignalBlocker< Object > whileBlocking(Object *object)
Temporarily blocks signals from a QObject while calling a single method from the object.
#define QgsDebugMsgLevel(str, level)
Setting options for creating vector data providers.
Registry for raster renderer entries.
QgsRasterRendererWidgetCreateFunc widgetCreateFunction