76#include <QColorDialog>
77#include <QDesktopServices>
81#include <QLinearGradient>
87#include <QPainterPath>
89#include <QRegularExpression>
90#include <QRegularExpressionValidator>
93#include <QTableWidgetItem>
98#include "moc_qgsrasterlayerproperties.cpp"
100using namespace Qt::StringLiterals;
105 , TRSTRING_NOT_SET( tr(
"Not Set" ) )
108 mGrayMinimumMaximumEstimated =
true;
109 mRGBMinimumMaximumEstimated =
true;
114 mMetadataViewer->setOpenLinks(
false );
116 mOptsPage_Information->layout()->addWidget( mMetadataViewer );
120 transparencyScrollArea->setWidget( mRasterTransparencyWidget );
123 QVBoxLayout *vl =
new QVBoxLayout();
124 vl->setContentsMargins( 0, 0, 0, 0 );
125 vl->addWidget( mLabelingWidget );
126 mOptsPage_Labeling->setLayout( vl );
128 connect( buttonBuildPyramids, &QPushButton::clicked,
this, &QgsRasterLayerProperties::buttonBuildPyramids_clicked );
130 connect( mRenderTypeComboBox,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsRasterLayerProperties::mRenderTypeComboBox_currentIndexChanged );
131 connect( mResetColorRenderingBtn, &QToolButton::clicked,
this, &QgsRasterLayerProperties::mResetColorRenderingBtn_clicked );
136 connect( buttonBox, &QDialogButtonBox::helpRequested,
this, &QgsRasterLayerProperties::showHelp );
138 mSourceGroupBox->hide();
140 mBtnStyle =
new QPushButton( tr(
"Style" ) );
141 buttonBox->addButton(
mBtnStyle, QDialogButtonBox::ResetRole );
155 connect( mSliderBrightness, &QAbstractSlider::valueChanged, mBrightnessSpinBox, &QSpinBox::setValue );
156 connect( mBrightnessSpinBox,
static_cast<void ( QSpinBox::* )(
int )
>( &QSpinBox::valueChanged ), mSliderBrightness, &QAbstractSlider::setValue );
157 mBrightnessSpinBox->setClearValue( 0 );
159 connect( mSliderContrast, &QAbstractSlider::valueChanged, mContrastSpinBox, &QSpinBox::setValue );
160 connect( mContrastSpinBox,
static_cast<void ( QSpinBox::* )(
int )
>( &QSpinBox::valueChanged ), mSliderContrast, &QAbstractSlider::setValue );
161 mContrastSpinBox->setClearValue( 0 );
164 connect( mSliderGamma, &QAbstractSlider::valueChanged,
this, &QgsRasterLayerProperties::updateGammaSpinBox );
165 connect( mGammaSpinBox,
static_cast<void ( QDoubleSpinBox::* )(
double )
>( &QDoubleSpinBox::valueChanged ),
this, &QgsRasterLayerProperties::updateGammaSlider );
166 mGammaSpinBox->setClearValue( 1.0 );
169 connect( sliderSaturation, &QAbstractSlider::valueChanged, spinBoxSaturation, &QSpinBox::setValue );
170 connect( spinBoxSaturation,
static_cast<void ( QSpinBox::* )(
int )
>( &QSpinBox::valueChanged ), sliderSaturation, &QAbstractSlider::setValue );
171 spinBoxSaturation->setClearValue( 0 );
174 connect( sliderColorizeStrength, &QAbstractSlider::valueChanged, spinColorizeStrength, &QSpinBox::setValue );
175 connect( spinColorizeStrength,
static_cast<void ( QSpinBox::* )(
int )
>( &QSpinBox::valueChanged ), sliderColorizeStrength, &QAbstractSlider::setValue );
176 spinColorizeStrength->setClearValue( 100 );
179 connect( comboGrayscale,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsRasterLayerProperties::toggleSaturationControls );
182 connect( mColorizeCheck, &QAbstractButton::toggled,
this, &QgsRasterLayerProperties::toggleColorizeControls );
185 connect( lbxPyramidResolutions, &QListWidget::itemSelectionChanged,
this, &QgsRasterLayerProperties::toggleBuildPyramidsButton );
187 mRefreshSettingsWidget->setLayer( mRasterLayer );
188 mMapLayerServerPropertiesWidget->setHasWfsTitle(
false );
189 mMapLayerServerPropertiesWidget->setServerProperties( mRasterLayer->serverProperties() );
192 mScaleRangeWidget->setMapCanvas(
mCanvas );
207 mEnableMapTips->setChecked( mRasterLayer->mapTipsEnabled() );
209 updateRasterAttributeTableOptionsPage();
213 connect( mCreateRasterAttributeTableButton, &QPushButton::clicked,
this, [
this] {
214 if ( mRasterLayer->canCreateRasterAttributeTable() )
219 if ( dlg.exec() == QDialog::Accepted )
221 updateRasterAttributeTableOptionsPage();
226 connect( mLoadRasterAttributeTableFromFileButton, &QPushButton::clicked,
this, [
this] {
230 if ( dlg.exec() == QDialog::Accepted )
232 updateRasterAttributeTableOptionsPage();
236 mBackupCrs = mRasterLayer->crs();
239 if (
mCanvas && mRasterTransparencyWidget->pixelSelectorTool() )
249 connect( mRasterTransparencyWidget->pbnAddValuesFromDisplay, &QPushButton::clicked,
this, [
this] {
254 mCanvas->window()->raise();
255 mCanvas->window()->activateWindow();
256 mCanvas->window()->setFocus();
262 mContext =
mCanvas->createExpressionContext();
277 connect( mInsertExpressionButton, &QAbstractButton::clicked,
this, [
this] {
279 int selectionStart = mMapTipWidget->selectionStart();
280 int selectionEnd = mMapTipWidget->selectionEnd();
284 exprDlg.setWindowTitle( tr(
"Insert Expression" ) );
285 if ( exprDlg.exec() == QDialog::Accepted && !exprDlg.
expressionText().trimmed().isEmpty() )
286 mMapTipWidget->insertText(
"[%" + exprDlg.
expressionText().trimmed() +
"%]" );
288 mMapTipWidget->setLinearSelection( selectionStart, selectionEnd );
297 cboResamplingMethod->clear();
300 for (
const QPair<QString, QString> &method : std::as_const( constProviderType ) )
302 cboResamplingMethod->addItem( method.second, method.first );
306 QString prefix = provider->name() +
"/driverOptions/_pyramids/";
308 QString defaultMethod = mySettings.
value( prefix +
"resampling",
"AVERAGE" ).toString();
309 int idx = cboResamplingMethod->findData( defaultMethod );
311 cboResamplingMethod->setCurrentIndex( idx );
315 const QList<QgsRasterPyramid> myPyramidList = provider->buildPyramidList();
319 if ( pyramid.getExists() )
321 lbxPyramidResolutions->addItem(
new QListWidgetItem( myPyramidPixmap, QString::number( pyramid.getXDim() ) + u
" x "_s + QString::number( pyramid.getYDim() ) ) );
325 lbxPyramidResolutions->addItem(
new QListWidgetItem( myNoPyramidPixmap, QString::number( pyramid.getXDim() ) + u
" x "_s + QString::number( pyramid.getYDim() ) ) );
332 mOptsPage_Pyramids->setEnabled(
false );
341 mOptsPage_Histogram->setEnabled(
false );
344 QVBoxLayout *layout =
new QVBoxLayout( metadataFrame );
345 layout->setContentsMargins( 0, 0, 0, 0 );
347 mMetadataWidget->layout()->setContentsMargins( 0, 0, 0, 0 );
348 mMetadataWidget->setMapCanvas(
mCanvas );
349 layout->addWidget( mMetadataWidget );
350 metadataFrame->setLayout( layout );
352 QVBoxLayout *temporalLayout =
new QVBoxLayout( temporalFrame );
353 temporalLayout->setContentsMargins( 0, 0, 0, 0 );
355 temporalLayout->addWidget( mTemporalWidget );
358 QgsDebugMsgLevel(
"Setting crs to " + mRasterLayer->crs().userFriendlyIdentifier(), 2 );
359 mCrsSelector->setCrs( mRasterLayer->crs() );
362 QString pyramidFormat( u
"<h2>%1</h2><p>%2 %3 %4</p><b><font color='red'><p>%5</p><p>%6</p>"_s );
363 QString pyramidHeader = tr(
"Description" );
364 QString pyramidSentence1 = tr(
"Large resolution raster layers can slow navigation in QGIS." );
365 QString pyramidSentence2 = tr(
366 "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."
368 QString pyramidSentence3 = tr(
"You must have write access in the directory where the original data is stored to build pyramids." );
369 QString pyramidSentence4 = tr(
"Please note that building internal pyramids may alter the original data file and once created they cannot be removed!" );
370 QString pyramidSentence5 = tr(
"Please note that building internal pyramids could corrupt your image - always make a backup of your data first!" );
372 tePyramidDescription->setHtml( pyramidFormat.arg( pyramidHeader, pyramidSentence1, pyramidSentence2, pyramidSentence3, pyramidSentence4, pyramidSentence5 ) );
375 mResamplingGroupBox->setSaveCheckedState(
true );
376 mResamplingUtils.initWidgets( mRasterLayer, mZoomedInResamplingComboBox, mZoomedOutResamplingComboBox, mMaximumOversamplingSpinBox, mCbEarlyResampling );
377 mResamplingUtils.refreshWidgetsFromLayer();
381 btnColorizeColor->setColorDialogTitle( tr(
"Select Color" ) );
382 btnColorizeColor->setContext( u
"symbology"_s );
387 if ( hueSaturationFilter )
389 sliderSaturation->setValue( hueSaturationFilter->
saturation() );
390 comboGrayscale->setCurrentIndex( (
int ) hueSaturationFilter->
grayscaleMode() );
393 toggleSaturationControls(
static_cast<int>( hueSaturationFilter->
grayscaleMode() ) );
396 mColorizeCheck->setChecked( hueSaturationFilter->
colorizeOn() );
397 btnColorizeColor->setColor( hueSaturationFilter->
colorizeColor() );
398 toggleColorizeControls( hueSaturationFilter->
colorizeOn() );
399 sliderColorizeStrength->setValue( hueSaturationFilter->
colorizeStrength() );
400 mInvertColorsCheck->setChecked( hueSaturationFilter->
invertColors() );
405 mBlendModeComboBox->setBlendMode( mRasterLayer->blendMode() );
410 mRasterTransparencyWidget->cboxTransparencyBand->setShowNotSetOption(
true, tr(
"None" ) );
411 mRasterTransparencyWidget->cboxTransparencyBand->setLayer( mRasterLayer );
420 cboxTransparencyBand->setCurrentIndex( cboxTransparencyBand->findData( renderer->
alphaBand() ) );
427 mHistogramWidget =
nullptr;
428 if ( mOptsPage_Histogram->isEnabled() )
431 mHistogramStackedWidget->addWidget( mHistogramWidget );
446 mDisableRenderTypeComboBoxCurrentIndexChanged =
true;
448 for (
const QString &name : constRenderersList )
459 mDisableRenderTypeComboBoxCurrentIndexChanged =
false;
464 QString rendererType = renderer->
type();
465 widgetIndex = mRenderTypeComboBox->findData( rendererType );
466 if ( widgetIndex != -1 )
468 mDisableRenderTypeComboBoxCurrentIndexChanged =
true;
469 mRenderTypeComboBox->setCurrentIndex( widgetIndex );
470 mDisableRenderTypeComboBoxCurrentIndexChanged =
false;
473 if ( rendererType ==
"singlebandcolordata"_L1 && mRenderTypeComboBox->count() == 1 )
476 QSizePolicy sizep = mBandRenderingGrpBx->sizePolicy();
477 sizep.setVerticalStretch( 0 );
478 sizep.setVerticalPolicy( QSizePolicy::Maximum );
479 mBandRenderingGrpBx->setSizePolicy( sizep );
480 mBandRenderingGrpBx->updateGeometry();
483 if ( mRasterLayer->providerType() !=
"wms"_L1 )
485 mWMSPrintGroupBox->hide();
486 mPublishDataSourceUrlCheckBox->hide();
487 mBackgroundLayerCheckBox->hide();
493 mRenderTypeComboBox_currentIndexChanged( widgetIndex );
497 QMenu *menuStyle =
new QMenu(
this );
500 menuStyle->addSeparator();
504 connect( menuStyle, &QMenu::aboutToShow,
this, &QgsRasterLayerProperties::aboutToShowStyleMenu );
506 mBtnMetadata =
new QPushButton( tr(
"Metadata" ),
this );
507 QMenu *menuMetadata =
new QMenu(
this );
510 menuMetadata->addSeparator();
514 buttonBox->addButton(
mBtnMetadata, QDialogButtonBox::ResetRole );
522 if ( !settings.
contains( u
"/Windows/RasterLayerProperties/tab"_s ) )
532 mOptsPage_Information->setProperty(
"helpPage", u
"working_with_raster/raster_properties.html#information-properties"_s );
533 mOptsPage_Source->setProperty(
"helpPage", u
"working_with_raster/raster_properties.html#source-properties"_s );
534 mOptsPage_Style->setProperty(
"helpPage", u
"working_with_raster/raster_properties.html#symbology-properties"_s );
535 mOptsPage_Transparency->setProperty(
"helpPage", u
"working_with_raster/raster_properties.html#transparency-properties"_s );
536 mOptsPage_Labeling->setProperty(
"helpPage", u
"working_with_raster/raster_properties.html#labels-properties"_s );
538 if ( mOptsPage_Histogram )
539 mOptsPage_Histogram->setProperty(
"helpPage", u
"working_with_raster/raster_properties.html#histogram-properties"_s );
541 mOptsPage_Rendering->setProperty(
"helpPage", u
"working_with_raster/raster_properties.html#rendering-properties"_s );
542 mOptsPage_Temporal->setProperty(
"helpPage", u
"working_with_raster/raster_properties.html#temporal-properties"_s );
544 if ( mOptsPage_Pyramids )
545 mOptsPage_Pyramids->setProperty(
"helpPage", u
"working_with_raster/raster_properties.html#pyramids-properties"_s );
547 if ( mOptsPage_Display )
548 mOptsPage_Display->setProperty(
"helpPage", u
"working_with_raster/raster_properties.html#display-properties"_s );
550 mOptsPage_Metadata->setProperty(
"helpPage", u
"working_with_raster/raster_properties.html#metadata-properties"_s );
551 mOptsPage_Legend->setProperty(
"helpPage", u
"working_with_raster/raster_properties.html#legend-properties"_s );
552 mOptsPage_RasterAttributeTable->setProperty(
"helpPage", u
"working_with_raster/raster_properties.html#raster-attribute-tables"_s );
553 mOptsPage_Server->setProperty(
"helpPage", u
"working_with_raster/raster_properties.html#server-properties"_s );
573 if ( beforePage.isEmpty() )
581 mTemporalWidget->addWidget( page );
591void QgsRasterLayerProperties::updateRasterAttributeTableOptionsPage()
593 if ( mRasterAttributeTableWidget )
595 mOptsPage_RasterAttributeTable->layout()->removeWidget( mRasterAttributeTableWidget );
596 mRasterAttributeTableWidget =
nullptr;
600 if ( mRasterLayer->attributeTableCount() > 0 )
602 mRasterAttributeTableWidget =
new QgsRasterAttributeTableWidget(
this, mRasterLayer );
603 mOptsPage_RasterAttributeTable->layout()->addWidget( mRasterAttributeTableWidget );
606 mNoRasterAttributeTableWidget->hide();
610 mNoRasterAttributeTableWidget->show();
611 mCreateRasterAttributeTableButton->setEnabled( mRasterLayer->canCreateRasterAttributeTable() );
615void QgsRasterLayerProperties::setRendererWidget(
const QString &rendererName )
618 QgsRasterRendererWidget *oldWidget = mRendererWidget;
619 QgsRasterRenderer *oldRenderer = mRasterLayer->renderer();
624 const QList<int> oldBands = oldRenderer ? oldRenderer->
usesBands() : QList<int>();
629 opacity = oldRenderer->
opacity();
633 QgsRasterRendererRegistryEntry rendererEntry;
640 QgsRectangle myExtent =
mCanvas->mapSettings().outputExtentToLayerExtent( mRasterLayer,
mCanvas->extent() );
641 if ( oldWidget && ( !oldRenderer || rendererName != oldRenderer->
type() ) )
643 if ( rendererName ==
"singlebandgray"_L1 )
646 whileBlocking( mRasterLayer )->setDefaultContrastEnhancement();
648 else if ( rendererName ==
"multibandcolor"_L1 )
651 whileBlocking( mRasterLayer )->setDefaultContrastEnhancement();
654 mRasterLayer->renderer()->setAlphaBand( alphaBand );
655 mRasterLayer->renderer()->setOpacity( opacity );
656 mRasterLayer->renderer()->setNodataColor( nodataColor );
658 mRendererWidget->setMapCanvas(
mCanvas );
659 mRendererStackedWidget->addWidget( mRendererWidget );
663 std::unique_ptr<QgsRasterRenderer> newRenderer;
664 newRenderer.reset( mRendererWidget->renderer() );
665 const QList<int> newBands = newRenderer->usesBands();
666 if ( oldBands != newBands )
668 mRasterTransparencyWidget->syncToLayer();
674 const int widgetIndex = mRenderTypeComboBox->findData( rendererName );
675 if ( widgetIndex != -1 )
677 mDisableRenderTypeComboBoxCurrentIndexChanged =
true;
678 mRenderTypeComboBox->setCurrentIndex( widgetIndex );
679 mDisableRenderTypeComboBoxCurrentIndexChanged =
false;
682 if ( mRendererWidget != oldWidget )
685 if ( mHistogramWidget )
687 mHistogramWidget->setRendererWidget( rendererName, mRendererWidget );
691void QgsRasterLayerProperties::sync()
693 QgsSettings myQSettings;
695 if ( !mSourceWidget )
700 QHBoxLayout *layout =
new QHBoxLayout();
701 layout->addWidget( mSourceWidget );
702 mSourceGroupBox->setLayout( layout );
703 if ( !mSourceWidget->groupTitle().isEmpty() )
704 mSourceGroupBox->setTitle( mSourceWidget->groupTitle() );
705 mSourceGroupBox->show();
708 buttonBox->button( QDialogButtonBox::Apply )->setEnabled( isValid );
709 buttonBox->button( QDialogButtonBox::Ok )->setEnabled( isValid );
716 mSourceWidget->setMapCanvas(
mCanvas );
717 mSourceWidget->setSourceUri( mRasterLayer->source() );
720 const QgsRasterDataProvider *provider = mRasterLayer->dataProvider();
724 mRasterTransparencyWidget->syncToLayer();
725 mLabelingWidget->syncToLayer( mRasterLayer );
729 mRasterTransparencyWidget->gboxNoDataValue->setEnabled(
false );
730 mRasterTransparencyWidget->gboxCustomTransparency->setEnabled(
false );
731 mOptionsStackedWidget->setCurrentWidget( mOptsPage_Server );
737 if ( mOptsPage_Pyramids )
739 delete mOptsPage_Pyramids;
740 mOptsPage_Pyramids =
nullptr;
746 if ( mOptsPage_Histogram )
748 delete mOptsPage_Histogram;
749 mOptsPage_Histogram =
nullptr;
750 delete mHistogramWidget;
751 mHistogramWidget =
nullptr;
762 QgsBrightnessContrastFilter *brightnessFilter = mRasterLayer->brightnessFilter();
763 if ( brightnessFilter )
765 mSliderBrightness->setValue( brightnessFilter->
brightness() );
766 mSliderContrast->setValue( brightnessFilter->
contrast() );
767 mGammaSpinBox->setValue( brightnessFilter->
gamma() );
771 const QgsHueSaturationFilter *hueSaturationFilter = mRasterLayer->hueSaturationFilter();
773 if ( hueSaturationFilter )
775 sliderSaturation->setValue( hueSaturationFilter->
saturation() );
776 comboGrayscale->setCurrentIndex( (
int ) hueSaturationFilter->
grayscaleMode() );
779 toggleSaturationControls(
static_cast<int>( hueSaturationFilter->
grayscaleMode() ) );
782 mColorizeCheck->setChecked( hueSaturationFilter->
colorizeOn() );
783 btnColorizeColor->setColor( hueSaturationFilter->
colorizeColor() );
784 toggleColorizeControls( hueSaturationFilter->
colorizeOn() );
785 sliderColorizeStrength->setValue( hueSaturationFilter->
colorizeStrength() );
786 mInvertColorsCheck->setChecked( hueSaturationFilter->
invertColors() );
790 mResamplingUtils.refreshWidgetsFromLayer();
792 mRefreshSettingsWidget->syncToLayer();
793 mMapLayerServerPropertiesWidget->sync();
800 mLayerOrigNameLineEd->setText( mRasterLayer->name() );
807 updateInformationContent();
809 mEnableMapTips->setChecked( mRasterLayer->mapTipsEnabled() );
810 mMapTipWidget->setText( mRasterLayer->mapTipTemplate() );
813 QVariant wmsPrintLayer = mRasterLayer->customProperty( u
"WMSPrintLayer"_s );
814 if ( wmsPrintLayer.isValid() )
816 mWMSPrintLayerLineEdit->setText( wmsPrintLayer.toString() );
819 QVariant wmsPublishDataSourceUrl = mRasterLayer->customProperty( u
"WMSPublishDataSourceUrl"_s,
false );
820 mPublishDataSourceUrlCheckBox->setChecked( wmsPublishDataSourceUrl.toBool() );
822 QVariant wmsBackgroundLayer = mRasterLayer->customProperty( u
"WMSBackgroundLayer"_s,
false );
823 mBackgroundLayerCheckBox->setChecked( wmsBackgroundLayer.toBool() );
825 mLegendPlaceholderWidget->setLastPathSettingsKey( u
"lastLegendPlaceholderDir"_s );
826 mLegendPlaceholderWidget->setSource( mRasterLayer->legendPlaceholderImage() );
827 mLegendConfigEmbeddedWidget->setLayer( mRasterLayer );
830 mTemporalWidget->syncToLayer();
832 mPropertyCollection = mRasterLayer->pipe()->dataDefinedProperties();
833 updateDataDefinedButtons();
835 for ( QgsMapLayerConfigWidget *page : std::as_const(
mConfigWidgets ) )
837 page->syncToLayer( mRasterLayer );
845 const QString newSource = mSourceWidget->sourceUri();
846 if ( newSource != mRasterLayer->source() )
861 mRasterLayer->setLegendPlaceholderImage( mLegendPlaceholderWidget->source() );
862 mLegendConfigEmbeddedWidget->applyToLayer();
872 if ( mRasterLayer->brightnessFilter() )
874 mRasterLayer->brightnessFilter()->setBrightness( mSliderBrightness->value() );
875 mRasterLayer->brightnessFilter()->setContrast( mSliderContrast->value() );
876 mRasterLayer->brightnessFilter()->setGamma( mGammaSpinBox->value() );
884 mRasterTransparencyWidget->applyToRasterProvider( mRasterLayer->dataProvider() );
888 if ( rendererWidget )
892 mRasterLayer->setRenderer( rendererWidget->
renderer() );
895 mBackupCrs = mRasterLayer->crs();
896 mMetadataWidget->acceptMetadata();
897 mMetadataFilled =
false;
901 mRasterTransparencyWidget->applyToRasterRenderer( rasterRenderer );
903 mLabelingWidget->apply();
905 if ( rasterRenderer )
908 mRasterLayer->emitStyleChanged();
915 mRasterLayer->setName( mLayerOrigNameLineEd->text() );
918 mRasterLayer->setScaleBasedVisibility( chkUseScaleDependentRendering->isChecked() );
919 mRasterLayer->setMinimumScale( mScaleRangeWidget->minimumScale() );
920 mRasterLayer->setMaximumScale( mScaleRangeWidget->maximumScale() );
922 mRefreshSettingsWidget->saveToLayer();
923 if ( mMapLayerServerPropertiesWidget->save() )
924 mMetadataFilled =
true;
931 mResamplingUtils.refreshLayerFromWidgets();
935 if ( hueSaturationFilter )
937 hueSaturationFilter->
setSaturation( sliderSaturation->value() );
939 hueSaturationFilter->
setColorizeOn( mColorizeCheck->checkState() );
942 hueSaturationFilter->
setInvertColors( mInvertColorsCheck->isChecked() );
946 mRasterLayer->setBlendMode( mBlendModeComboBox->blendMode() );
949 mTemporalWidget->saveTemporalProperties();
951 mRasterLayer->setCrs( mCrsSelector->crs() );
953 if ( !mWMSPrintLayerLineEdit->text().isEmpty() )
955 mRasterLayer->setCustomProperty( u
"WMSPrintLayer"_s, mWMSPrintLayerLineEdit->text() );
958 mRasterLayer->setCustomProperty(
"WMSPublishDataSourceUrl", mPublishDataSourceUrlCheckBox->isChecked() );
959 mRasterLayer->setCustomProperty(
"WMSBackgroundLayer", mBackgroundLayerCheckBox->isChecked() );
961 mRasterLayer->pipe()->setDataDefinedProperties( mPropertyCollection );
963 mRasterLayer->setMapTipsEnabled( mEnableMapTips->isChecked() );
964 mRasterLayer->setMapTipTemplate( mMapTipWidget->text() );
974 mRasterLayer->triggerRepaint();
980void QgsRasterLayerProperties::buttonBuildPyramids_clicked()
984 auto feedback = std::make_unique<QgsRasterBlockFeedback>();
992 for (
int myCounterInt = 0; myCounterInt < lbxPyramidResolutions->count(); myCounterInt++ )
994 QListWidgetItem *myItem = lbxPyramidResolutions->item( myCounterInt );
996 myPyramidList[myCounterInt].setBuild( myItem->isSelected() || myPyramidList[myCounterInt].getExists() );
1000 QString prefix = provider->
name() +
"/driverOptions/_pyramids/";
1001 QgsSettings mySettings;
1002 QString resamplingMethod( cboResamplingMethod->currentData().toString() );
1003 mySettings.
setValue( prefix +
"resampling", resamplingMethod );
1010 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(
1029 tr(
"Building Pyramids" ),
1031 "The file was not writable. Some formats do not "
1032 "support pyramid overviews. Consult the GDAL documentation if in doubt."
1036 else if ( res ==
"FAILED_NOT_SUPPORTED"_L1 )
1038 QMessageBox::warning(
this, tr(
"Building Pyramids" ), tr(
"Building pyramid overviews is not supported on this type of raster." ) );
1040 else if ( res ==
"ERROR_JPEG_COMPRESSION"_L1 )
1042 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." ) );
1044 else if ( res ==
"ERROR_VIRTUAL"_L1 )
1046 QMessageBox::warning(
this, tr(
"Building Pyramids" ), tr(
"Building pyramid overviews is not supported on this type of raster." ) );
1053 lbxPyramidResolutions->clear();
1059 for (
const QgsRasterPyramid &pyramid : std::as_const( myPyramidList ) )
1061 if ( pyramid.getExists() )
1063 lbxPyramidResolutions->addItem(
new QListWidgetItem( myPyramidPixmap, QString::number( pyramid.getXDim() ) + u
" x "_s + QString::number( pyramid.getYDim() ) ) );
1067 lbxPyramidResolutions->addItem(
new QListWidgetItem( myNoPyramidPixmap, QString::number( pyramid.getXDim() ) + u
" x "_s + QString::number( pyramid.getYDim() ) ) );
1076 updateInformationContent();
1079void QgsRasterLayerProperties::mRenderTypeComboBox_currentIndexChanged(
int index )
1081 if ( index < 0 || mDisableRenderTypeComboBoxCurrentIndexChanged || !mRasterLayer->renderer() )
1086 QString rendererName = mRenderTypeComboBox->itemData( index ).toString();
1087 setRendererWidget( rendererName );
1093 mRasterLayer->setCrs( crs );
1094 mMetadataWidget->crsChanged();
1097void QgsRasterLayerProperties::aboutToShowStyleMenu()
1101 QMenu *m = qobject_cast<QMenu *>( sender() );
1111 QgsRasterRenderer *renderer = mRasterLayer->renderer();
1114 setRendererWidget( renderer->
type() );
1117 mRasterLayer->triggerRepaint();
1124 if ( !mHistogramWidget )
1129 mHistogramWidget->setActive(
true );
1133 mHistogramWidget->setActive(
false );
1136 if ( index ==
mOptStackedWidget->indexOf( mOptsPage_Information ) || !mMetadataFilled )
1139 updateInformationContent();
1145 button->blockSignals(
true );
1149 button->blockSignals(
false );
1152void QgsRasterLayerProperties::updateDataDefinedButtons()
1154 const QList<QgsPropertyOverrideButton *> propertyOverrideButtons { findChildren<QgsPropertyOverrideButton *>() };
1155 for ( QgsPropertyOverrideButton *button : propertyOverrideButtons )
1157 updateDataDefinedButton( button );
1173void QgsRasterLayerProperties::updateProperty()
1175 QgsPropertyOverrideButton *button = qobject_cast<QgsPropertyOverrideButton *>( sender() );
1177 mPropertyCollection.setProperty( key, button->
toProperty() );
1180void QgsRasterLayerProperties::toggleSaturationControls(
int grayscaleMode )
1183 if ( grayscaleMode == 0 )
1185 sliderSaturation->setEnabled(
true );
1186 spinBoxSaturation->setEnabled(
true );
1190 sliderSaturation->setEnabled(
false );
1191 spinBoxSaturation->setEnabled(
false );
1195void QgsRasterLayerProperties::toggleColorizeControls(
bool colorizeEnabled )
1198 btnColorizeColor->setEnabled( colorizeEnabled );
1199 sliderColorizeStrength->setEnabled( colorizeEnabled );
1200 spinColorizeStrength->setEnabled( colorizeEnabled );
1204QLinearGradient QgsRasterLayerProperties::redGradient()
1208 QLinearGradient myGradient = QLinearGradient( mGradientWidth, 0, mGradientWidth, mGradientHeight );
1209 myGradient.setColorAt( 0.0, QColor( 242, 14, 25, 190 ) );
1210 myGradient.setColorAt( 0.5, QColor( 175, 29, 37, 190 ) );
1211 myGradient.setColorAt( 1.0, QColor( 114, 17, 22, 190 ) );
1214QLinearGradient QgsRasterLayerProperties::greenGradient()
1218 QLinearGradient myGradient = QLinearGradient( mGradientWidth, 0, mGradientWidth, mGradientHeight );
1219 myGradient.setColorAt( 0.0, QColor( 48, 168, 5, 190 ) );
1220 myGradient.setColorAt( 0.8, QColor( 36, 122, 4, 190 ) );
1221 myGradient.setColorAt( 1.0, QColor( 21, 71, 2, 190 ) );
1224QLinearGradient QgsRasterLayerProperties::blueGradient()
1228 QLinearGradient myGradient = QLinearGradient( mGradientWidth, 0, mGradientWidth, mGradientHeight );
1229 myGradient.setColorAt( 0.0, QColor( 30, 0, 106, 190 ) );
1230 myGradient.setColorAt( 0.2, QColor( 30, 72, 128, 190 ) );
1231 myGradient.setColorAt( 1.0, QColor( 30, 223, 196, 190 ) );
1234QLinearGradient QgsRasterLayerProperties::grayGradient()
1238 QLinearGradient myGradient = QLinearGradient( mGradientWidth, 0, mGradientWidth, mGradientHeight );
1239 myGradient.setColorAt( 0.0, QColor( 5, 5, 5, 190 ) );
1240 myGradient.setColorAt( 0.8, QColor( 122, 122, 122, 190 ) );
1241 myGradient.setColorAt( 1.0, QColor( 220, 220, 220, 190 ) );
1244QLinearGradient QgsRasterLayerProperties::highlightGradient()
1248 QLinearGradient myGradient = QLinearGradient( mGradientWidth, 0, mGradientWidth, mGradientHeight );
1249 myGradient.setColorAt( 1.0, QColor( 255, 255, 255, 50 ) );
1250 myGradient.setColorAt( 0.5, QColor( 255, 255, 255, 100 ) );
1251 myGradient.setColorAt( 0.0, QColor( 255, 255, 255, 150 ) );
1266void QgsRasterLayerProperties::restoreWindowModality()
1275void QgsRasterLayerProperties::toggleBuildPyramidsButton()
1277 if ( lbxPyramidResolutions->selectedItems().empty() )
1279 buttonBuildPyramids->setEnabled(
false );
1283 buttonBuildPyramids->setEnabled(
true );
1287void QgsRasterLayerProperties::mResetColorRenderingBtn_clicked()
1289 mBlendModeComboBox->setBlendMode( QPainter::CompositionMode_SourceOver );
1290 mSliderBrightness->setValue( 0 );
1291 mSliderContrast->setValue( 0 );
1292 mGammaSpinBox->setValue( 1.0 );
1293 sliderSaturation->setValue( 0 );
1295 mColorizeCheck->setChecked(
false );
1296 sliderColorizeStrength->setValue( 100 );
1297 mInvertColorsCheck->setChecked(
false );
1300bool QgsRasterLayerProperties::rasterIsMultiBandColor()
1302 return mRasterLayer &&
nullptr !=
dynamic_cast<QgsMultiBandColorRenderer *
>( mRasterLayer->renderer() );
1305void QgsRasterLayerProperties::updateInformationContent()
1308 myStyle.append( u
"body { margin: 10px; }\n "_s );
1309 mMetadataViewer->clear();
1310 mMetadataViewer->document()->setDefaultStyleSheet( myStyle );
1311 mMetadataViewer->setHtml( mRasterLayer->htmlMetadata() );
1312 mMetadataFilled =
true;
1318 if ( mRasterAttributeTableWidget && mRasterAttributeTableWidget->isDirty() )
1320 mRasterAttributeTableWidget->setEditable(
false,
false );
1324 if ( mBackupCrs != mRasterLayer->crs() )
1325 mRasterLayer->setCrs( mBackupCrs );
1328void QgsRasterLayerProperties::showHelp()
1330 const QVariant helpPage = mOptionsStackedWidget->currentWidget()->property(
"helpPage" );
1332 if ( helpPage.isValid() )
1342void QgsRasterLayerProperties::updateGammaSpinBox(
int value )
1347void QgsRasterLayerProperties::updateGammaSlider(
double value )
1356 if ( obj == mMapTipPreviewContainer && ev->type() == QEvent::Resize )
1360 return QgsOptionsDialogBase::eventFilter( obj, ev );
1363void QgsRasterLayerProperties::initMapTipPreview()
1366 mMapTipSplitter->setSizes( { 400, 200 } );
1368 mMapTipPreviewContainer->installEventFilter(
this );
1372 mMapTipPreview =
new QgsWebView( mMapTipPreviewContainer );
1373 mMapTipPreviewLayout->addWidget( mMapTipPreview );
1375 mMapTipPreview->page()->settings()->setAttribute( QWebSettings::DeveloperExtrasEnabled,
true );
1376 mMapTipPreview->page()->settings()->setAttribute( QWebSettings::JavascriptEnabled,
true );
1377 mMapTipPreview->page()->settings()->setAttribute( QWebSettings::LocalStorageEnabled,
true );
1380 mMapTipPreview->page()->mainFrame()->setScrollBarPolicy( Qt::Horizontal, Qt::ScrollBarAlwaysOff );
1381 mMapTipPreview->page()->mainFrame()->setScrollBarPolicy( Qt::Vertical, Qt::ScrollBarAlwaysOff );
1385 connect( mMapTipWidget, &QgsCodeEditorHTML::textChanged,
this, &QgsRasterLayerProperties::updateMapTipPreview );
1388void QgsRasterLayerProperties::updateMapTipPreview()
1390 mMapTipPreview->setMaximumSize( mMapTipPreviewContainer->width(), mMapTipPreviewContainer->height() );
1392 mMapTipPreview->setHtml( htmlContent );
1395void QgsRasterLayerProperties::resizeMapTip()
1398 mMapTipPreview->setMaximumSize( mMapTipPreviewContainer->width(), mMapTipPreviewContainer->height() );
1399 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.
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 std::unique_ptr< QgsExpressionContextScope > globalScope()
Creates a new scope which contains variables and functions relating to the global QGIS context.
static std::unique_ptr< QgsExpressionContextScope > mapLayerPositionScope(const QgsPointXY &position)
Sets the expression context variables which are available for expressions triggered by moving the mou...
static std::unique_ptr< QgsExpressionContextScope > layerScope(const QgsMapLayer *layer)
Creates a new scope which contains variables and functions relating to a QgsMapLayer.
static std::unique_ptr< QgsExpressionContextScope > mapSettingsScope(const QgsMapSettings &mapSettings)
Creates a new scope which contains variables and functions relating to a QgsMapSettings object.
static std::unique_ptr< QgsExpressionContextScope > atlasScope(const QgsLayoutAtlas *atlas)
Creates a new scope which contains variables and functions relating to a QgsLayoutAtlas.
static std::unique_ptr< QgsExpressionContextScope > projectScope(const QgsProject *project)
Creates a new scope which contains variables and functions relating to a QGIS project.
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.
void openUrl(const QUrl &url)
Handles opening a url from the dialog.
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