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 );
528 mOptsPage_Labeling->setProperty(
"helpPage", u
"working_with_raster/raster_properties.html#labels-properties"_s );
530 if ( mOptsPage_Histogram )
531 mOptsPage_Histogram->setProperty(
"helpPage", u
"working_with_raster/raster_properties.html#histogram-properties"_s );
533 mOptsPage_Rendering->setProperty(
"helpPage", u
"working_with_raster/raster_properties.html#rendering-properties"_s );
534 mOptsPage_Temporal->setProperty(
"helpPage", u
"working_with_raster/raster_properties.html#temporal-properties"_s );
536 if ( mOptsPage_Pyramids )
537 mOptsPage_Pyramids->setProperty(
"helpPage", u
"working_with_raster/raster_properties.html#pyramids-properties"_s );
539 if ( mOptsPage_Display )
540 mOptsPage_Display->setProperty(
"helpPage", u
"working_with_raster/raster_properties.html#display-properties"_s );
542 mOptsPage_Metadata->setProperty(
"helpPage", u
"working_with_raster/raster_properties.html#metadata-properties"_s );
543 mOptsPage_Legend->setProperty(
"helpPage", u
"working_with_raster/raster_properties.html#legend-properties"_s );
544 mOptsPage_RasterAttributeTable->setProperty(
"helpPage", u
"working_with_raster/raster_properties.html#raster-attribute-tables"_s );
545 mOptsPage_Server->setProperty(
"helpPage", u
"working_with_raster/raster_properties.html#server-properties"_s );
565 if ( beforePage.isEmpty() )
573 mTemporalWidget->addWidget( page );
583void QgsRasterLayerProperties::updateRasterAttributeTableOptionsPage()
585 if ( mRasterAttributeTableWidget )
587 mOptsPage_RasterAttributeTable->layout()->removeWidget( mRasterAttributeTableWidget );
588 mRasterAttributeTableWidget =
nullptr;
592 if ( mRasterLayer->attributeTableCount() > 0 )
594 mRasterAttributeTableWidget =
new QgsRasterAttributeTableWidget(
this, mRasterLayer );
595 mOptsPage_RasterAttributeTable->layout()->addWidget( mRasterAttributeTableWidget );
598 mNoRasterAttributeTableWidget->hide();
602 mNoRasterAttributeTableWidget->show();
603 mCreateRasterAttributeTableButton->setEnabled( mRasterLayer->canCreateRasterAttributeTable() );
607void QgsRasterLayerProperties::setRendererWidget(
const QString &rendererName )
610 QgsRasterRendererWidget *oldWidget = mRendererWidget;
611 QgsRasterRenderer *oldRenderer = mRasterLayer->renderer();
616 const QList<int> oldBands = oldRenderer ? oldRenderer->
usesBands() : QList<int>();
621 opacity = oldRenderer->
opacity();
625 QgsRasterRendererRegistryEntry rendererEntry;
632 QgsRectangle myExtent =
mCanvas->mapSettings().outputExtentToLayerExtent( mRasterLayer,
mCanvas->extent() );
633 if ( oldWidget && ( !oldRenderer || rendererName != oldRenderer->
type() ) )
635 if ( rendererName ==
"singlebandgray"_L1 )
638 whileBlocking( mRasterLayer )->setDefaultContrastEnhancement();
640 else if ( rendererName ==
"multibandcolor"_L1 )
643 whileBlocking( mRasterLayer )->setDefaultContrastEnhancement();
646 mRasterLayer->renderer()->setAlphaBand( alphaBand );
647 mRasterLayer->renderer()->setOpacity( opacity );
648 mRasterLayer->renderer()->setNodataColor( nodataColor );
650 mRendererWidget->setMapCanvas(
mCanvas );
651 mRendererStackedWidget->addWidget( mRendererWidget );
655 std::unique_ptr<QgsRasterRenderer> newRenderer;
656 newRenderer.reset( mRendererWidget->renderer() );
657 const QList<int> newBands = newRenderer->usesBands();
658 if ( oldBands != newBands )
660 mRasterTransparencyWidget->syncToLayer();
666 const int widgetIndex = mRenderTypeComboBox->findData( rendererName );
667 if ( widgetIndex != -1 )
669 mDisableRenderTypeComboBoxCurrentIndexChanged =
true;
670 mRenderTypeComboBox->setCurrentIndex( widgetIndex );
671 mDisableRenderTypeComboBoxCurrentIndexChanged =
false;
674 if ( mRendererWidget != oldWidget )
677 if ( mHistogramWidget )
679 mHistogramWidget->setRendererWidget( rendererName, mRendererWidget );
683void QgsRasterLayerProperties::sync()
685 QgsSettings myQSettings;
687 if ( !mSourceWidget )
692 QHBoxLayout *layout =
new QHBoxLayout();
693 layout->addWidget( mSourceWidget );
694 mSourceGroupBox->setLayout( layout );
695 if ( !mSourceWidget->groupTitle().isEmpty() )
696 mSourceGroupBox->setTitle( mSourceWidget->groupTitle() );
697 mSourceGroupBox->show();
700 buttonBox->button( QDialogButtonBox::Apply )->setEnabled( isValid );
701 buttonBox->button( QDialogButtonBox::Ok )->setEnabled( isValid );
708 mSourceWidget->setMapCanvas(
mCanvas );
709 mSourceWidget->setSourceUri( mRasterLayer->source() );
712 const QgsRasterDataProvider *provider = mRasterLayer->dataProvider();
716 mRasterTransparencyWidget->syncToLayer();
717 mLabelingWidget->syncToLayer( mRasterLayer );
722 mRasterTransparencyWidget->gboxNoDataValue->setEnabled(
false );
723 mRasterTransparencyWidget->gboxCustomTransparency->setEnabled(
false );
724 mOptionsStackedWidget->setCurrentWidget( mOptsPage_Server );
731 if ( mOptsPage_Pyramids )
733 delete mOptsPage_Pyramids;
734 mOptsPage_Pyramids =
nullptr;
740 if ( mOptsPage_Histogram )
742 delete mOptsPage_Histogram;
743 mOptsPage_Histogram =
nullptr;
744 delete mHistogramWidget;
745 mHistogramWidget =
nullptr;
756 QgsBrightnessContrastFilter *brightnessFilter = mRasterLayer->brightnessFilter();
757 if ( brightnessFilter )
759 mSliderBrightness->setValue( brightnessFilter->
brightness() );
760 mSliderContrast->setValue( brightnessFilter->
contrast() );
761 mGammaSpinBox->setValue( brightnessFilter->
gamma() );
765 const QgsHueSaturationFilter *hueSaturationFilter = mRasterLayer->hueSaturationFilter();
767 if ( hueSaturationFilter )
769 sliderSaturation->setValue( hueSaturationFilter->
saturation() );
770 comboGrayscale->setCurrentIndex( (
int ) hueSaturationFilter->
grayscaleMode() );
773 toggleSaturationControls(
static_cast<int>( hueSaturationFilter->
grayscaleMode() ) );
776 mColorizeCheck->setChecked( hueSaturationFilter->
colorizeOn() );
777 btnColorizeColor->setColor( hueSaturationFilter->
colorizeColor() );
778 toggleColorizeControls( hueSaturationFilter->
colorizeOn() );
779 sliderColorizeStrength->setValue( hueSaturationFilter->
colorizeStrength() );
780 mInvertColorsCheck->setChecked( hueSaturationFilter->
invertColors() );
784 mResamplingUtils.refreshWidgetsFromLayer();
786 mRefreshSettingsWidget->syncToLayer();
787 mMapLayerServerPropertiesWidget->sync();
794 mLayerOrigNameLineEd->setText( mRasterLayer->name() );
801 updateInformationContent();
803 mEnableMapTips->setChecked( mRasterLayer->mapTipsEnabled() );
804 mMapTipWidget->setText( mRasterLayer->mapTipTemplate() );
807 QVariant wmsPrintLayer = mRasterLayer->customProperty( u
"WMSPrintLayer"_s );
808 if ( wmsPrintLayer.isValid() )
810 mWMSPrintLayerLineEdit->setText( wmsPrintLayer.toString() );
813 QVariant wmsPublishDataSourceUrl = mRasterLayer->customProperty( u
"WMSPublishDataSourceUrl"_s,
false );
814 mPublishDataSourceUrlCheckBox->setChecked( wmsPublishDataSourceUrl.toBool() );
816 QVariant wmsBackgroundLayer = mRasterLayer->customProperty( u
"WMSBackgroundLayer"_s,
false );
817 mBackgroundLayerCheckBox->setChecked( wmsBackgroundLayer.toBool() );
819 mLegendPlaceholderWidget->setLastPathSettingsKey( u
"lastLegendPlaceholderDir"_s );
820 mLegendPlaceholderWidget->setSource( mRasterLayer->legendPlaceholderImage() );
821 mLegendConfigEmbeddedWidget->setLayer( mRasterLayer );
824 mTemporalWidget->syncToLayer();
826 mPropertyCollection = mRasterLayer->pipe()->dataDefinedProperties();
827 updateDataDefinedButtons();
829 for ( QgsMapLayerConfigWidget *page : std::as_const(
mConfigWidgets ) )
831 page->syncToLayer( mRasterLayer );
839 const QString newSource = mSourceWidget->sourceUri();
840 if ( newSource != mRasterLayer->source() )
847 if ( !mRasterLayer->isValid() )
860 mRasterLayer->setLegendPlaceholderImage( mLegendPlaceholderWidget->source() );
861 mLegendConfigEmbeddedWidget->applyToLayer();
871 mRasterLayer->brightnessFilter()->setBrightness( mSliderBrightness->value() );
872 mRasterLayer->brightnessFilter()->setContrast( mSliderContrast->value() );
873 mRasterLayer->brightnessFilter()->setGamma( mGammaSpinBox->value() );
880 mRasterTransparencyWidget->applyToRasterProvider( mRasterLayer->dataProvider() );
884 if ( rendererWidget )
888 mRasterLayer->setRenderer( rendererWidget->
renderer() );
891 mBackupCrs = mRasterLayer->crs();
892 mMetadataWidget->acceptMetadata();
893 mMetadataFilled =
false;
897 mRasterTransparencyWidget->applyToRasterRenderer( rasterRenderer );
899 mLabelingWidget->apply();
901 if ( rasterRenderer )
904 mRasterLayer->emitStyleChanged();
911 mRasterLayer->setName( mLayerOrigNameLineEd->text() );
914 mRasterLayer->setScaleBasedVisibility( chkUseScaleDependentRendering->isChecked() );
915 mRasterLayer->setMinimumScale( mScaleRangeWidget->minimumScale() );
916 mRasterLayer->setMaximumScale( mScaleRangeWidget->maximumScale() );
918 mRefreshSettingsWidget->saveToLayer();
919 if ( mMapLayerServerPropertiesWidget->save() )
920 mMetadataFilled =
true;
927 mResamplingUtils.refreshLayerFromWidgets();
931 if ( hueSaturationFilter )
933 hueSaturationFilter->
setSaturation( sliderSaturation->value() );
935 hueSaturationFilter->
setColorizeOn( mColorizeCheck->checkState() );
938 hueSaturationFilter->
setInvertColors( mInvertColorsCheck->isChecked() );
942 mRasterLayer->setBlendMode( mBlendModeComboBox->blendMode() );
945 mTemporalWidget->saveTemporalProperties();
947 mRasterLayer->setCrs( mCrsSelector->crs() );
949 if ( !mWMSPrintLayerLineEdit->text().isEmpty() )
951 mRasterLayer->setCustomProperty( u
"WMSPrintLayer"_s, mWMSPrintLayerLineEdit->text() );
954 mRasterLayer->setCustomProperty(
"WMSPublishDataSourceUrl", mPublishDataSourceUrlCheckBox->isChecked() );
955 mRasterLayer->setCustomProperty(
"WMSBackgroundLayer", mBackgroundLayerCheckBox->isChecked() );
957 mRasterLayer->pipe()->setDataDefinedProperties( mPropertyCollection );
959 mRasterLayer->setMapTipsEnabled( mEnableMapTips->isChecked() );
960 mRasterLayer->setMapTipTemplate( mMapTipWidget->text() );
970 mRasterLayer->triggerRepaint();
976void QgsRasterLayerProperties::buttonBuildPyramids_clicked()
980 auto feedback = std::make_unique<QgsRasterBlockFeedback>();
988 for (
int myCounterInt = 0; myCounterInt < lbxPyramidResolutions->count(); myCounterInt++ )
990 QListWidgetItem *myItem = lbxPyramidResolutions->item( myCounterInt );
992 myPyramidList[myCounterInt].setBuild( myItem->isSelected() || myPyramidList[myCounterInt].getExists() );
996 QString prefix = provider->
name() +
"/driverOptions/_pyramids/";
997 QgsSettings mySettings;
998 QString resamplingMethod( cboResamplingMethod->currentData().toString() );
999 mySettings.
setValue( prefix +
"resampling", resamplingMethod );
1006 QApplication::setOverrideCursor( Qt::WaitCursor );
1014 QApplication::restoreOverrideCursor();
1015 mPyramidProgress->setValue( 0 );
1016 buttonBuildPyramids->setEnabled(
false );
1017 if ( !res.isNull() )
1019 if ( res ==
"CANCELED"_L1 )
1023 else if ( res ==
"ERROR_WRITE_ACCESS"_L1 )
1025 QMessageBox::warning(
this, tr(
"Building Pyramids" ), tr(
"Write access denied. Adjust the file permissions and try again." ) );
1027 else if ( res ==
"ERROR_WRITE_FORMAT"_L1 )
1029 QMessageBox::warning(
this, tr(
"Building Pyramids" ), tr(
"The file was not writable. Some formats do not "
1030 "support pyramid overviews. Consult the GDAL documentation if in doubt." ) );
1032 else if ( res ==
"FAILED_NOT_SUPPORTED"_L1 )
1034 QMessageBox::warning(
this, tr(
"Building Pyramids" ), tr(
"Building pyramid overviews is not supported on this type of raster." ) );
1036 else if ( res ==
"ERROR_JPEG_COMPRESSION"_L1 )
1038 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." ) );
1040 else if ( res ==
"ERROR_VIRTUAL"_L1 )
1042 QMessageBox::warning(
this, tr(
"Building Pyramids" ), tr(
"Building pyramid overviews is not supported on this type of raster." ) );
1049 lbxPyramidResolutions->clear();
1055 for (
const QgsRasterPyramid &pyramid : std::as_const( myPyramidList ) )
1057 if ( pyramid.getExists() )
1059 lbxPyramidResolutions->addItem(
new QListWidgetItem( myPyramidPixmap, QString::number( pyramid.getXDim() ) + u
" x "_s + QString::number( pyramid.getYDim() ) ) );
1063 lbxPyramidResolutions->addItem(
new QListWidgetItem( myNoPyramidPixmap, QString::number( pyramid.getXDim() ) + u
" x "_s + QString::number( pyramid.getYDim() ) ) );
1072 updateInformationContent();
1075void QgsRasterLayerProperties::mRenderTypeComboBox_currentIndexChanged(
int index )
1077 if ( index < 0 || mDisableRenderTypeComboBoxCurrentIndexChanged || !mRasterLayer->renderer() )
1082 QString rendererName = mRenderTypeComboBox->itemData( index ).toString();
1083 setRendererWidget( rendererName );
1089 mRasterLayer->setCrs( crs );
1090 mMetadataWidget->crsChanged();
1093void QgsRasterLayerProperties::aboutToShowStyleMenu()
1097 QMenu *m = qobject_cast<QMenu *>( sender() );
1107 QgsRasterRenderer *renderer = mRasterLayer->renderer();
1110 setRendererWidget( renderer->
type() );
1113 mRasterLayer->triggerRepaint();
1120 if ( !mHistogramWidget )
1125 mHistogramWidget->setActive(
true );
1129 mHistogramWidget->setActive(
false );
1132 if ( index ==
mOptStackedWidget->indexOf( mOptsPage_Information ) || !mMetadataFilled )
1135 updateInformationContent();
1141 button->blockSignals(
true );
1145 button->blockSignals(
false );
1148void QgsRasterLayerProperties::updateDataDefinedButtons()
1150 const QList<QgsPropertyOverrideButton *> propertyOverrideButtons { findChildren<QgsPropertyOverrideButton *>() };
1151 for ( QgsPropertyOverrideButton *button : propertyOverrideButtons )
1153 updateDataDefinedButton( button );
1169void QgsRasterLayerProperties::updateProperty()
1171 QgsPropertyOverrideButton *button = qobject_cast<QgsPropertyOverrideButton *>( sender() );
1173 mPropertyCollection.setProperty( key, button->
toProperty() );
1176void QgsRasterLayerProperties::toggleSaturationControls(
int grayscaleMode )
1179 if ( grayscaleMode == 0 )
1181 sliderSaturation->setEnabled(
true );
1182 spinBoxSaturation->setEnabled(
true );
1186 sliderSaturation->setEnabled(
false );
1187 spinBoxSaturation->setEnabled(
false );
1191void QgsRasterLayerProperties::toggleColorizeControls(
bool colorizeEnabled )
1194 btnColorizeColor->setEnabled( colorizeEnabled );
1195 sliderColorizeStrength->setEnabled( colorizeEnabled );
1196 spinColorizeStrength->setEnabled( colorizeEnabled );
1200QLinearGradient QgsRasterLayerProperties::redGradient()
1204 QLinearGradient myGradient = QLinearGradient( mGradientWidth, 0, mGradientWidth, mGradientHeight );
1205 myGradient.setColorAt( 0.0, QColor( 242, 14, 25, 190 ) );
1206 myGradient.setColorAt( 0.5, QColor( 175, 29, 37, 190 ) );
1207 myGradient.setColorAt( 1.0, QColor( 114, 17, 22, 190 ) );
1210QLinearGradient QgsRasterLayerProperties::greenGradient()
1214 QLinearGradient myGradient = QLinearGradient( mGradientWidth, 0, mGradientWidth, mGradientHeight );
1215 myGradient.setColorAt( 0.0, QColor( 48, 168, 5, 190 ) );
1216 myGradient.setColorAt( 0.8, QColor( 36, 122, 4, 190 ) );
1217 myGradient.setColorAt( 1.0, QColor( 21, 71, 2, 190 ) );
1220QLinearGradient QgsRasterLayerProperties::blueGradient()
1224 QLinearGradient myGradient = QLinearGradient( mGradientWidth, 0, mGradientWidth, mGradientHeight );
1225 myGradient.setColorAt( 0.0, QColor( 30, 0, 106, 190 ) );
1226 myGradient.setColorAt( 0.2, QColor( 30, 72, 128, 190 ) );
1227 myGradient.setColorAt( 1.0, QColor( 30, 223, 196, 190 ) );
1230QLinearGradient QgsRasterLayerProperties::grayGradient()
1234 QLinearGradient myGradient = QLinearGradient( mGradientWidth, 0, mGradientWidth, mGradientHeight );
1235 myGradient.setColorAt( 0.0, QColor( 5, 5, 5, 190 ) );
1236 myGradient.setColorAt( 0.8, QColor( 122, 122, 122, 190 ) );
1237 myGradient.setColorAt( 1.0, QColor( 220, 220, 220, 190 ) );
1240QLinearGradient QgsRasterLayerProperties::highlightGradient()
1244 QLinearGradient myGradient = QLinearGradient( mGradientWidth, 0, mGradientWidth, mGradientHeight );
1245 myGradient.setColorAt( 1.0, QColor( 255, 255, 255, 50 ) );
1246 myGradient.setColorAt( 0.5, QColor( 255, 255, 255, 100 ) );
1247 myGradient.setColorAt( 0.0, QColor( 255, 255, 255, 150 ) );
1262void QgsRasterLayerProperties::restoreWindowModality()
1271void QgsRasterLayerProperties::toggleBuildPyramidsButton()
1273 if ( lbxPyramidResolutions->selectedItems().empty() )
1275 buttonBuildPyramids->setEnabled(
false );
1279 buttonBuildPyramids->setEnabled(
true );
1283void QgsRasterLayerProperties::mResetColorRenderingBtn_clicked()
1285 mBlendModeComboBox->setBlendMode( QPainter::CompositionMode_SourceOver );
1286 mSliderBrightness->setValue( 0 );
1287 mSliderContrast->setValue( 0 );
1288 mGammaSpinBox->setValue( 1.0 );
1289 sliderSaturation->setValue( 0 );
1291 mColorizeCheck->setChecked(
false );
1292 sliderColorizeStrength->setValue( 100 );
1293 mInvertColorsCheck->setChecked(
false );
1296bool QgsRasterLayerProperties::rasterIsMultiBandColor()
1298 return mRasterLayer &&
nullptr !=
dynamic_cast<QgsMultiBandColorRenderer *
>( mRasterLayer->renderer() );
1301void QgsRasterLayerProperties::updateInformationContent()
1305 const QString html { mRasterLayer->htmlMetadata().replace(
"<head>"_L1, QStringLiteral( R
"raw(<head><style type="text/css">%1</style>)raw" ) ).arg( myStyle ) };
1306 mMetadataViewer->setHtml( html );
1307 mMetadataFilled = true;
1313 if ( mRasterAttributeTableWidget && mRasterAttributeTableWidget->isDirty() )
1315 mRasterAttributeTableWidget->setEditable(
false,
false );
1319 if ( mBackupCrs != mRasterLayer->crs() )
1320 mRasterLayer->setCrs( mBackupCrs );
1323void QgsRasterLayerProperties::showHelp()
1325 const QVariant helpPage = mOptionsStackedWidget->currentWidget()->property(
"helpPage" );
1327 if ( helpPage.isValid() )
1337void QgsRasterLayerProperties::updateGammaSpinBox(
int value )
1342void QgsRasterLayerProperties::updateGammaSlider(
double value )
1351 if ( obj == mMapTipPreviewContainer && ev->type() == QEvent::Resize )
1355 return QgsOptionsDialogBase::eventFilter( obj, ev );
1358void QgsRasterLayerProperties::initMapTipPreview()
1361 mMapTipSplitter->setSizes( { 400, 200 } );
1363 mMapTipPreviewContainer->installEventFilter(
this );
1367 mMapTipPreview =
new QgsWebView( mMapTipPreviewContainer );
1368 mMapTipPreviewLayout->addWidget( mMapTipPreview );
1370 mMapTipPreview->page()->settings()->setAttribute( QWebSettings::DeveloperExtrasEnabled,
true );
1371 mMapTipPreview->page()->settings()->setAttribute( QWebSettings::JavascriptEnabled,
true );
1372 mMapTipPreview->page()->settings()->setAttribute( QWebSettings::LocalStorageEnabled,
true );
1375 mMapTipPreview->page()->mainFrame()->setScrollBarPolicy( Qt::Horizontal, Qt::ScrollBarAlwaysOff );
1376 mMapTipPreview->page()->mainFrame()->setScrollBarPolicy( Qt::Vertical, Qt::ScrollBarAlwaysOff );
1380 connect( mMapTipWidget, &QgsCodeEditorHTML::textChanged,
this, &QgsRasterLayerProperties::updateMapTipPreview );
1383void QgsRasterLayerProperties::updateMapTipPreview()
1385 mMapTipPreview->setMaximumSize( mMapTipPreviewContainer->width(), mMapTipPreviewContainer->height() );
1387 mMapTipPreview->setHtml( htmlContent );
1390void QgsRasterLayerProperties::resizeMapTip()
1393 mMapTipPreview->setMaximumSize( mMapTipPreviewContainer->width(), mMapTipPreviewContainer->height() );
1394 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