72#include <QDesktopServices>
73#include <QTableWidgetItem>
80#include <QLinearGradient>
81#include <QPainterPath>
83#include <QColorDialog>
90#include <QRegularExpressionValidator>
91#include <QRegularExpression>
96 , TRSTRING_NOT_SET( tr(
"Not Set" ) )
97 , mDefaultStandardDeviation( 0 )
98 , mDefaultRedBand( 0 )
99 , mDefaultGreenBand( 0 )
100 , mDefaultBlueBand( 0 )
102 , mGradientHeight( 0.0 )
103 , mGradientWidth( 0.0 )
104 , mMapCanvas( canvas )
105 , mMetadataFilled( false )
107 mGrayMinimumMaximumEstimated =
true;
108 mRGBMinimumMaximumEstimated =
true;
113 mOptsPage_Information->layout()->addWidget( mMetadataViewer );
117 transparencyScrollArea->setWidget( mRasterTransparencyWidget );
119 connect( buttonBuildPyramids, &QPushButton::clicked,
this, &QgsRasterLayerProperties::buttonBuildPyramids_clicked );
121 connect( mRenderTypeComboBox,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsRasterLayerProperties::mRenderTypeComboBox_currentIndexChanged );
122 connect( mResetColorRenderingBtn, &QToolButton::clicked,
this, &QgsRasterLayerProperties::mResetColorRenderingBtn_clicked );
123 connect( buttonRemoveMetadataUrl, &QPushButton::clicked,
this, &QgsRasterLayerProperties::removeSelectedMetadataUrl );
124 connect( buttonAddMetadataUrl, &QPushButton::clicked,
this, &QgsRasterLayerProperties::addMetadataUrl );
129 connect( buttonBox, &QDialogButtonBox::helpRequested,
this, &QgsRasterLayerProperties::showHelp );
131 mSourceGroupBox->hide();
133 mBtnStyle =
new QPushButton( tr(
"Style" ) );
134 QMenu *menuStyle =
new QMenu(
this );
137 menuStyle->addSeparator();
140 mBtnStyle->setMenu( menuStyle );
141 connect( menuStyle, &QMenu::aboutToShow,
this, &QgsRasterLayerProperties::aboutToShowStyleMenu );
142 buttonBox->addButton( mBtnStyle, QDialogButtonBox::ResetRole );
144 mBtnMetadata =
new QPushButton( tr(
"Metadata" ),
this );
145 QMenu *menuMetadata =
new QMenu(
this );
146 mActionLoadMetadata = menuMetadata->addAction( tr(
"Load Metadata…" ),
this, &QgsRasterLayerProperties::loadMetadata );
147 mActionSaveMetadataAs = menuMetadata->addAction( tr(
"Save Metadata…" ),
this, &QgsRasterLayerProperties::saveMetadataAs );
148 menuMetadata->addSeparator();
149 menuMetadata->addAction( tr(
"Save as Default" ),
this, &QgsRasterLayerProperties::saveDefaultMetadata );
150 menuMetadata->addAction( tr(
"Restore Default" ),
this, &QgsRasterLayerProperties::loadDefaultMetadata );
151 mBtnMetadata->setMenu( menuMetadata );
152 buttonBox->addButton( mBtnMetadata, QDialogButtonBox::ResetRole );
156 connect(
this, &QDialog::accepted,
this, &QgsRasterLayerProperties::apply );
157 connect(
this, &QDialog::rejected,
this, &QgsRasterLayerProperties::onCancel );
159 connect( buttonBox->button( QDialogButtonBox::Apply ), &QAbstractButton::clicked,
this, &QgsRasterLayerProperties::apply );
161 cbxPyramidsFormat->addItem( tr(
"External" ), QVariant::fromValue( Qgis::RasterPyramidFormat::GeoTiff ) );
162 cbxPyramidsFormat->addItem( tr(
"Internal (if possible)" ), QVariant::fromValue( Qgis::RasterPyramidFormat::Internal ) );
163 cbxPyramidsFormat->addItem( tr(
"External (Erdas Imagine)" ), QVariant::fromValue( Qgis::RasterPyramidFormat::Erdas ) );
166 connect( mSliderBrightness, &QAbstractSlider::valueChanged, mBrightnessSpinBox, &QSpinBox::setValue );
167 connect( mBrightnessSpinBox,
static_cast < void ( QSpinBox::* )(
int )
> ( &QSpinBox::valueChanged ), mSliderBrightness, &QAbstractSlider::setValue );
168 mBrightnessSpinBox->setClearValue( 0 );
170 connect( mSliderContrast, &QAbstractSlider::valueChanged, mContrastSpinBox, &QSpinBox::setValue );
171 connect( mContrastSpinBox,
static_cast < void ( QSpinBox::* )(
int )
> ( &QSpinBox::valueChanged ), mSliderContrast, &QAbstractSlider::setValue );
172 mContrastSpinBox->setClearValue( 0 );
175 connect( mSliderGamma, &QAbstractSlider::valueChanged,
this, &QgsRasterLayerProperties::updateGammaSpinBox );
176 connect( mGammaSpinBox,
static_cast < void ( QDoubleSpinBox::* )(
double )
> ( &QDoubleSpinBox::valueChanged ),
this, &QgsRasterLayerProperties::updateGammaSlider );
177 mGammaSpinBox->setClearValue( 1.0 );
180 connect( sliderSaturation, &QAbstractSlider::valueChanged, spinBoxSaturation, &QSpinBox::setValue );
181 connect( spinBoxSaturation,
static_cast < void ( QSpinBox::* )(
int )
> ( &QSpinBox::valueChanged ), sliderSaturation, &QAbstractSlider::setValue );
182 spinBoxSaturation->setClearValue( 0 );
185 connect( sliderColorizeStrength, &QAbstractSlider::valueChanged, spinColorizeStrength, &QSpinBox::setValue );
186 connect( spinColorizeStrength,
static_cast < void ( QSpinBox::* )(
int )
> ( &QSpinBox::valueChanged ), sliderColorizeStrength, &QAbstractSlider::setValue );
187 spinColorizeStrength->setClearValue( 100 );
190 connect( comboGrayscale,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsRasterLayerProperties::toggleSaturationControls );
193 connect( mColorizeCheck, &QAbstractButton::toggled,
this, &QgsRasterLayerProperties::toggleColorizeControls );
196 connect( lbxPyramidResolutions, &QListWidget::itemSelectionChanged,
this, &QgsRasterLayerProperties::toggleBuildPyramidsButton );
198 connect( mRefreshLayerCheckBox, &QCheckBox::toggled, mRefreshLayerIntervalSpinBox, &QDoubleSpinBox::setEnabled );
201 mScaleRangeWidget->setMapCanvas( mMapCanvas );
206 tableViewMetadataUrl->setSelectionMode( QAbstractItemView::SingleSelection );
207 tableViewMetadataUrl->setSelectionBehavior( QAbstractItemView::SelectRows );
208 tableViewMetadataUrl->horizontalHeader()->setStretchLastSection(
true );
209 tableViewMetadataUrl->horizontalHeader()->setSectionResizeMode( QHeaderView::Stretch );
211 mMetadataUrlModel =
new QStandardItemModel( tableViewMetadataUrl );
212 mMetadataUrlModel->clear();
213 mMetadataUrlModel->setColumnCount( 3 );
214 QStringList metadataUrlHeaders;
215 metadataUrlHeaders << tr(
"URL" ) << tr(
"Type" ) << tr(
"Format" );
216 mMetadataUrlModel->setHorizontalHeaderLabels( metadataUrlHeaders );
217 tableViewMetadataUrl->setModel( mMetadataUrlModel );
218 tableViewMetadataUrl->setItemDelegate(
new MetadataUrlItemDelegate(
this ) );
225 mRasterTransparencyWidget->pbnAddValuesFromDisplay->setIcon(
QgsApplication::getThemeIcon( QStringLiteral(
"/mActionContextHelp.png" ) ) );
228 mRasterTransparencyWidget->pbnImportTransparentPixelValues->setIcon(
QgsApplication::getThemeIcon( QStringLiteral(
"/mActionFileOpen.svg" ) ) );
229 mRasterTransparencyWidget->pbnExportTransparentPixelValues->setIcon(
QgsApplication::getThemeIcon( QStringLiteral(
"/mActionFileSave.svg" ) ) );
237 connect( mEnableMapTips, &QAbstractButton::toggled, mHtmlMapTipGroupBox, &QWidget::setEnabled );
240 updateRasterAttributeTableOptionsPage();
244 connect( mCreateRasterAttributeTableButton, &QPushButton::clicked,
this, [ = ]
249 QgsCreateRasterAttributeTableDialog dlg { mRasterLayer };
250 dlg.setOpenWhenDoneVisible(
false );
251 if ( dlg.exec() == QDialog::Accepted )
253 updateRasterAttributeTableOptionsPage();
258 connect( mLoadRasterAttributeTableFromFileButton, &QPushButton::clicked,
this, [ = ]
263 if ( dlg.exec() == QDialog::Accepted )
265 updateRasterAttributeTableOptionsPage();
269 mBackupCrs = mRasterLayer->crs();
272 if ( mMapCanvas && mRasterTransparencyWidget->pixelSelectorTool() )
284 connect( mRasterTransparencyWidget->pbnAddValuesFromDisplay, &QPushButton::clicked,
this, [ = ]
290 mMapCanvas->window()->raise();
291 mMapCanvas->window()->activateWindow();
292 mMapCanvas->window()->setFocus();
309 mMapTipExpressionWidget->registerExpressionContextGenerator(
this );
311 connect( mInsertExpressionButton, &QAbstractButton::clicked,
this, [ = ]
313 QString expression = QStringLiteral(
"[% " );
314 expression += mMapTipExpressionWidget->expression();
315 expression += QLatin1String(
" %]" );
316 mMapTipWidget->insertText( expression );
325 cboResamplingMethod->clear();
328 for (
const QPair<QString, QString> &method : std::as_const( constProviderType ) )
330 cboResamplingMethod->addItem( method.second, method.first );
334 QString prefix = provider->name() +
"/driverOptions/_pyramids/";
336 QString defaultMethod = mySettings.
value( prefix +
"resampling",
"AVERAGE" ).toString();
337 int idx = cboResamplingMethod->findData( defaultMethod );
339 cboResamplingMethod->setCurrentIndex( idx );
343 const QList< QgsRasterPyramid > myPyramidList = provider->buildPyramidList();
347 if ( pyramid.getExists() )
349 lbxPyramidResolutions->addItem(
new QListWidgetItem( myPyramidPixmap,
350 QString::number( pyramid.getXDim() ) + QStringLiteral(
" x " ) +
351 QString::number( pyramid.getYDim() ) ) );
355 lbxPyramidResolutions->addItem(
new QListWidgetItem( myNoPyramidPixmap,
356 QString::number( pyramid.getXDim() ) + QStringLiteral(
" x " ) +
357 QString::number( pyramid.getYDim() ) ) );
364 mOptsPage_Pyramids->setEnabled(
false );
373 mOptsPage_Histogram->setEnabled(
false );
376 QVBoxLayout *layout =
new QVBoxLayout( metadataFrame );
377 layout->setContentsMargins( 0, 0, 0, 0 );
379 mMetadataWidget->layout()->setContentsMargins( 0, 0, 0, 0 );
380 mMetadataWidget->setMapCanvas( mMapCanvas );
381 layout->addWidget( mMetadataWidget );
382 metadataFrame->setLayout( layout );
384 QVBoxLayout *temporalLayout =
new QVBoxLayout( temporalFrame );
385 temporalLayout->setContentsMargins( 0, 0, 0, 0 );
387 temporalLayout->addWidget( mTemporalWidget );
390 QgsDebugMsgLevel(
"Setting crs to " + mRasterLayer->crs().userFriendlyIdentifier(), 2 );
391 mCrsSelector->setCrs( mRasterLayer->crs() );
394 QString pyramidFormat( QStringLiteral(
"<h2>%1</h2><p>%2 %3 %4</p><b><font color='red'><p>%5</p><p>%6</p>" ) );
395 QString pyramidHeader = tr(
"Description" );
396 QString pyramidSentence1 = tr(
"Large resolution raster layers can slow navigation in QGIS." );
397 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." );
398 QString pyramidSentence3 = tr(
"You must have write access in the directory where the original data is stored to build pyramids." );
399 QString pyramidSentence4 = tr(
"Please note that building internal pyramids may alter the original data file and once created they cannot be removed!" );
400 QString pyramidSentence5 = tr(
"Please note that building internal pyramids could corrupt your image - always make a backup of your data first!" );
402 tePyramidDescription->setHtml( pyramidFormat.arg( pyramidHeader,
407 pyramidSentence5 ) );
410 mResamplingGroupBox->setSaveCheckedState(
true );
411 mResamplingUtils.initWidgets( mRasterLayer, mZoomedInResamplingComboBox, mZoomedOutResamplingComboBox, mMaximumOversamplingSpinBox, mCbEarlyResampling );
412 mResamplingUtils.refreshWidgetsFromLayer();
416 btnColorizeColor->setColorDialogTitle( tr(
"Select Color" ) );
417 btnColorizeColor->setContext( QStringLiteral(
"symbology" ) );
422 if ( hueSaturationFilter )
424 sliderSaturation->setValue( hueSaturationFilter->
saturation() );
425 comboGrayscale->setCurrentIndex( (
int ) hueSaturationFilter->
grayscaleMode() );
428 toggleSaturationControls(
static_cast<int>( hueSaturationFilter->
grayscaleMode() ) );
431 mColorizeCheck->setChecked( hueSaturationFilter->
colorizeOn() );
432 btnColorizeColor->setColor( hueSaturationFilter->
colorizeColor() );
433 toggleColorizeControls( hueSaturationFilter->
colorizeOn() );
434 sliderColorizeStrength->setValue( hueSaturationFilter->
colorizeStrength() );
435 mInvertColorsCheck->setChecked( hueSaturationFilter->
invertColors() );
440 mBlendModeComboBox->setBlendMode( mRasterLayer->blendMode() );
445 mRasterTransparencyWidget->cboxTransparencyBand->setShowNotSetOption(
true, tr(
"None" ) );
446 mRasterTransparencyWidget->cboxTransparencyBand->setLayer( mRasterLayer );
455 cboxTransparencyBand->setCurrentIndex( cboxTransparencyBand->findData( renderer->
alphaBand() ) );
462 mHistogramWidget =
nullptr;
463 if ( mOptsPage_Histogram->isEnabled() )
466 mHistogramStackedWidget->addWidget( mHistogramWidget );
479 mDisableRenderTypeComboBoxCurrentIndexChanged =
true;
481 for (
const QString &name : constRenderersList )
485 if ( ( mRasterLayer->rasterType() != Qgis::RasterLayerType::SingleBandColorData && entry.
name != QLatin1String(
"singlebandcolordata" ) ) ||
486 ( mRasterLayer->rasterType() == Qgis::RasterLayerType::SingleBandColorData && entry.
name == QLatin1String(
"singlebandcolordata" ) ) )
492 mDisableRenderTypeComboBoxCurrentIndexChanged =
false;
497 QString rendererType = renderer->
type();
498 widgetIndex = mRenderTypeComboBox->findData( rendererType );
499 if ( widgetIndex != -1 )
501 mDisableRenderTypeComboBoxCurrentIndexChanged =
true;
502 mRenderTypeComboBox->setCurrentIndex( widgetIndex );
503 mDisableRenderTypeComboBoxCurrentIndexChanged =
false;
506 if ( rendererType == QLatin1String(
"singlebandcolordata" ) && mRenderTypeComboBox->count() == 1 )
509 QSizePolicy sizep = mBandRenderingGrpBx->sizePolicy();
510 sizep.setVerticalStretch( 0 );
511 sizep.setVerticalPolicy( QSizePolicy::Maximum );
512 mBandRenderingGrpBx->setSizePolicy( sizep );
513 mBandRenderingGrpBx->updateGeometry();
516 if ( mRasterLayer->providerType() != QLatin1String(
"wms" ) )
518 mWMSPrintGroupBox->hide();
519 mPublishDataSourceUrlCheckBox->hide();
520 mBackgroundLayerCheckBox->hide();
527 const int horizontalDpi = logicalDpiX();
530 if ( horizontalDpi > 96 )
532 mMetadataViewer->setZoomFactor( mMetadataViewer->zoomFactor() * 0.9 );
534 mMetadataViewer->page()->setLinkDelegationPolicy( QWebPage::LinkDelegationPolicy::DelegateAllLinks );
535 connect( mMetadataViewer->page(), &QWebPage::linkClicked,
this, &QgsRasterLayerProperties::urlClicked );
536 mMetadataViewer->page()->settings()->setAttribute( QWebSettings::DeveloperExtrasEnabled,
true );
537 mMetadataViewer->page()->settings()->setAttribute( QWebSettings::JavascriptEnabled,
true );
543 mRenderTypeComboBox_currentIndexChanged( widgetIndex );
551 if ( !settings.
contains( QStringLiteral(
"/Windows/RasterLayerProperties/tab" ) ) )
553 settings.
setValue( QStringLiteral(
"Windows/RasterLayerProperties/tab" ),
554 mOptStackedWidget->indexOf( mOptsPage_Style ) );
559 QString title = tr(
"Layer Properties — %1" ).arg( lyr->name() );
561 if ( !mRasterLayer->styleManager()->isDefault( mRasterLayer->styleManager()->currentStyle() ) )
562 title += QStringLiteral(
" (%1)" ).arg( mRasterLayer->styleManager()->currentStyle() );
563 restoreOptionsBaseUi( title );
564 optionsStackedWidget_CurrentChanged( mOptionsStackedWidget->currentIndex() );
567 mOptsPage_Information->setProperty(
"helpPage", QStringLiteral(
"working_with_raster/raster_properties.html#information-properties" ) );
568 mOptsPage_Source->setProperty(
"helpPage", QStringLiteral(
"working_with_raster/raster_properties.html#source-properties" ) );
569 mOptsPage_Style->setProperty(
"helpPage", QStringLiteral(
"working_with_raster/raster_properties.html#symbology-properties" ) );
570 mOptsPage_Transparency->setProperty(
"helpPage", QStringLiteral(
"working_with_raster/raster_properties.html#transparency-properties" ) );
572 if ( mOptsPage_Histogram )
573 mOptsPage_Histogram->setProperty(
"helpPage", QStringLiteral(
"working_with_raster/raster_properties.html#histogram-properties" ) );
575 mOptsPage_Rendering->setProperty(
"helpPage", QStringLiteral(
"working_with_raster/raster_properties.html#rendering-properties" ) );
576 mOptsPage_Temporal->setProperty(
"helpPage", QStringLiteral(
"working_with_raster/raster_properties.html#temporal-properties" ) );
578 if ( mOptsPage_Pyramids )
579 mOptsPage_Pyramids->setProperty(
"helpPage", QStringLiteral(
"working_with_raster/raster_properties.html#pyramids-properties" ) );
581 if ( mOptsPage_Display )
582 mOptsPage_Display->setProperty(
"helpPage", QStringLiteral(
"working_with_raster/raster_properties.html#display-properties" ) );
584 mOptsPage_Metadata->setProperty(
"helpPage", QStringLiteral(
"working_with_raster/raster_properties.html#metadata-properties" ) );
585 mOptsPage_Legend->setProperty(
"helpPage", QStringLiteral(
"working_with_raster/raster_properties.html#legend-properties" ) );
586 mOptsPage_Server->setProperty(
"helpPage", QStringLiteral(
"working_with_raster/raster_properties.html#server-properties" ) );
601 mLayerPropertiesPages << page;
604 if ( beforePage.isEmpty() )
622void QgsRasterLayerProperties::updateRasterAttributeTableOptionsPage( )
624 if ( mRasterAttributeTableWidget )
626 mOptsPage_RasterAttributeTable->layout()->removeWidget( mRasterAttributeTableWidget );
627 mRasterAttributeTableWidget =
nullptr;
634 mOptsPage_RasterAttributeTable->layout()->addWidget( mRasterAttributeTableWidget );
637 mNoRasterAttributeTableWidget->hide();
641 mNoRasterAttributeTableWidget->show();
646void QgsRasterLayerProperties::setRendererWidget(
const QString &rendererName )
659 opacity = oldRenderer->
opacity();
668 QgsDebugMsgLevel( QStringLiteral(
"renderer has widgetCreateFunction" ), 3 );
671 if ( oldWidget && ( !oldRenderer || rendererName != oldRenderer->
type() ) )
673 if ( rendererName == QLatin1String(
"singlebandgray" ) )
676 whileBlocking( mRasterLayer )->setDefaultContrastEnhancement();
678 else if ( rendererName == QLatin1String(
"multibandcolor" ) )
681 whileBlocking( mRasterLayer )->setDefaultContrastEnhancement();
689 mRendererStackedWidget->addWidget( mRendererWidget );
693 std::unique_ptr<QgsRasterRenderer> oldRenderer;
694 oldRenderer.reset( oldWidget->
renderer() );
695 std::unique_ptr<QgsRasterRenderer> newRenderer;
696 newRenderer.reset( mRendererWidget->
renderer() );
697 const QList<int> oldBands = oldRenderer->
usesBands();
698 const QList<int> newBands = newRenderer->usesBands();
699 if ( oldBands != newBands )
707 const int widgetIndex = mRenderTypeComboBox->findData( rendererName );
708 if ( widgetIndex != -1 )
710 mDisableRenderTypeComboBoxCurrentIndexChanged =
true;
711 mRenderTypeComboBox->setCurrentIndex( widgetIndex );
712 mDisableRenderTypeComboBoxCurrentIndexChanged =
false;
715 if ( mRendererWidget != oldWidget )
718 if ( mHistogramWidget )
724void QgsRasterLayerProperties::sync()
728 if ( !mSourceWidget )
733 QHBoxLayout *layout =
new QHBoxLayout();
734 layout->addWidget( mSourceWidget );
735 mSourceGroupBox->setLayout( layout );
736 mSourceGroupBox->show();
740 buttonBox->button( QDialogButtonBox::Apply )->setEnabled( isValid );
741 buttonBox->button( QDialogButtonBox::Ok )->setEnabled( isValid );
759 mRasterTransparencyWidget->gboxNoDataValue->setEnabled(
false );
760 mRasterTransparencyWidget->gboxCustomTransparency->setEnabled(
false );
761 mOptionsStackedWidget->setCurrentWidget( mOptsPage_Server );
767 if ( mOptsPage_Pyramids )
769 delete mOptsPage_Pyramids;
770 mOptsPage_Pyramids =
nullptr;
776 if ( mOptsPage_Histogram )
778 delete mOptsPage_Histogram;
779 mOptsPage_Histogram =
nullptr;
780 delete mHistogramWidget;
781 mHistogramWidget =
nullptr;
793 if ( brightnessFilter )
795 mSliderBrightness->setValue( brightnessFilter->
brightness() );
796 mSliderContrast->setValue( brightnessFilter->
contrast() );
797 mGammaSpinBox->setValue( brightnessFilter->
gamma() );
803 if ( hueSaturationFilter )
805 sliderSaturation->setValue( hueSaturationFilter->
saturation() );
806 comboGrayscale->setCurrentIndex( (
int ) hueSaturationFilter->
grayscaleMode() );
809 toggleSaturationControls(
static_cast<int>( hueSaturationFilter->
grayscaleMode() ) );
812 mColorizeCheck->setChecked( hueSaturationFilter->
colorizeOn() );
813 btnColorizeColor->setColor( hueSaturationFilter->
colorizeColor() );
814 toggleColorizeControls( hueSaturationFilter->
colorizeOn() );
815 sliderColorizeStrength->setValue( hueSaturationFilter->
colorizeStrength() );
816 mInvertColorsCheck->setChecked( hueSaturationFilter->
invertColors() );
829 mLayerOrigNameLineEd->setText( mRasterLayer->
name() );
836 updateInformationContent();
839 mLayerShortNameLineEdit->setText( mRasterLayer->
shortName() );
842 mLayerShortNameLineEdit->setValidator( shortNameValidator );
845 mLayerTitleLineEdit->setText( mRasterLayer->
title() );
846 mLayerAbstractTextEdit->setPlainText( mRasterLayer->
abstract() );
847 mLayerKeywordListLineEdit->setText( mRasterLayer->
keywordList() );
848 mLayerDataUrlLineEdit->setText( mRasterLayer->
dataUrl() );
849 mLayerDataUrlFormatComboBox->setCurrentIndex(
850 mLayerDataUrlFormatComboBox->findText(
856 mLayerAttributionLineEdit->setText( mRasterLayer->
attribution() );
857 mLayerAttributionUrlLineEdit->setText( mRasterLayer->
attributionUrl() );
863 const int row = mMetadataUrlModel->rowCount();
864 mMetadataUrlModel->setItem( row, 0,
new QStandardItem( metaUrl.url ) );
865 mMetadataUrlModel->setItem( row, 1,
new QStandardItem( metaUrl.type ) );
866 mMetadataUrlModel->setItem( row, 2,
new QStandardItem( metaUrl.format ) );
870 mLayerLegendUrlLineEdit->setText( mRasterLayer->
legendUrl() );
871 mLayerLegendUrlFormatComboBox->setCurrentIndex( mLayerLegendUrlFormatComboBox->findText( mRasterLayer->
legendUrlFormat() ) );
877 QVariant wmsPrintLayer = mRasterLayer->
customProperty( QStringLiteral(
"WMSPrintLayer" ) );
878 if ( wmsPrintLayer.isValid() )
880 mWMSPrintLayerLineEdit->setText( wmsPrintLayer.toString() );
883 QVariant wmsPublishDataSourceUrl = mRasterLayer->
customProperty( QStringLiteral(
"WMSPublishDataSourceUrl" ),
false );
884 mPublishDataSourceUrlCheckBox->setChecked( wmsPublishDataSourceUrl.toBool() );
886 QVariant wmsBackgroundLayer = mRasterLayer->
customProperty( QStringLiteral(
"WMSBackgroundLayer" ),
false );
887 mBackgroundLayerCheckBox->setChecked( wmsBackgroundLayer.toBool() );
889 mLegendPlaceholderWidget->setLastPathSettingsKey( QStringLiteral(
"lastLegendPlaceholderDir" ) );
891 mLegendConfigEmbeddedWidget->setLayer( mRasterLayer );
896 updateDataDefinedButtons();
900 page->syncToLayer( mRasterLayer );
905void QgsRasterLayerProperties::apply()
909 const QString newSource = mSourceWidget->
sourceUri();
910 if ( newSource != mRasterLayer->
source() )
917 if ( !mRasterLayer->
isValid() )
931 mLegendConfigEmbeddedWidget->applyToLayer();
952 if (
"" != mRasterTransparencyWidget->leNoDataValue->text() )
954 bool myDoubleOk =
false;
959 myNoDataRangeList << myNoDataRange;
962 for (
int bandNo = 1; bandNo <= mRasterLayer->
dataProvider()->bandCount(); bandNo++ )
970 if ( rendererWidget )
977 mBackupCrs = mRasterLayer->
crs();
979 mMetadataFilled =
false;
983 if ( rasterRenderer )
985 rasterRenderer->
setAlphaBand( mRasterTransparencyWidget->cboxTransparencyBand->currentBand() );
986 rasterRenderer->
setNodataColor( mRasterTransparencyWidget->mNodataColorButton->color() );
990 if ( mRasterTransparencyWidget->tableTransparency->columnCount() == 4 )
993 QList<QgsRasterTransparency::TransparentThreeValuePixel> myTransparentThreeValuePixelList;
994 for (
int myListRunner = 0; myListRunner < mRasterTransparencyWidget->tableTransparency->rowCount(); myListRunner++ )
996 myTransparentPixel.
red = transparencyCellValue( myListRunner, 0 );
997 myTransparentPixel.
green = transparencyCellValue( myListRunner, 1 );
998 myTransparentPixel.
blue = transparencyCellValue( myListRunner, 2 );
1000 myTransparentThreeValuePixelList.append( myTransparentPixel );
1004 else if ( mRasterTransparencyWidget->tableTransparency->columnCount() == 3 )
1007 QList<QgsRasterTransparency::TransparentSingleValuePixel> myTransparentSingleValuePixelList;
1008 for (
int myListRunner = 0; myListRunner < mRasterTransparencyWidget->tableTransparency->rowCount(); myListRunner++ )
1010 myTransparentPixel.
min = transparencyCellValue( myListRunner, 0 );
1011 myTransparentPixel.
max = transparencyCellValue( myListRunner, 1 );
1014 myTransparentSingleValuePixelList.append( myTransparentPixel );
1025 rasterRenderer->
setOpacity( mRasterTransparencyWidget->mOpacityWidget->opacity() );
1032 mRasterLayer->
setName( mLayerOrigNameLineEd->text() );
1047 mResamplingUtils.refreshLayerFromWidgets();
1051 if ( hueSaturationFilter )
1053 hueSaturationFilter->
setSaturation( sliderSaturation->value() );
1055 hueSaturationFilter->
setColorizeOn( mColorizeCheck->checkState() );
1058 hueSaturationFilter->
setInvertColors( mInvertColorsCheck->isChecked() );
1062 mRasterLayer->
setBlendMode( mBlendModeComboBox->blendMode() );
1067 mRasterLayer->
setCrs( mCrsSelector->crs() );
1069 if ( mRasterLayer->
shortName() != mLayerShortNameLineEdit->text() )
1070 mMetadataFilled =
false;
1071 mRasterLayer->
setShortName( mLayerShortNameLineEdit->text() );
1073 if ( mRasterLayer->
title() != mLayerTitleLineEdit->text() )
1074 mMetadataFilled =
false;
1075 mRasterLayer->
setTitle( mLayerTitleLineEdit->text() );
1077 if ( mRasterLayer->
abstract() != mLayerAbstractTextEdit->toPlainText() )
1078 mMetadataFilled =
false;
1079 mRasterLayer->
setAbstract( mLayerAbstractTextEdit->toPlainText() );
1081 if ( mRasterLayer->
keywordList() != mLayerKeywordListLineEdit->text() )
1082 mMetadataFilled =
false;
1083 mRasterLayer->
setKeywordList( mLayerKeywordListLineEdit->text() );
1085 if ( mRasterLayer->
dataUrl() != mLayerDataUrlLineEdit->text() )
1086 mMetadataFilled =
false;
1087 mRasterLayer->
setDataUrl( mLayerDataUrlLineEdit->text() );
1089 if ( mRasterLayer->
dataUrlFormat() != mLayerDataUrlFormatComboBox->currentText() )
1090 mMetadataFilled =
false;
1091 mRasterLayer->
setDataUrlFormat( mLayerDataUrlFormatComboBox->currentText() );
1094 if ( mRasterLayer->
attribution() != mLayerAttributionLineEdit->text() )
1095 mMetadataFilled =
false;
1096 mRasterLayer->
setAttribution( mLayerAttributionLineEdit->text() );
1098 if ( mRasterLayer->
attributionUrl() != mLayerAttributionUrlLineEdit->text() )
1099 mMetadataFilled =
false;
1103 QList<QgsMapLayerServerProperties::MetadataUrl> metaUrls;
1104 for (
int row = 0; row < mMetadataUrlModel->rowCount() ; row++ )
1107 metaUrl.
url = mMetadataUrlModel->item( row, 0 )->text();
1108 metaUrl.
type = mMetadataUrlModel->item( row, 1 )->text();
1109 metaUrl.
format = mMetadataUrlModel->item( row, 2 )->text();
1110 metaUrls.append( metaUrl );
1111 mMetadataFilled =
false;
1115 if ( mRasterLayer->
legendUrl() != mLayerLegendUrlLineEdit->text() )
1116 mMetadataFilled =
false;
1117 mRasterLayer->
setLegendUrl( mLayerLegendUrlLineEdit->text() );
1119 if ( mRasterLayer->
legendUrlFormat() != mLayerLegendUrlFormatComboBox->currentText() )
1120 mMetadataFilled =
false;
1123 if ( !mWMSPrintLayerLineEdit->text().isEmpty() )
1125 mRasterLayer->
setCustomProperty( QStringLiteral(
"WMSPrintLayer" ), mWMSPrintLayerLineEdit->text() );
1128 mRasterLayer->
setCustomProperty(
"WMSPublishDataSourceUrl", mPublishDataSourceUrlCheckBox->isChecked() );
1129 mRasterLayer->
setCustomProperty(
"WMSBackgroundLayer", mBackgroundLayerCheckBox->isChecked() );
1146void QgsRasterLayerProperties::buttonBuildPyramids_clicked()
1158 for (
int myCounterInt = 0; myCounterInt < lbxPyramidResolutions->count(); myCounterInt++ )
1160 QListWidgetItem *myItem = lbxPyramidResolutions->item( myCounterInt );
1162 myPyramidList[myCounterInt].setBuild( myItem->isSelected() || myPyramidList[myCounterInt].getExists() );
1166 QString prefix = provider->
name() +
"/driverOptions/_pyramids/";
1168 QString resamplingMethod( cboResamplingMethod->currentData().toString() );
1169 mySettings.
setValue( prefix +
"resampling", resamplingMethod );
1176 QApplication::setOverrideCursor( Qt::WaitCursor );
1183 QApplication::restoreOverrideCursor();
1184 mPyramidProgress->setValue( 0 );
1185 buttonBuildPyramids->setEnabled(
false );
1186 if ( !res.isNull() )
1188 if ( res == QLatin1String(
"CANCELED" ) )
1192 else if ( res == QLatin1String(
"ERROR_WRITE_ACCESS" ) )
1194 QMessageBox::warning(
this, tr(
"Building Pyramids" ),
1195 tr(
"Write access denied. Adjust the file permissions and try again." ) );
1197 else if ( res == QLatin1String(
"ERROR_WRITE_FORMAT" ) )
1199 QMessageBox::warning(
this, tr(
"Building Pyramids" ),
1200 tr(
"The file was not writable. Some formats do not "
1201 "support pyramid overviews. Consult the GDAL documentation if in doubt." ) );
1203 else if ( res == QLatin1String(
"FAILED_NOT_SUPPORTED" ) )
1205 QMessageBox::warning(
this, tr(
"Building Pyramids" ),
1206 tr(
"Building pyramid overviews is not supported on this type of raster." ) );
1208 else if ( res == QLatin1String(
"ERROR_JPEG_COMPRESSION" ) )
1210 QMessageBox::warning(
this, tr(
"Building Pyramids" ),
1211 tr(
"Building internal pyramid overviews is not supported on raster layers with JPEG compression and your current libtiff library." ) );
1213 else if ( res == QLatin1String(
"ERROR_VIRTUAL" ) )
1215 QMessageBox::warning(
this, tr(
"Building Pyramids" ),
1216 tr(
"Building pyramid overviews is not supported on this type of raster." ) );
1224 lbxPyramidResolutions->clear();
1232 if ( pyramid.getExists() )
1234 lbxPyramidResolutions->addItem(
new QListWidgetItem( myPyramidPixmap,
1235 QString::number( pyramid.getXDim() ) + QStringLiteral(
" x " ) +
1236 QString::number( pyramid.getYDim() ) ) );
1240 lbxPyramidResolutions->addItem(
new QListWidgetItem( myNoPyramidPixmap,
1241 QString::number( pyramid.getXDim() ) + QStringLiteral(
" x " ) +
1242 QString::number( pyramid.getYDim() ) ) );
1251 updateInformationContent();
1254void QgsRasterLayerProperties::urlClicked(
const QUrl &url )
1256 QFileInfo file( url.toLocalFile() );
1257 if ( file.exists() && !file.isDir() )
1260 QDesktopServices::openUrl( url );
1263void QgsRasterLayerProperties::mRenderTypeComboBox_currentIndexChanged(
int index )
1265 if ( index < 0 || mDisableRenderTypeComboBoxCurrentIndexChanged || ! mRasterLayer->renderer() )
1270 QString rendererName = mRenderTypeComboBox->itemData( index ).toString();
1271 setRendererWidget( rendererName );
1281void QgsRasterLayerProperties::setTransparencyCell(
int row,
int column,
double value )
1283 QgsDebugMsgLevel( QStringLiteral(
"value = %1" ).arg( value, 0,
'g', 17 ), 3 );
1285 if ( !provider )
return;
1288 if ( !renderer )
return;
1289 int nBands = renderer->
usesBands().size();
1291 QLineEdit *lineEdit =
new QLineEdit();
1292 lineEdit->setFrame(
false );
1294 lineEdit->setContentsMargins( 1, 1, 1, 1 );
1296 if ( column == mRasterTransparencyWidget->tableTransparency->columnCount() - 1 )
1300 lineEdit->setValidator(
new QIntValidator(
nullptr ) );
1301 lineEdit->setText( QString::number(
static_cast<int>( value ) ) );
1306 QString valueString;
1312 if ( !std::isnan( value ) )
1315 valueString = QLocale().toString( v,
'g' ) ;
1319 lineEdit->setValidator(
new QIntValidator(
nullptr ) );
1320 if ( !std::isnan( value ) )
1322 valueString = QLocale().toString(
static_cast<int>( value ) );
1326 lineEdit->setText( valueString );
1328 mRasterTransparencyWidget->tableTransparency->setCellWidget( row, column, lineEdit );
1329 adjustTransparencyCellWidth( row, column );
1331 if ( nBands == 1 && ( column == 0 || column == 1 ) )
1333 connect( lineEdit, &QLineEdit::textEdited,
this, &QgsRasterLayerProperties::transparencyCellTextEdited );
1335 mRasterTransparencyWidget->tableTransparency->resizeColumnsToContents();
1338void QgsRasterLayerProperties::setTransparencyCellValue(
int row,
int column,
double value )
1340 QLineEdit *lineEdit =
dynamic_cast<QLineEdit *
>( mRasterTransparencyWidget->tableTransparency->cellWidget( row, column ) );
1341 if ( !lineEdit )
return;
1343 lineEdit->setText( QLocale().toString( v,
'g' ) );
1344 lineEdit->adjustSize();
1345 adjustTransparencyCellWidth( row, column );
1346 mRasterTransparencyWidget->tableTransparency->resizeColumnsToContents();
1349double QgsRasterLayerProperties::transparencyCellValue(
int row,
int column )
1351 QLineEdit *lineEdit =
dynamic_cast<QLineEdit *
>( mRasterTransparencyWidget->tableTransparency->cellWidget( row, column ) );
1352 if ( !lineEdit || lineEdit->text().isEmpty() )
1354 return std::numeric_limits<double>::quiet_NaN();
1356 return QLocale().toDouble( lineEdit->text() );
1359void QgsRasterLayerProperties::adjustTransparencyCellWidth(
int row,
int column )
1361 QLineEdit *lineEdit =
dynamic_cast<QLineEdit *
>( mRasterTransparencyWidget->tableTransparency->cellWidget( row, column ) );
1362 if ( !lineEdit )
return;
1364 int width = std::max( lineEdit->fontMetrics().boundingRect( lineEdit->text() ).width() + 10, 100 );
1365 width = std::max( width, mRasterTransparencyWidget->tableTransparency->columnWidth( column ) );
1367 lineEdit->setFixedWidth( width );
1370void QgsRasterLayerProperties::transparencyCellTextEdited(
const QString &text )
1379 int nBands = renderer->
usesBands().size();
1382 QLineEdit *lineEdit = qobject_cast<QLineEdit *>( sender() );
1383 if ( !lineEdit )
return;
1386 for (
int r = 0; r < mRasterTransparencyWidget->tableTransparency->rowCount(); r++ )
1388 for (
int c = 0;
c < mRasterTransparencyWidget->tableTransparency->columnCount();
c++ )
1390 if ( mRasterTransparencyWidget->tableTransparency->cellWidget( r,
c ) == sender() )
1397 if ( row != -1 )
break;
1399 QgsDebugMsgLevel( QStringLiteral(
"row = %1 column =%2" ).arg( row ).arg( column ), 3 );
1403 QLineEdit *toLineEdit =
dynamic_cast<QLineEdit *
>( mRasterTransparencyWidget->tableTransparency->cellWidget( row, 1 ) );
1404 if ( !toLineEdit )
return;
1405 bool toChanged = mTransparencyToEdited.value( row );
1406 QgsDebugMsgLevel( QStringLiteral(
"toChanged = %1" ).arg( toChanged ), 3 );
1409 toLineEdit->setText( lineEdit->text() );
1412 else if ( column == 1 )
1414 setTransparencyToEdited( row );
1419void QgsRasterLayerProperties::aboutToShowStyleMenu()
1423 QMenu *m = qobject_cast<QMenu *>( sender() );
1431void QgsRasterLayerProperties::syncToLayer()
1436 setRendererWidget( renderer->
type() );
1442void QgsRasterLayerProperties::setTransparencyToEdited(
int row )
1444 if ( row >= mTransparencyToEdited.size() )
1446 mTransparencyToEdited.resize( row + 1 );
1448 mTransparencyToEdited[row] =
true;
1455 bool isMetadataPanel = ( index ==
mOptStackedWidget->indexOf( mOptsPage_Metadata ) );
1456 mBtnStyle->setVisible( ! isMetadataPanel );
1457 mBtnMetadata->setVisible( isMetadataPanel );
1459 if ( !mHistogramWidget )
1471 if ( index ==
mOptStackedWidget->indexOf( mOptsPage_Information ) || !mMetadataFilled )
1474 updateInformationContent();
1480 button->blockSignals(
true );
1484 button->blockSignals(
false );
1487void QgsRasterLayerProperties::updateDataDefinedButtons()
1489 const auto propertyOverrideButtons { findChildren< QgsPropertyOverrideButton * >() };
1492 updateDataDefinedButton( button );
1508void QgsRasterLayerProperties::updateProperty()
1515void QgsRasterLayerProperties::toggleSaturationControls(
int grayscaleMode )
1518 if ( grayscaleMode == 0 )
1520 sliderSaturation->setEnabled(
true );
1521 spinBoxSaturation->setEnabled(
true );
1525 sliderSaturation->setEnabled(
false );
1526 spinBoxSaturation->setEnabled(
false );
1530void QgsRasterLayerProperties::toggleColorizeControls(
bool colorizeEnabled )
1533 btnColorizeColor->setEnabled( colorizeEnabled );
1534 sliderColorizeStrength->setEnabled( colorizeEnabled );
1535 spinColorizeStrength->setEnabled( colorizeEnabled );
1539QLinearGradient QgsRasterLayerProperties::redGradient()
1543 QLinearGradient myGradient = QLinearGradient( mGradientWidth, 0, mGradientWidth, mGradientHeight );
1544 myGradient.setColorAt( 0.0, QColor( 242, 14, 25, 190 ) );
1545 myGradient.setColorAt( 0.5, QColor( 175, 29, 37, 190 ) );
1546 myGradient.setColorAt( 1.0, QColor( 114, 17, 22, 190 ) );
1549QLinearGradient QgsRasterLayerProperties::greenGradient()
1553 QLinearGradient myGradient = QLinearGradient( mGradientWidth, 0, mGradientWidth, mGradientHeight );
1554 myGradient.setColorAt( 0.0, QColor( 48, 168, 5, 190 ) );
1555 myGradient.setColorAt( 0.8, QColor( 36, 122, 4, 190 ) );
1556 myGradient.setColorAt( 1.0, QColor( 21, 71, 2, 190 ) );
1559QLinearGradient QgsRasterLayerProperties::blueGradient()
1563 QLinearGradient myGradient = QLinearGradient( mGradientWidth, 0, mGradientWidth, mGradientHeight );
1564 myGradient.setColorAt( 0.0, QColor( 30, 0, 106, 190 ) );
1565 myGradient.setColorAt( 0.2, QColor( 30, 72, 128, 190 ) );
1566 myGradient.setColorAt( 1.0, QColor( 30, 223, 196, 190 ) );
1569QLinearGradient QgsRasterLayerProperties::grayGradient()
1573 QLinearGradient myGradient = QLinearGradient( mGradientWidth, 0, mGradientWidth, mGradientHeight );
1574 myGradient.setColorAt( 0.0, QColor( 5, 5, 5, 190 ) );
1575 myGradient.setColorAt( 0.8, QColor( 122, 122, 122, 190 ) );
1576 myGradient.setColorAt( 1.0, QColor( 220, 220, 220, 190 ) );
1579QLinearGradient QgsRasterLayerProperties::highlightGradient()
1583 QLinearGradient myGradient = QLinearGradient( mGradientWidth, 0, mGradientWidth, mGradientHeight );
1584 myGradient.setColorAt( 1.0, QColor( 255, 255, 255, 50 ) );
1585 myGradient.setColorAt( 0.5, QColor( 255, 255, 255, 100 ) );
1586 myGradient.setColorAt( 0.0, QColor( 255, 255, 255, 150 ) );
1590void QgsRasterLayerProperties::addMetadataUrl()
1592 const int row = mMetadataUrlModel->rowCount();
1593 mMetadataUrlModel->setItem( row, 0,
new QStandardItem( QLatin1String() ) );
1594 mMetadataUrlModel->setItem( row, 1,
new QStandardItem( QLatin1String() ) );
1595 mMetadataUrlModel->setItem( row, 2,
new QStandardItem( QLatin1String() ) );
1598void QgsRasterLayerProperties::removeSelectedMetadataUrl()
1600 const QModelIndexList selectedRows = tableViewMetadataUrl->selectionModel()->selectedRows();
1601 if ( selectedRows.empty() )
1603 mMetadataUrlModel->removeRow( selectedRows[0].row() );
1614 bool defaultLoadedFlag =
false;
1617 if ( defaultLoadedFlag )
1624 QMessageBox::information(
this,
1625 tr(
"Default Style" ),
1637 bool defaultSavedFlag =
false;
1645 if ( !defaultSavedFlag )
1648 QMessageBox::information(
this,
1649 tr(
"Default Style" ),
1659 QString lastUsedDir = settings.
value( QStringLiteral(
"style/lastStyleDir" ), QDir::homePath() ).toString();
1661 QString fileName = QFileDialog::getOpenFileName(
1663 tr(
"Load layer properties from style file" ),
1665 tr(
"QGIS Layer Style File" ) +
" (*.qml)" );
1666 if ( fileName.isEmpty() )
1670 if ( !fileName.endsWith( QLatin1String(
".qml" ), Qt::CaseInsensitive ) )
1671 fileName += QLatin1String(
".qml" );
1675 bool defaultLoadedFlag =
false;
1676 QString message = mRasterLayer->
loadNamedStyle( fileName, defaultLoadedFlag );
1677 if ( defaultLoadedFlag )
1679 settings.
setValue( QStringLiteral(
"style/lastStyleDir" ), QFileInfo( fileName ).absolutePath() );
1684 QMessageBox::information(
this, tr(
"Save Style" ), message );
1692 QString lastUsedDir = settings.
value( QStringLiteral(
"style/lastStyleDir" ), QDir::homePath() ).toString();
1694 QString selectedFilter;
1695 QString outputFileName = QFileDialog::getSaveFileName(
1697 tr(
"Save layer properties as style file" ),
1699 tr(
"QGIS Layer Style File" ) +
" (*.qml)" +
";;" + tr(
"Styled Layer Descriptor" ) +
" (*.sld)",
1701 if ( outputFileName.isEmpty() )
1706 if ( selectedFilter.contains( QStringLiteral(
".qml" ), Qt::CaseInsensitive ) )
1709 type = StyleType::QML;
1714 type = StyleType::SLD;
1720 bool defaultLoadedFlag =
false;
1726 message = mRasterLayer->
saveNamedStyle( outputFileName, defaultLoadedFlag );
1731 message = mRasterLayer->
saveSldStyle( outputFileName, defaultLoadedFlag );
1735 if ( defaultLoadedFlag )
1737 settings.
setValue( QStringLiteral(
"style/lastStyleDir" ), QFileInfo( outputFileName ).absolutePath() );
1741 QMessageBox::information(
this, tr(
"Save Style" ), message );
1744void QgsRasterLayerProperties::restoreWindowModality()
1759void QgsRasterLayerProperties::loadMetadata()
1762 QString myLastUsedDir = myQSettings.
value( QStringLiteral(
"style/lastStyleDir" ), QDir::homePath() ).toString();
1764 QString myFileName = QFileDialog::getOpenFileName(
this, tr(
"Load layer metadata from metadata file" ), myLastUsedDir,
1765 tr(
"QGIS Layer Metadata File" ) +
" (*.qmd)" );
1766 if ( myFileName.isNull() )
1772 bool defaultLoadedFlag =
false;
1776 if ( defaultLoadedFlag )
1783 QMessageBox::warning(
this, tr(
"Load Metadata" ), myMessage );
1786 QFileInfo myFI( myFileName );
1787 QString myPath = myFI.path();
1788 myQSettings.
setValue( QStringLiteral(
"style/lastStyleDir" ), myPath );
1793void QgsRasterLayerProperties::saveMetadataAs()
1796 QString myLastUsedDir = myQSettings.
value( QStringLiteral(
"style/lastStyleDir" ), QDir::homePath() ).toString();
1798 QString myOutputFileName = QFileDialog::getSaveFileName(
this, tr(
"Save Layer Metadata as QMD" ),
1799 myLastUsedDir, tr(
"QMD File" ) +
" (*.qmd)" );
1800 if ( myOutputFileName.isNull() )
1813 bool defaultLoadedFlag =
false;
1814 QString message = mRasterLayer->
saveNamedMetadata( myOutputFileName, defaultLoadedFlag );
1815 if ( defaultLoadedFlag )
1816 myQSettings.
setValue( QStringLiteral(
"style/lastStyleDir" ), QFileInfo( myOutputFileName ).absolutePath() );
1818 QMessageBox::information(
this, tr(
"Save Metadata" ), message );
1821void QgsRasterLayerProperties::saveDefaultMetadata()
1825 bool defaultSavedFlag =
false;
1827 if ( !defaultSavedFlag )
1829 QMessageBox::warning(
this, tr(
"Default Metadata" ), errorMsg );
1833void QgsRasterLayerProperties::loadDefaultMetadata()
1835 bool defaultLoadedFlag =
false;
1838 if ( defaultLoadedFlag )
1844 QMessageBox::information(
this, tr(
"Default Metadata" ), myMessage );
1849void QgsRasterLayerProperties::toggleBuildPyramidsButton()
1851 if ( lbxPyramidResolutions->selectedItems().empty() )
1853 buttonBuildPyramids->setEnabled(
false );
1857 buttonBuildPyramids->setEnabled(
true );
1861void QgsRasterLayerProperties::mResetColorRenderingBtn_clicked()
1863 mBlendModeComboBox->setBlendMode( QPainter::CompositionMode_SourceOver );
1864 mSliderBrightness->setValue( 0 );
1865 mSliderContrast->setValue( 0 );
1866 mGammaSpinBox->setValue( 1.0 );
1867 sliderSaturation->setValue( 0 );
1869 mColorizeCheck->setChecked(
false );
1870 sliderColorizeStrength->setValue( 100 );
1871 mInvertColorsCheck->setChecked(
false );
1874bool QgsRasterLayerProperties::rasterIsMultiBandColor()
1879void QgsRasterLayerProperties::updateInformationContent()
1883 const QString html { mRasterLayer->
htmlMetadata().replace( QLatin1String(
"<head>" ), QStringLiteral( R
"raw(<head><style type="text/css">%1</style>)raw" ) ).arg( myStyle ) };
1884 mMetadataViewer->setHtml( html );
1885 mMetadataFilled = true;
1888void QgsRasterLayerProperties::onCancel()
1892 if ( mRasterAttributeTableWidget && mRasterAttributeTableWidget->
isDirty() )
1894 mRasterAttributeTableWidget->
setEditable(
false,
false );
1901 QDomDocument doc( QStringLiteral(
"qgis" ) );
1902 int errorLine, errorColumn;
1903 doc.setContent( mOldStyle.
xmlData(),
false, &myMessage, &errorLine, &errorColumn );
1907 if ( mBackupCrs != mRasterLayer->
crs() )
1908 mRasterLayer->
setCrs( mBackupCrs );
1911void QgsRasterLayerProperties::showHelp()
1913 const QVariant helpPage = mOptionsStackedWidget->currentWidget()->property(
"helpPage" );
1915 if ( helpPage.isValid() )
1921 QgsHelp::openHelp( QStringLiteral(
"working_with_raster/raster_properties.html" ) );
1925void QgsRasterLayerProperties::updateGammaSpinBox(
int value )
1930void QgsRasterLayerProperties::updateGammaSlider(
double value )
1939 if ( obj == mMapTipPreviewContainer && ev->type() == QEvent::Resize )
1943 return QgsOptionsDialogBase::eventFilter( obj, ev );
1946void QgsRasterLayerProperties::initMapTipPreview()
1949 mMapTipSplitter->setSizes( { 400, 200 } );
1951 mMapTipPreviewContainer->installEventFilter(
this );
1955 mMapTipPreview =
new QgsWebView( mMapTipPreviewContainer );
1958 mMapTipPreview->page()->setLinkDelegationPolicy( QWebPage::DelegateAllLinks );
1959 mMapTipPreview->setContextMenuPolicy( Qt::NoContextMenu );
1960 connect( mMapTipPreview, &QWebView::loadFinished,
this, &QgsRasterLayerProperties::resizeMapTip );
1963 mMapTipPreview->page()->settings()->setAttribute( QWebSettings::DeveloperExtrasEnabled,
true );
1964 mMapTipPreview->page()->settings()->setAttribute( QWebSettings::JavascriptEnabled,
true );
1965 mMapTipPreview->page()->settings()->setAttribute( QWebSettings::LocalStorageEnabled,
true );
1968 mMapTipPreview->page()->mainFrame()->setScrollBarPolicy( Qt::Horizontal, Qt::ScrollBarAlwaysOff );
1969 mMapTipPreview->page()->mainFrame()->setScrollBarPolicy( Qt::Vertical, Qt::ScrollBarAlwaysOff );
1973 connect( mMapTipWidget, &QgsCodeEditorHTML::textChanged,
this, &QgsRasterLayerProperties::updateMapTipPreview );
1976void QgsRasterLayerProperties::updateMapTipPreview()
1978 mMapTipPreview->setMaximumSize( mMapTipPreviewContainer->width(), mMapTipPreviewContainer->height() );
1980 mMapTipPreview->setHtml( htmlContent );
1983void QgsRasterLayerProperties::resizeMapTip()
1986 mMapTipPreview->setMaximumSize( mMapTipPreviewContainer->width(), mMapTipPreviewContainer->height() );
1989 const QWebElement container = mMapTipPreview->page()->mainFrame()->findFirstElement(
1990 QStringLiteral(
"#QgsWebViewContainer" ) );
1991 const int width = container.geometry().width();
1992 const int height = container.geometry().height();
1993 mMapTipPreview->resize( width, height );
1996 mMapTipPreview->move( ( mMapTipPreviewContainer->width() - mMapTipPreview->width() ) / 2,
1997 ( mMapTipPreviewContainer->height() - mMapTipPreview->height() ) / 2 );
2000 mMapTipPreview->adjustSize();
RasterPyramidFormat
Raster pyramid formats.
@ 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...
@ Float32
Thirty two bit floating point (float)
@ 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.
@ Float64
Sixty four bit floating point (double)
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.
static QRegularExpression shortNameRegularExpression()
Returns the short name regular expression for line edit validator.
Brightness/contrast and gamma correction filter pipe for rasters.
int contrast() const
Returns current contrast level.
int brightness() const
Returns current brightness level.
double gamma() const
Returns current gamma value.
void setGamma(double gamma)
Set gamma value.
void setContrast(int contrast)
Set contrast level.
void setBrightness(int brightness)
Set brightness level.
This class represents a coordinate reference system (CRS).
@ WKT_PREFERRED
Preferred format, matching the most recent WKT ISO standard. Currently an alias to WKT2_2019,...
virtual QString name() const =0
Returns a provider name.
QgsDoubleValidator is a QLineEdit Validator that combines QDoubleValidator and QRegularExpressionVali...
static double toDouble(const QString &input, bool *ok)
Converts input string to double value.
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...
void progressChanged(double progress)
Emitted when the feedback object reports a progress change.
static QString ensureFileNameHasExtension(const QString &fileName, const QStringList &extensions)
Ensures that a fileName ends with an extension from the provided list of extensions.
static QgsProviderSourceWidgetProviderRegistry * sourceWidgetProviderRegistry()
Returns the registry of provider source widget providers.
static QgsNative * nativePlatformInterface()
Returns the global native interface, which offers abstraction to the host OS's underlying public inte...
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
The QgsLoadRasterAttributeTableDialog dialog let the user select a VAT.DBF file and associate the res...
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.
const QgsMapSettings & mapSettings() const
Gets access to properties used for map rendering.
QgsRectangle extent() const
Returns the current zoom extent of the map canvas.
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
QString currentStyle() const
Returns name of the current style.
QgsMapLayerStyle style(const QString &name) const
Returns data of a stored style - accessed by its unique name.
void currentStyleChanged(const QString ¤tName)
Emitted when the current style has been changed.
QString xmlData() const
Returns XML content of the style.
Base class for all map layer types.
void setShortName(const QString &shortName)
Sets the short name of the layer used by QGIS Server to identify the layer.
QString legendUrlFormat() const
Returns the format for a URL based layer legend.
virtual bool importNamedStyle(QDomDocument &doc, QString &errorMsg, QgsMapLayer::StyleCategories categories=QgsMapLayer::AllStyleCategories)
Import the properties of this layer from a QDomDocument.
void setAbstract(const QString &abstract)
Sets the abstract of the layer used by QGIS Server in GetCapabilities request.
virtual QString saveSldStyle(const QString &uri, bool &resultFlag) const
Saves the properties of this layer to an SLD format file.
QString source() const
Returns the source for the layer.
void setLegendUrl(const QString &legendUrl)
Sets the URL for the layer's legend.
Q_INVOKABLE QVariant customProperty(const QString &value, const QVariant &defaultValue=QVariant()) const
Read a custom property from layer.
void setBlendMode(QPainter::CompositionMode blendMode)
Set the blending mode used for rendering a layer.
void setMinimumScale(double scale)
Sets the minimum map scale (i.e.
QgsCoordinateReferenceSystem crs
QString legendPlaceholderImage() const
Returns path to the placeholder image or an empty string if a generated legend is shown.
QgsMapLayerServerProperties * serverProperties()
Returns QGIS Server Properties for the map layer.
QString attribution() const
Returns the attribution of the layer used by QGIS Server in GetCapabilities request.
virtual QString loadDefaultStyle(bool &resultFlag)
Retrieve the default style for this layer if one exists (either as a .qml file on disk or as a record...
virtual QString loadNamedMetadata(const QString &uri, bool &resultFlag)
Retrieve a named metadata for this layer if one exists (either as a .qmd file on disk or as a record ...
bool hasAutoRefreshEnabled() const
Returns true if auto refresh is enabled for the layer.
void triggerRepaint(bool deferredUpdate=false)
Will advise the map canvas (and any other interested party) that this layer requires to be repainted.
void setAttributionUrl(const QString &attribUrl)
Sets the attribution URL of the layer used by QGIS Server in GetCapabilities request.
void setAutoRefreshEnabled(bool enabled)
Sets whether auto refresh is enabled for the layer.
void setMaximumScale(double scale)
Sets the maximum map scale (i.e.
QgsLayerMetadata metadata
QString abstract() const
Returns the abstract of the layer used by QGIS Server in GetCapabilities request.
QString dataUrlFormat() const
Returns the DataUrl format of the layer used by QGIS Server in GetCapabilities request.
void setDataUrl(const QString &dataUrl)
Sets the DataUrl of the layer used by QGIS Server in GetCapabilities request.
void setKeywordList(const QString &keywords)
Sets the keyword list of the layer used by QGIS Server in GetCapabilities request.
void setAttribution(const QString &attrib)
Sets the attribution of the layer used by QGIS Server in GetCapabilities request.
QString shortName() const
Returns the short name of the layer used by QGIS Server to identify the layer.
virtual QString saveDefaultMetadata(bool &resultFlag)
Save the current metadata of this layer as the default metadata (either as a .qmd file on disk or as ...
void setDataUrlFormat(const QString &dataUrlFormat)
Sets the DataUrl format of the layer used by QGIS Server in GetCapabilities request.
Q_INVOKABLE void setCustomProperty(const QString &key, const QVariant &value)
Set a custom property for layer.
void rendererChanged()
Signal emitted when renderer is changed.
QString title() const
Returns the title of the layer used by QGIS Server in GetCapabilities request.
void setScaleBasedVisibility(bool enabled)
Sets whether scale based visibility is enabled for the layer.
QString dataUrl() const
Returns the DataUrl of the layer used by QGIS Server in GetCapabilities request.
bool hasScaleBasedVisibility() const
Returns whether scale based visibility is enabled for the layer.
virtual QString loadNamedStyle(const QString &uri, bool &resultFlag, QgsMapLayer::StyleCategories categories=QgsMapLayer::AllStyleCategories)
Retrieve a named style for this layer if one exists (either as a .qml file on disk or as a record in ...
void emitStyleChanged()
Triggers an emission of the styleChanged() signal.
static QString extensionPropertyType(PropertyType type)
Returns the extension of a Property.
void setName(const QString &name)
Set the display name of the layer.
void setAutoRefreshInterval(int interval)
Sets the auto refresh interval (in milliseconds) for the layer.
QString saveNamedMetadata(const QString &uri, bool &resultFlag)
Save the current metadata of this layer as a named metadata (either as a .qmd file on disk or as a re...
void setLegendPlaceholderImage(const QString &imgPath)
Set placeholder image for legend.
void setMapTipsEnabled(bool enabled)
Enable or disable map tips for this layer.
QString attributionUrl() const
Returns the attribution URL of the layer used by QGIS Server in GetCapabilities request.
void setDataSource(const QString &dataSource, const QString &baseName, const QString &provider, bool loadDefaultStyleFlag=false)
Updates the data source of the layer.
double minimumScale() const
Returns the minimum map scale (i.e.
QgsMapLayerStyleManager * styleManager() const
Gets access to the layer's style manager.
QString legendUrl() const
Returns the URL for the layer's legend.
void setLegendUrlFormat(const QString &legendUrlFormat)
Sets the format for a URL based layer legend.
virtual QString saveNamedStyle(const QString &uri, bool &resultFlag, StyleCategories categories=AllStyleCategories)
Save the properties of this layer as a named style (either as a .qml file on disk or as a record in t...
void setMapTipTemplate(const QString &mapTipTemplate)
The mapTip is a pretty, html representation for feature information.
void setLegend(QgsMapLayerLegend *legend)
Assign a legend controller to the map layer.
virtual QString metadataUri() const
Retrieve the metadata URI for this layer (either as a .qmd file on disk or as a record in the users s...
virtual QString saveDefaultStyle(bool &resultFlag, StyleCategories categories)
Save the properties of this layer as the default style (either as a .qml file on disk or as a record ...
double maximumScale() const
Returns the maximum map scale (i.e.
QString keywordList() const
Returns the keyword list of the layer used by QGIS Server in GetCapabilities request.
void setTitle(const QString &title)
Sets the title of the layer used by QGIS Server in GetCapabilities request.
void setCrs(const QgsCoordinateReferenceSystem &srs, bool emitSignal=true)
Sets layer's spatial reference system.
QgsRectangle outputExtentToLayerExtent(const QgsMapLayer *layer, QgsRectangle extent) const
transform bounding box from output CRS to layer's CRS
static QString rasterMapTipPreviewText(QgsMapLayer *layer, QgsMapCanvas *mapCanvas, const QString &mapTemplate)
Returns the html that would be displayed in a maptip for a given layer.
Renderer for multiband images with the color components.
A base dialog for options and properties dialogs that offers vertical tabs.
virtual void optionsStackedWidget_CurrentChanged(int index)
Select relevant tab on current page change.
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).
QgsProperty property(int key) const override
Returns a matching property from the collection, if one exists.
void setProperty(int key, const QgsProperty &property)
Adds a property to the collection and takes ownership of it.
Feedback object tailored for raster block reading.
static QString printValue(double value)
Print double value with all necessary significant digits.
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 sourceDataType(int bandNo) const override=0
Returns source data type for the band specified by number, source data type may be shorter than dataT...
virtual void setUseSourceNoDataValue(int bandNo, bool use)
Sets the source nodata value usage.
Qgis::DataType dataType(int bandNo) const override=0
Returns data type for the band specified by number.
static QList< QPair< QString, QString > > pyramidResamplingMethods(const QString &providerKey)
Returns a list of pyramid resampling method name and label pairs for given provider.
virtual void setUserNoDataValue(int bandNo, const QgsRasterRangeList &noData)
virtual QList< QgsRasterPyramid > buildPyramidList(const QList< int > &overviewList=QList< int >())
Returns the raster layers pyramid list.
@ BuildPyramids
Supports building of pyramids (overviews)
@ Size
Original data source size (and thus resolution) is known, it is not always available,...
virtual int capabilities() const
Returns a bitmask containing the supported capabilities.
StyleType
enumeration for the different types of style
void saveDefaultStyle()
Saves the default style when appropriate button is pressed.
void loadDefaultStyle()
Loads the default style when appropriate button is pressed.
void saveStyleAs()
Saves a style when appriate button is pressed.
void addPropertiesPageFactory(const QgsMapLayerConfigWidgetFactory *factory)
Adds a properties page factory to the raster layer properties dialog.
void loadStyle()
Loads a saved 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) override
auto slot executed when the active page in the main widget stack is changed
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.
QString htmlMetadata() const override
Obtain a formatted HTML string containing assorted metadata for this layer.
bool canCreateRasterAttributeTable()
Returns true if the raster renderer is suitable for creation of a raster attribute table.
int attributeTableCount() const
Returns the number of attribute tables for the raster by counting the number of bands that have an as...
QgsRasterPipe * pipe()
Returns the raster pipe.
QgsBrightnessContrastFilter * brightnessFilter() const
Returns the raster's brightness/contrast filter.
QgsRasterRenderer * renderer() const
Returns the raster's renderer.
QgsRasterDataProvider * dataProvider() override
Returns the source data provider.
QString providerType() const
[ data provider interface ] Which provider is being used for this Raster Layer?
void setRenderer(QgsRasterRenderer *renderer)
Sets the raster's renderer.
QgsHueSaturationFilter * hueSaturationFilter() const
Returns the raster's hue/saturation filter.
QgsPropertyCollection & dataDefinedProperties()
Returns a reference to the pipe's property collection, used for data defined overrides.
static QgsPropertiesDefinition propertyDefinitions()
Returns the definitions for data defined properties available for use in raster pipes.
Property
Data definable properties.
@ RendererOpacity
Raster renderer global opacity.
void setDataDefinedProperties(const QgsPropertyCollection &collection)
Sets the pipe's property collection, used for data defined overrides.
This struct is used to store pyramid info for the raster layer.
Raster values range container.
void insertWidgetFunction(const QString &rendererName, QgsRasterRendererWidgetCreateFunc func)
QStringList renderersList() const
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.
void setAlphaBand(int band)
void setOpacity(double opacity)
Sets the opacity for the renderer, where opacity is a value between 0 (totally transparent) and 1....
void setRasterTransparency(QgsRasterTransparency *t)
void setNodataColor(const QColor &color)
Sets the color to use for shading nodata pixels.
Defines the list of pixel values to be considered as transparent or semi transparent when rendering r...
void setTransparentSingleValuePixelList(const QList< QgsRasterTransparency::TransparentSingleValuePixel > &newList)
Sets the transparent single value pixel list, replacing the whole existing list.
void setTransparentThreeValuePixelList(const QList< QgsRasterTransparency::TransparentThreeValuePixel > &newList)
Sets the transparent three value pixel list, replacing the whole existing list.
A rectangle specified with double values.
This class is a composition of two QSettings instances:
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.
The QgsWebView class is a collection of stubs to mimic the API of QWebView on systems where the real ...
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
#define Q_NOWARN_DEPRECATED_POP
#define Q_NOWARN_DEPRECATED_PUSH
QgsSignalBlocker< Object > whileBlocking(Object *object)
Temporarily blocks signals from a QObject while calling a single method from the object.
#define QgsDebugMsgLevel(str, level)
QList< QgsRasterRange > QgsRasterRangeList
const QgsCoordinateReferenceSystem & crs
Setting options for creating vector data providers.
Registry for raster renderer entries.
QgsRasterRendererWidgetCreateFunc widgetCreateFunction
double percentTransparent
double percentTransparent