36 #include "qgsnative.h"
74 #include <QDesktopServices>
75 #include <QTableWidgetItem>
76 #include <QHeaderView>
77 #include <QTextStream>
79 #include <QFileDialog>
80 #include <QMessageBox>
82 #include <QLinearGradient>
83 #include <QPainterPath>
85 #include <QColorDialog>
87 #include <QMouseEvent>
92 #include <QRegularExpressionValidator>
93 #include <QRegularExpression>
98 , TRSTRING_NOT_SET( tr(
"Not Set" ) )
99 , mDefaultStandardDeviation( 0 )
100 , mDefaultRedBand( 0 )
101 , mDefaultGreenBand( 0 )
102 , mDefaultBlueBand( 0 )
104 , mGradientHeight( 0.0 )
105 , mGradientWidth( 0.0 )
106 , mMapCanvas( canvas )
107 , mMetadataFilled( false )
109 mGrayMinimumMaximumEstimated =
true;
110 mRGBMinimumMaximumEstimated =
true;
115 mOptsPage_Information->layout()->addWidget( mMetadataViewer );
119 transparencyScrollArea->setWidget( mRasterTransparencyWidget );
121 connect( buttonBuildPyramids, &QPushButton::clicked,
this, &QgsRasterLayerProperties::buttonBuildPyramids_clicked );
123 connect( mRenderTypeComboBox,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsRasterLayerProperties::mRenderTypeComboBox_currentIndexChanged );
124 connect( mResetColorRenderingBtn, &QToolButton::clicked,
this, &QgsRasterLayerProperties::mResetColorRenderingBtn_clicked );
125 connect( buttonRemoveMetadataUrl, &QPushButton::clicked,
this, &QgsRasterLayerProperties::removeSelectedMetadataUrl );
126 connect( buttonAddMetadataUrl, &QPushButton::clicked,
this, &QgsRasterLayerProperties::addMetadataUrl );
131 connect( buttonBox, &QDialogButtonBox::helpRequested,
this, &QgsRasterLayerProperties::showHelp );
133 mSourceGroupBox->hide();
135 mBtnStyle =
new QPushButton( tr(
"Style" ) );
136 QMenu *menuStyle =
new QMenu(
this );
137 menuStyle->addAction( tr(
"Load Style…" ),
this, &QgsRasterLayerProperties::loadStyle_clicked );
138 menuStyle->addAction( tr(
"Save Style…" ),
this, &QgsRasterLayerProperties::saveStyleAs_clicked );
139 menuStyle->addSeparator();
140 menuStyle->addAction( tr(
"Save as Default" ),
this, &QgsRasterLayerProperties::saveDefaultStyle_clicked );
141 menuStyle->addAction( tr(
"Restore Default" ),
this, &QgsRasterLayerProperties::loadDefaultStyle_clicked );
142 mBtnStyle->setMenu( menuStyle );
143 connect( menuStyle, &QMenu::aboutToShow,
this, &QgsRasterLayerProperties::aboutToShowStyleMenu );
144 buttonBox->addButton( mBtnStyle, QDialogButtonBox::ResetRole );
146 mBtnMetadata =
new QPushButton( tr(
"Metadata" ),
this );
147 QMenu *menuMetadata =
new QMenu(
this );
148 mActionLoadMetadata = menuMetadata->addAction( tr(
"Load Metadata…" ),
this, &QgsRasterLayerProperties::loadMetadata );
149 mActionSaveMetadataAs = menuMetadata->addAction( tr(
"Save Metadata…" ),
this, &QgsRasterLayerProperties::saveMetadataAs );
150 menuMetadata->addSeparator();
151 menuMetadata->addAction( tr(
"Save as Default" ),
this, &QgsRasterLayerProperties::saveDefaultMetadata );
152 menuMetadata->addAction( tr(
"Restore Default" ),
this, &QgsRasterLayerProperties::loadDefaultMetadata );
153 mBtnMetadata->setMenu( menuMetadata );
154 buttonBox->addButton( mBtnMetadata, QDialogButtonBox::ResetRole );
158 connect(
this, &QDialog::accepted,
this, &QgsRasterLayerProperties::apply );
159 connect(
this, &QDialog::rejected,
this, &QgsRasterLayerProperties::onCancel );
161 connect( buttonBox->button( QDialogButtonBox::Apply ), &QAbstractButton::clicked,
this, &QgsRasterLayerProperties::apply );
164 connect( mSliderBrightness, &QAbstractSlider::valueChanged, mBrightnessSpinBox, &QSpinBox::setValue );
165 connect( mBrightnessSpinBox,
static_cast < void ( QSpinBox::* )(
int )
> ( &QSpinBox::valueChanged ), mSliderBrightness, &QAbstractSlider::setValue );
166 mBrightnessSpinBox->setClearValue( 0 );
168 connect( mSliderContrast, &QAbstractSlider::valueChanged, mContrastSpinBox, &QSpinBox::setValue );
169 connect( mContrastSpinBox,
static_cast < void ( QSpinBox::* )(
int )
> ( &QSpinBox::valueChanged ), mSliderContrast, &QAbstractSlider::setValue );
170 mContrastSpinBox->setClearValue( 0 );
173 connect( mSliderGamma, &QAbstractSlider::valueChanged,
this, &QgsRasterLayerProperties::updateGammaSpinBox );
174 connect( mGammaSpinBox,
static_cast < void ( QDoubleSpinBox::* )(
double )
> ( &QDoubleSpinBox::valueChanged ),
this, &QgsRasterLayerProperties::updateGammaSlider );
175 mGammaSpinBox->setClearValue( 1.0 );
178 connect( sliderSaturation, &QAbstractSlider::valueChanged, spinBoxSaturation, &QSpinBox::setValue );
179 connect( spinBoxSaturation,
static_cast < void ( QSpinBox::* )(
int )
> ( &QSpinBox::valueChanged ), sliderSaturation, &QAbstractSlider::setValue );
180 spinBoxSaturation->setClearValue( 0 );
183 connect( sliderColorizeStrength, &QAbstractSlider::valueChanged, spinColorizeStrength, &QSpinBox::setValue );
184 connect( spinColorizeStrength,
static_cast < void ( QSpinBox::* )(
int )
> ( &QSpinBox::valueChanged ), sliderColorizeStrength, &QAbstractSlider::setValue );
185 spinColorizeStrength->setClearValue( 100 );
188 connect( comboGrayscale,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsRasterLayerProperties::toggleSaturationControls );
191 connect( mColorizeCheck, &QAbstractButton::toggled,
this, &QgsRasterLayerProperties::toggleColorizeControls );
194 connect( lbxPyramidResolutions, &QListWidget::itemSelectionChanged,
this, &QgsRasterLayerProperties::toggleBuildPyramidsButton );
196 connect( mRefreshLayerCheckBox, &QCheckBox::toggled, mRefreshLayerIntervalSpinBox, &QDoubleSpinBox::setEnabled );
199 mScaleRangeWidget->setMapCanvas( mMapCanvas );
204 tableViewMetadataUrl->setSelectionMode( QAbstractItemView::SingleSelection );
205 tableViewMetadataUrl->setSelectionBehavior( QAbstractItemView::SelectRows );
206 tableViewMetadataUrl->horizontalHeader()->setStretchLastSection(
true );
207 tableViewMetadataUrl->horizontalHeader()->setSectionResizeMode( QHeaderView::Stretch );
209 mMetadataUrlModel =
new QStandardItemModel( tableViewMetadataUrl );
210 mMetadataUrlModel->clear();
211 mMetadataUrlModel->setColumnCount( 3 );
212 QStringList metadataUrlHeaders;
213 metadataUrlHeaders << tr(
"URL" ) << tr(
"Type" ) << tr(
"Format" );
214 mMetadataUrlModel->setHorizontalHeaderLabels( metadataUrlHeaders );
215 tableViewMetadataUrl->setModel( mMetadataUrlModel );
216 tableViewMetadataUrl->setItemDelegate(
new MetadataUrlItemDelegate(
this ) );
223 mRasterTransparencyWidget->pbnAddValuesFromDisplay->setIcon(
QgsApplication::getThemeIcon( QStringLiteral(
"/mActionContextHelp.png" ) ) );
226 mRasterTransparencyWidget->pbnImportTransparentPixelValues->setIcon(
QgsApplication::getThemeIcon( QStringLiteral(
"/mActionFileOpen.svg" ) ) );
227 mRasterTransparencyWidget->pbnExportTransparentPixelValues->setIcon(
QgsApplication::getThemeIcon( QStringLiteral(
"/mActionFileSave.svg" ) ) );
235 mBackupCrs = mRasterLayer->
crs();
250 connect( mRasterTransparencyWidget->pbnAddValuesFromDisplay, &QPushButton::clicked,
this, [ = ]
256 mMapCanvas->window()->raise();
257 mMapCanvas->window()->activateWindow();
258 mMapCanvas->window()->setFocus();
275 cboResamplingMethod->clear();
278 for (
const QPair<QString, QString> &method : std::as_const( constProviderType ) )
280 cboResamplingMethod->addItem( method.second, method.first );
284 QString prefix = provider->
name() +
"/driverOptions/_pyramids/";
286 QString defaultMethod = mySettings.
value( prefix +
"resampling",
"AVERAGE" ).toString();
287 int idx = cboResamplingMethod->findData( defaultMethod );
289 cboResamplingMethod->setCurrentIndex( idx );
293 const QList< QgsRasterPyramid > myPyramidList = provider->
buildPyramidList();
297 if ( pyramid.getExists() )
299 lbxPyramidResolutions->addItem(
new QListWidgetItem( myPyramidPixmap,
300 QString::number( pyramid.getXDim() ) + QStringLiteral(
" x " ) +
301 QString::number( pyramid.getYDim() ) ) );
305 lbxPyramidResolutions->addItem(
new QListWidgetItem( myNoPyramidPixmap,
306 QString::number( pyramid.getXDim() ) + QStringLiteral(
" x " ) +
307 QString::number( pyramid.getYDim() ) ) );
314 mOptsPage_Pyramids->setEnabled(
false );
323 mOptsPage_Histogram->setEnabled(
false );
326 QVBoxLayout *layout =
new QVBoxLayout( metadataFrame );
327 layout->setContentsMargins( 0, 0, 0, 0 );
329 mMetadataWidget->layout()->setContentsMargins( 0, 0, 0, 0 );
331 layout->addWidget( mMetadataWidget );
332 metadataFrame->setLayout( layout );
334 QVBoxLayout *temporalLayout =
new QVBoxLayout( temporalFrame );
335 temporalLayout->setContentsMargins( 0, 0, 0, 0 );
337 temporalLayout->addWidget( mTemporalWidget );
341 mCrsSelector->setCrs( mRasterLayer->
crs() );
344 QString pyramidFormat( QStringLiteral(
"<h2>%1</h2><p>%2 %3 %4</p><b><font color='red'><p>%5</p><p>%6</p>" ) );
345 QString pyramidHeader = tr(
"Description" );
346 QString pyramidSentence1 = tr(
"Large resolution raster layers can slow navigation in QGIS." );
347 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." );
348 QString pyramidSentence3 = tr(
"You must have write access in the directory where the original data is stored to build pyramids." );
349 QString pyramidSentence4 = tr(
"Please note that building internal pyramids may alter the original data file and once created they cannot be removed!" );
350 QString pyramidSentence5 = tr(
"Please note that building internal pyramids could corrupt your image - always make a backup of your data first!" );
352 tePyramidDescription->setHtml( pyramidFormat.arg( pyramidHeader,
357 pyramidSentence5 ) );
360 mResamplingGroupBox->setSaveCheckedState(
true );
361 mResamplingUtils.initWidgets( mRasterLayer, mZoomedInResamplingComboBox, mZoomedOutResamplingComboBox, mMaximumOversamplingSpinBox, mCbEarlyResampling );
362 mResamplingUtils.refreshWidgetsFromLayer();
366 btnColorizeColor->setColorDialogTitle( tr(
"Select Color" ) );
367 btnColorizeColor->setContext( QStringLiteral(
"symbology" ) );
372 if ( hueSaturationFilter )
374 sliderSaturation->setValue( hueSaturationFilter->
saturation() );
375 comboGrayscale->setCurrentIndex( (
int ) hueSaturationFilter->
grayscaleMode() );
378 toggleSaturationControls(
static_cast<int>( hueSaturationFilter->
grayscaleMode() ) );
381 mColorizeCheck->setChecked( hueSaturationFilter->
colorizeOn() );
382 btnColorizeColor->setColor( hueSaturationFilter->
colorizeColor() );
383 toggleColorizeControls( hueSaturationFilter->
colorizeOn() );
384 sliderColorizeStrength->setValue( hueSaturationFilter->
colorizeStrength() );
385 mInvertColorsCheck->setChecked( hueSaturationFilter->
invertColors() );
389 mBlendModeComboBox->setBlendMode( mRasterLayer->
blendMode() );
394 mRasterTransparencyWidget->cboxTransparencyBand->setShowNotSetOption(
true, tr(
"None" ) );
395 mRasterTransparencyWidget->cboxTransparencyBand->setLayer( mRasterLayer );
404 cboxTransparencyBand->setCurrentIndex( cboxTransparencyBand->findData( renderer->
alphaBand() ) );
411 mHistogramWidget =
nullptr;
412 if ( mOptsPage_Histogram->isEnabled() )
415 mHistogramStackedWidget->addWidget( mHistogramWidget );
428 mDisableRenderTypeComboBoxCurrentIndexChanged =
true;
430 for (
const QString &name : constRenderersList )
441 mDisableRenderTypeComboBoxCurrentIndexChanged =
false;
446 QString rendererType = renderer->
type();
447 widgetIndex = mRenderTypeComboBox->findData( rendererType );
448 if ( widgetIndex != -1 )
450 mDisableRenderTypeComboBoxCurrentIndexChanged =
true;
451 mRenderTypeComboBox->setCurrentIndex( widgetIndex );
452 mDisableRenderTypeComboBoxCurrentIndexChanged =
false;
455 if ( rendererType == QLatin1String(
"singlebandcolordata" ) && mRenderTypeComboBox->count() == 1 )
458 QSizePolicy sizep = mBandRenderingGrpBx->sizePolicy();
459 sizep.setVerticalStretch( 0 );
460 sizep.setVerticalPolicy( QSizePolicy::Maximum );
461 mBandRenderingGrpBx->setSizePolicy( sizep );
462 mBandRenderingGrpBx->updateGeometry();
465 if ( mRasterLayer->
providerType() != QLatin1String(
"wms" ) )
467 mWMSPrintGroupBox->hide();
468 mPublishDataSourceUrlCheckBox->hide();
469 mBackgroundLayerCheckBox->hide();
476 const int horizontalDpi = logicalDpiX();
479 if ( horizontalDpi > 96 )
481 mMetadataViewer->setZoomFactor( mMetadataViewer->zoomFactor() * 0.9 );
483 mMetadataViewer->page()->setLinkDelegationPolicy( QWebPage::LinkDelegationPolicy::DelegateAllLinks );
484 connect( mMetadataViewer->page(), &QWebPage::linkClicked,
this, &QgsRasterLayerProperties::urlClicked );
485 mMetadataViewer->page()->settings()->setAttribute( QWebSettings::DeveloperExtrasEnabled,
true );
486 mMetadataViewer->page()->settings()->setAttribute( QWebSettings::JavascriptEnabled,
true );
492 mRenderTypeComboBox_currentIndexChanged( widgetIndex );
500 if ( !settings.
contains( QStringLiteral(
"/Windows/RasterLayerProperties/tab" ) ) )
502 settings.
setValue( QStringLiteral(
"Windows/RasterLayerProperties/tab" ),
508 QString title = tr(
"Layer Properties — %1" ).arg( lyr->
name() );
516 mOptsPage_Information->setProperty(
"helpPage", QStringLiteral(
"working_with_raster/raster_properties.html#information-properties" ) );
517 mOptsPage_Source->setProperty(
"helpPage", QStringLiteral(
"working_with_raster/raster_properties.html#source-properties" ) );
518 mOptsPage_Style->setProperty(
"helpPage", QStringLiteral(
"working_with_raster/raster_properties.html#symbology-properties" ) );
519 mOptsPage_Transparency->setProperty(
"helpPage", QStringLiteral(
"working_with_raster/raster_properties.html#transparency-properties" ) );
521 if ( mOptsPage_Histogram )
522 mOptsPage_Histogram->setProperty(
"helpPage", QStringLiteral(
"working_with_raster/raster_properties.html#histogram-properties" ) );
524 mOptsPage_Rendering->setProperty(
"helpPage", QStringLiteral(
"working_with_raster/raster_properties.html#rendering-properties" ) );
526 if ( mOptsPage_Pyramids )
527 mOptsPage_Pyramids->setProperty(
"helpPage", QStringLiteral(
"working_with_raster/raster_properties.html#pyramids-properties" ) );
529 mOptsPage_Metadata->setProperty(
"helpPage", QStringLiteral(
"working_with_raster/raster_properties.html#metadata-properties" ) );
530 mOptsPage_Legend->setProperty(
"helpPage", QStringLiteral(
"working_with_raster/raster_properties.html#legend-properties" ) );
531 mOptsPage_Server->setProperty(
"helpPage", QStringLiteral(
"working_with_raster/raster_properties.html#server-properties" ) );
546 mLayerPropertiesPages << page;
549 if ( beforePage.isEmpty() )
567 void QgsRasterLayerProperties::setRendererWidget(
const QString &rendererName )
580 opacity = oldRenderer->
opacity();
589 QgsDebugMsgLevel( QStringLiteral(
"renderer has widgetCreateFunction" ), 3 );
592 if ( oldWidget && ( !oldRenderer || rendererName != oldRenderer->
type() ) )
594 if ( rendererName == QLatin1String(
"singlebandgray" ) )
597 whileBlocking( mRasterLayer )->setDefaultContrastEnhancement();
599 else if ( rendererName == QLatin1String(
"multibandcolor" ) )
602 whileBlocking( mRasterLayer )->setDefaultContrastEnhancement();
610 mRendererStackedWidget->addWidget( mRendererWidget );
614 std::unique_ptr<QgsRasterRenderer> oldRenderer;
615 oldRenderer.reset( oldWidget->
renderer() );
616 std::unique_ptr<QgsRasterRenderer> newRenderer;
617 newRenderer.reset( mRendererWidget->
renderer() );
618 const QList<int> oldBands = oldRenderer->
usesBands();
619 const QList<int> newBands = newRenderer->usesBands();
620 if ( oldBands != newBands )
628 const int widgetIndex = mRenderTypeComboBox->findData( rendererName );
629 if ( widgetIndex != -1 )
631 mDisableRenderTypeComboBoxCurrentIndexChanged =
true;
632 mRenderTypeComboBox->setCurrentIndex( widgetIndex );
633 mDisableRenderTypeComboBoxCurrentIndexChanged =
false;
636 if ( mRendererWidget != oldWidget )
639 if ( mHistogramWidget )
645 void QgsRasterLayerProperties::sync()
649 if ( !mSourceWidget )
654 QHBoxLayout *layout =
new QHBoxLayout();
655 layout->addWidget( mSourceWidget );
656 mSourceGroupBox->setLayout( layout );
657 mSourceGroupBox->show();
661 buttonBox->button( QDialogButtonBox::Apply )->setEnabled( isValid );
662 buttonBox->button( QDialogButtonBox::Ok )->setEnabled( isValid );
677 mRasterTransparencyWidget->gboxNoDataValue->setEnabled(
false );
678 mRasterTransparencyWidget->gboxCustomTransparency->setEnabled(
false );
679 mOptionsStackedWidget->setCurrentWidget( mOptsPage_Server );
685 if ( mOptsPage_Pyramids )
687 delete mOptsPage_Pyramids;
688 mOptsPage_Pyramids =
nullptr;
694 if ( mOptsPage_Histogram )
696 delete mOptsPage_Histogram;
697 mOptsPage_Histogram =
nullptr;
698 delete mHistogramWidget;
699 mHistogramWidget =
nullptr;
711 if ( brightnessFilter )
713 mSliderBrightness->setValue( brightnessFilter->
brightness() );
714 mSliderContrast->setValue( brightnessFilter->
contrast() );
715 mGammaSpinBox->setValue( brightnessFilter->
gamma() );
721 if ( hueSaturationFilter )
723 sliderSaturation->setValue( hueSaturationFilter->
saturation() );
724 comboGrayscale->setCurrentIndex( (
int ) hueSaturationFilter->
grayscaleMode() );
727 toggleSaturationControls(
static_cast<int>( hueSaturationFilter->
grayscaleMode() ) );
730 mColorizeCheck->setChecked( hueSaturationFilter->
colorizeOn() );
731 btnColorizeColor->setColor( hueSaturationFilter->
colorizeColor() );
732 toggleColorizeControls( hueSaturationFilter->
colorizeOn() );
733 sliderColorizeStrength->setValue( hueSaturationFilter->
colorizeStrength() );
734 mInvertColorsCheck->setChecked( hueSaturationFilter->
invertColors() );
747 mLayerOrigNameLineEd->setText( mRasterLayer->
name() );
754 updateInformationContent();
757 mLayerShortNameLineEdit->setText( mRasterLayer->
shortName() );
760 mLayerShortNameLineEdit->setValidator( shortNameValidator );
763 mLayerTitleLineEdit->setText( mRasterLayer->
title() );
764 mLayerAbstractTextEdit->setPlainText( mRasterLayer->
abstract() );
765 mLayerKeywordListLineEdit->setText( mRasterLayer->
keywordList() );
766 mLayerDataUrlLineEdit->setText( mRasterLayer->
dataUrl() );
767 mLayerDataUrlFormatComboBox->setCurrentIndex(
768 mLayerDataUrlFormatComboBox->findText(
774 mLayerAttributionLineEdit->setText( mRasterLayer->
attribution() );
775 mLayerAttributionUrlLineEdit->setText( mRasterLayer->
attributionUrl() );
781 const int row = mMetadataUrlModel->rowCount();
782 mMetadataUrlModel->setItem( row, 0,
new QStandardItem( metaUrl.url ) );
783 mMetadataUrlModel->setItem( row, 1,
new QStandardItem( metaUrl.type ) );
784 mMetadataUrlModel->setItem( row, 2,
new QStandardItem( metaUrl.format ) );
788 mLayerLegendUrlLineEdit->setText( mRasterLayer->
legendUrl() );
789 mLayerLegendUrlFormatComboBox->setCurrentIndex( mLayerLegendUrlFormatComboBox->findText( mRasterLayer->
legendUrlFormat() ) );
792 QVariant wmsPrintLayer = mRasterLayer->
customProperty( QStringLiteral(
"WMSPrintLayer" ) );
793 if ( wmsPrintLayer.isValid() )
795 mWMSPrintLayerLineEdit->setText( wmsPrintLayer.toString() );
798 QVariant wmsPublishDataSourceUrl = mRasterLayer->
customProperty( QStringLiteral(
"WMSPublishDataSourceUrl" ),
false );
799 mPublishDataSourceUrlCheckBox->setChecked( wmsPublishDataSourceUrl.toBool() );
801 QVariant wmsBackgroundLayer = mRasterLayer->
customProperty( QStringLiteral(
"WMSBackgroundLayer" ),
false );
802 mBackgroundLayerCheckBox->setChecked( wmsBackgroundLayer.toBool() );
804 mLegendPlaceholderWidget->setLastPathSettingsKey( QStringLiteral(
"lastLegendPlaceholderDir" ) );
806 mLegendConfigEmbeddedWidget->setLayer( mRasterLayer );
811 updateDataDefinedButtons();
815 page->syncToLayer( mRasterLayer );
820 void QgsRasterLayerProperties::apply()
824 const QString newSource = mSourceWidget->
sourceUri();
825 if ( newSource != mRasterLayer->
source() )
832 if ( !mRasterLayer->
isValid() )
846 mLegendConfigEmbeddedWidget->applyToLayer();
867 if (
"" != mRasterTransparencyWidget->leNoDataValue->text() )
869 bool myDoubleOk =
false;
874 myNoDataRangeList << myNoDataRange;
877 for (
int bandNo = 1; bandNo <= mRasterLayer->
dataProvider()->bandCount(); bandNo++ )
885 if ( rendererWidget )
892 mBackupCrs = mRasterLayer->
crs();
894 mMetadataFilled =
false;
898 if ( rasterRenderer )
900 rasterRenderer->
setAlphaBand( mRasterTransparencyWidget->cboxTransparencyBand->currentBand() );
901 rasterRenderer->
setNodataColor( mRasterTransparencyWidget->mNodataColorButton->color() );
905 if ( mRasterTransparencyWidget->tableTransparency->columnCount() == 4 )
908 QList<QgsRasterTransparency::TransparentThreeValuePixel> myTransparentThreeValuePixelList;
909 for (
int myListRunner = 0; myListRunner < mRasterTransparencyWidget->tableTransparency->rowCount(); myListRunner++ )
911 myTransparentPixel.
red = transparencyCellValue( myListRunner, 0 );
912 myTransparentPixel.
green = transparencyCellValue( myListRunner, 1 );
913 myTransparentPixel.
blue = transparencyCellValue( myListRunner, 2 );
915 myTransparentThreeValuePixelList.append( myTransparentPixel );
919 else if ( mRasterTransparencyWidget->tableTransparency->columnCount() == 3 )
922 QList<QgsRasterTransparency::TransparentSingleValuePixel> myTransparentSingleValuePixelList;
923 for (
int myListRunner = 0; myListRunner < mRasterTransparencyWidget->tableTransparency->rowCount(); myListRunner++ )
925 myTransparentPixel.
min = transparencyCellValue( myListRunner, 0 );
926 myTransparentPixel.
max = transparencyCellValue( myListRunner, 1 );
929 myTransparentSingleValuePixelList.append( myTransparentPixel );
940 rasterRenderer->
setOpacity( mRasterTransparencyWidget->mOpacityWidget->opacity() );
947 mRasterLayer->
setName( mLayerOrigNameLineEd->text() );
962 mResamplingUtils.refreshLayerFromWidgets();
966 if ( hueSaturationFilter )
968 hueSaturationFilter->
setSaturation( sliderSaturation->value() );
970 hueSaturationFilter->
setColorizeOn( mColorizeCheck->checkState() );
973 hueSaturationFilter->
setInvertColors( mInvertColorsCheck->isChecked() );
977 mRasterLayer->
setBlendMode( mBlendModeComboBox->blendMode() );
982 mRasterLayer->
setCrs( mCrsSelector->crs() );
984 if ( mRasterLayer->
shortName() != mLayerShortNameLineEdit->text() )
985 mMetadataFilled =
false;
986 mRasterLayer->
setShortName( mLayerShortNameLineEdit->text() );
988 if ( mRasterLayer->
title() != mLayerTitleLineEdit->text() )
989 mMetadataFilled =
false;
990 mRasterLayer->
setTitle( mLayerTitleLineEdit->text() );
992 if ( mRasterLayer->
abstract() != mLayerAbstractTextEdit->toPlainText() )
993 mMetadataFilled =
false;
994 mRasterLayer->
setAbstract( mLayerAbstractTextEdit->toPlainText() );
996 if ( mRasterLayer->
keywordList() != mLayerKeywordListLineEdit->text() )
997 mMetadataFilled =
false;
998 mRasterLayer->
setKeywordList( mLayerKeywordListLineEdit->text() );
1000 if ( mRasterLayer->
dataUrl() != mLayerDataUrlLineEdit->text() )
1001 mMetadataFilled =
false;
1002 mRasterLayer->
setDataUrl( mLayerDataUrlLineEdit->text() );
1004 if ( mRasterLayer->
dataUrlFormat() != mLayerDataUrlFormatComboBox->currentText() )
1005 mMetadataFilled =
false;
1006 mRasterLayer->
setDataUrlFormat( mLayerDataUrlFormatComboBox->currentText() );
1009 if ( mRasterLayer->
attribution() != mLayerAttributionLineEdit->text() )
1010 mMetadataFilled =
false;
1011 mRasterLayer->
setAttribution( mLayerAttributionLineEdit->text() );
1013 if ( mRasterLayer->
attributionUrl() != mLayerAttributionUrlLineEdit->text() )
1014 mMetadataFilled =
false;
1018 QList<QgsMapLayerServerProperties::MetadataUrl> metaUrls;
1019 for (
int row = 0; row < mMetadataUrlModel->rowCount() ; row++ )
1022 metaUrl.
url = mMetadataUrlModel->item( row, 0 )->text();
1023 metaUrl.
type = mMetadataUrlModel->item( row, 1 )->text();
1024 metaUrl.
format = mMetadataUrlModel->item( row, 2 )->text();
1025 metaUrls.append( metaUrl );
1026 mMetadataFilled =
false;
1030 if ( mRasterLayer->
legendUrl() != mLayerLegendUrlLineEdit->text() )
1031 mMetadataFilled =
false;
1032 mRasterLayer->
setLegendUrl( mLayerLegendUrlLineEdit->text() );
1034 if ( mRasterLayer->
legendUrlFormat() != mLayerLegendUrlFormatComboBox->currentText() )
1035 mMetadataFilled =
false;
1038 if ( !mWMSPrintLayerLineEdit->text().isEmpty() )
1040 mRasterLayer->
setCustomProperty( QStringLiteral(
"WMSPrintLayer" ), mWMSPrintLayerLineEdit->text() );
1043 mRasterLayer->
setCustomProperty(
"WMSPublishDataSourceUrl", mPublishDataSourceUrlCheckBox->isChecked() );
1044 mRasterLayer->
setCustomProperty(
"WMSBackgroundLayer", mBackgroundLayerCheckBox->isChecked() );
1058 void QgsRasterLayerProperties::buttonBuildPyramids_clicked()
1070 for (
int myCounterInt = 0; myCounterInt < lbxPyramidResolutions->count(); myCounterInt++ )
1072 QListWidgetItem *myItem = lbxPyramidResolutions->item( myCounterInt );
1074 myPyramidList[myCounterInt].setBuild( myItem->isSelected() || myPyramidList[myCounterInt].getExists() );
1078 QString prefix = provider->
name() +
"/driverOptions/_pyramids/";
1080 QString resamplingMethod( cboResamplingMethod->currentData().toString() );
1081 mySettings.
setValue( prefix +
"resampling", resamplingMethod );
1088 QApplication::setOverrideCursor( Qt::WaitCursor );
1095 QApplication::restoreOverrideCursor();
1096 mPyramidProgress->setValue( 0 );
1097 buttonBuildPyramids->setEnabled(
false );
1098 if ( !res.isNull() )
1100 if ( res == QLatin1String(
"CANCELED" ) )
1104 else if ( res == QLatin1String(
"ERROR_WRITE_ACCESS" ) )
1106 QMessageBox::warning(
this, tr(
"Building Pyramids" ),
1107 tr(
"Write access denied. Adjust the file permissions and try again." ) );
1109 else if ( res == QLatin1String(
"ERROR_WRITE_FORMAT" ) )
1111 QMessageBox::warning(
this, tr(
"Building Pyramids" ),
1112 tr(
"The file was not writable. Some formats do not "
1113 "support pyramid overviews. Consult the GDAL documentation if in doubt." ) );
1115 else if ( res == QLatin1String(
"FAILED_NOT_SUPPORTED" ) )
1117 QMessageBox::warning(
this, tr(
"Building Pyramids" ),
1118 tr(
"Building pyramid overviews is not supported on this type of raster." ) );
1120 else if ( res == QLatin1String(
"ERROR_JPEG_COMPRESSION" ) )
1122 QMessageBox::warning(
this, tr(
"Building Pyramids" ),
1123 tr(
"Building internal pyramid overviews is not supported on raster layers with JPEG compression and your current libtiff library." ) );
1125 else if ( res == QLatin1String(
"ERROR_VIRTUAL" ) )
1127 QMessageBox::warning(
this, tr(
"Building Pyramids" ),
1128 tr(
"Building pyramid overviews is not supported on this type of raster." ) );
1136 lbxPyramidResolutions->clear();
1144 if ( pyramid.getExists() )
1146 lbxPyramidResolutions->addItem(
new QListWidgetItem( myPyramidPixmap,
1147 QString::number( pyramid.getXDim() ) + QStringLiteral(
" x " ) +
1148 QString::number( pyramid.getYDim() ) ) );
1152 lbxPyramidResolutions->addItem(
new QListWidgetItem( myNoPyramidPixmap,
1153 QString::number( pyramid.getXDim() ) + QStringLiteral(
" x " ) +
1154 QString::number( pyramid.getYDim() ) ) );
1163 updateInformationContent();
1166 void QgsRasterLayerProperties::urlClicked(
const QUrl &url )
1168 QFileInfo file( url.toLocalFile() );
1169 if ( file.exists() && !file.isDir() )
1172 QDesktopServices::openUrl( url );
1175 void QgsRasterLayerProperties::mRenderTypeComboBox_currentIndexChanged(
int index )
1177 if ( index < 0 || mDisableRenderTypeComboBoxCurrentIndexChanged || ! mRasterLayer->renderer() )
1182 QString rendererName = mRenderTypeComboBox->itemData( index ).toString();
1183 setRendererWidget( rendererName );
1193 void QgsRasterLayerProperties::setTransparencyCell(
int row,
int column,
double value )
1195 QgsDebugMsgLevel( QStringLiteral(
"value = %1" ).arg( value, 0,
'g', 17 ), 3 );
1197 if ( !provider )
return;
1200 if ( !renderer )
return;
1201 int nBands = renderer->
usesBands().size();
1203 QLineEdit *lineEdit =
new QLineEdit();
1204 lineEdit->setFrame(
false );
1206 lineEdit->setContentsMargins( 1, 1, 1, 1 );
1208 if ( column == mRasterTransparencyWidget->tableTransparency->columnCount() - 1 )
1212 lineEdit->setValidator(
new QIntValidator(
nullptr ) );
1213 lineEdit->setText( QString::number(
static_cast<int>( value ) ) );
1218 QString valueString;
1224 if ( !std::isnan( value ) )
1227 valueString = QLocale().toString( v,
'g' ) ;
1231 lineEdit->setValidator(
new QIntValidator(
nullptr ) );
1232 if ( !std::isnan( value ) )
1234 valueString = QLocale().toString(
static_cast<int>( value ) );
1238 lineEdit->setText( valueString );
1240 mRasterTransparencyWidget->tableTransparency->setCellWidget( row, column, lineEdit );
1241 adjustTransparencyCellWidth( row, column );
1243 if ( nBands == 1 && ( column == 0 || column == 1 ) )
1245 connect( lineEdit, &QLineEdit::textEdited,
this, &QgsRasterLayerProperties::transparencyCellTextEdited );
1247 mRasterTransparencyWidget->tableTransparency->resizeColumnsToContents();
1250 void QgsRasterLayerProperties::setTransparencyCellValue(
int row,
int column,
double value )
1252 QLineEdit *lineEdit =
dynamic_cast<QLineEdit *
>( mRasterTransparencyWidget->tableTransparency->cellWidget( row, column ) );
1253 if ( !lineEdit )
return;
1255 lineEdit->setText( QLocale().toString( v,
'g' ) );
1256 lineEdit->adjustSize();
1257 adjustTransparencyCellWidth( row, column );
1258 mRasterTransparencyWidget->tableTransparency->resizeColumnsToContents();
1261 double QgsRasterLayerProperties::transparencyCellValue(
int row,
int column )
1263 QLineEdit *lineEdit =
dynamic_cast<QLineEdit *
>( mRasterTransparencyWidget->tableTransparency->cellWidget( row, column ) );
1264 if ( !lineEdit || lineEdit->text().isEmpty() )
1266 return std::numeric_limits<double>::quiet_NaN();
1268 return QLocale().toDouble( lineEdit->text() );
1271 void QgsRasterLayerProperties::adjustTransparencyCellWidth(
int row,
int column )
1273 QLineEdit *lineEdit =
dynamic_cast<QLineEdit *
>( mRasterTransparencyWidget->tableTransparency->cellWidget( row, column ) );
1274 if ( !lineEdit )
return;
1276 int width = std::max( lineEdit->fontMetrics().boundingRect( lineEdit->text() ).width() + 10, 100 );
1277 width = std::max( width, mRasterTransparencyWidget->tableTransparency->columnWidth( column ) );
1279 lineEdit->setFixedWidth( width );
1282 void QgsRasterLayerProperties::transparencyCellTextEdited(
const QString &text )
1291 int nBands = renderer->
usesBands().size();
1294 QLineEdit *lineEdit = qobject_cast<QLineEdit *>( sender() );
1295 if ( !lineEdit )
return;
1298 for (
int r = 0; r < mRasterTransparencyWidget->tableTransparency->rowCount(); r++ )
1300 for (
int c = 0;
c < mRasterTransparencyWidget->tableTransparency->columnCount();
c++ )
1302 if ( mRasterTransparencyWidget->tableTransparency->cellWidget( r,
c ) == sender() )
1309 if ( row != -1 )
break;
1311 QgsDebugMsgLevel( QStringLiteral(
"row = %1 column =%2" ).arg( row ).arg( column ), 3 );
1315 QLineEdit *toLineEdit =
dynamic_cast<QLineEdit *
>( mRasterTransparencyWidget->tableTransparency->cellWidget( row, 1 ) );
1316 if ( !toLineEdit )
return;
1317 bool toChanged = mTransparencyToEdited.value( row );
1318 QgsDebugMsgLevel( QStringLiteral(
"toChanged = %1" ).arg( toChanged ), 3 );
1321 toLineEdit->setText( lineEdit->text() );
1324 else if ( column == 1 )
1326 setTransparencyToEdited( row );
1331 void QgsRasterLayerProperties::aboutToShowStyleMenu()
1335 QMenu *m = qobject_cast<QMenu *>( sender() );
1343 void QgsRasterLayerProperties::syncToLayer()
1348 setRendererWidget( renderer->
type() );
1354 void QgsRasterLayerProperties::setTransparencyToEdited(
int row )
1356 if ( row >= mTransparencyToEdited.size() )
1358 mTransparencyToEdited.resize( row + 1 );
1360 mTransparencyToEdited[row] =
true;
1367 bool isMetadataPanel = ( index ==
mOptStackedWidget->indexOf( mOptsPage_Metadata ) );
1368 mBtnStyle->setVisible( ! isMetadataPanel );
1369 mBtnMetadata->setVisible( isMetadataPanel );
1371 if ( !mHistogramWidget )
1383 if ( index ==
mOptStackedWidget->indexOf( mOptsPage_Information ) || !mMetadataFilled )
1386 updateInformationContent();
1392 button->blockSignals(
true );
1396 button->blockSignals(
false );
1399 void QgsRasterLayerProperties::updateDataDefinedButtons()
1401 const auto propertyOverrideButtons { findChildren< QgsPropertyOverrideButton * >() };
1404 updateDataDefinedButton( button );
1420 void QgsRasterLayerProperties::updateProperty()
1427 void QgsRasterLayerProperties::toggleSaturationControls(
int grayscaleMode )
1430 if ( grayscaleMode == 0 )
1432 sliderSaturation->setEnabled(
true );
1433 spinBoxSaturation->setEnabled(
true );
1437 sliderSaturation->setEnabled(
false );
1438 spinBoxSaturation->setEnabled(
false );
1442 void QgsRasterLayerProperties::toggleColorizeControls(
bool colorizeEnabled )
1445 btnColorizeColor->setEnabled( colorizeEnabled );
1446 sliderColorizeStrength->setEnabled( colorizeEnabled );
1447 spinColorizeStrength->setEnabled( colorizeEnabled );
1451 QLinearGradient QgsRasterLayerProperties::redGradient()
1455 QLinearGradient myGradient = QLinearGradient( mGradientWidth, 0, mGradientWidth, mGradientHeight );
1456 myGradient.setColorAt( 0.0, QColor( 242, 14, 25, 190 ) );
1457 myGradient.setColorAt( 0.5, QColor( 175, 29, 37, 190 ) );
1458 myGradient.setColorAt( 1.0, QColor( 114, 17, 22, 190 ) );
1461 QLinearGradient QgsRasterLayerProperties::greenGradient()
1465 QLinearGradient myGradient = QLinearGradient( mGradientWidth, 0, mGradientWidth, mGradientHeight );
1466 myGradient.setColorAt( 0.0, QColor( 48, 168, 5, 190 ) );
1467 myGradient.setColorAt( 0.8, QColor( 36, 122, 4, 190 ) );
1468 myGradient.setColorAt( 1.0, QColor( 21, 71, 2, 190 ) );
1471 QLinearGradient QgsRasterLayerProperties::blueGradient()
1475 QLinearGradient myGradient = QLinearGradient( mGradientWidth, 0, mGradientWidth, mGradientHeight );
1476 myGradient.setColorAt( 0.0, QColor( 30, 0, 106, 190 ) );
1477 myGradient.setColorAt( 0.2, QColor( 30, 72, 128, 190 ) );
1478 myGradient.setColorAt( 1.0, QColor( 30, 223, 196, 190 ) );
1481 QLinearGradient QgsRasterLayerProperties::grayGradient()
1485 QLinearGradient myGradient = QLinearGradient( mGradientWidth, 0, mGradientWidth, mGradientHeight );
1486 myGradient.setColorAt( 0.0, QColor( 5, 5, 5, 190 ) );
1487 myGradient.setColorAt( 0.8, QColor( 122, 122, 122, 190 ) );
1488 myGradient.setColorAt( 1.0, QColor( 220, 220, 220, 190 ) );
1491 QLinearGradient QgsRasterLayerProperties::highlightGradient()
1495 QLinearGradient myGradient = QLinearGradient( mGradientWidth, 0, mGradientWidth, mGradientHeight );
1496 myGradient.setColorAt( 1.0, QColor( 255, 255, 255, 50 ) );
1497 myGradient.setColorAt( 0.5, QColor( 255, 255, 255, 100 ) );
1498 myGradient.setColorAt( 0.0, QColor( 255, 255, 255, 150 ) );
1502 void QgsRasterLayerProperties::addMetadataUrl()
1504 const int row = mMetadataUrlModel->rowCount();
1505 mMetadataUrlModel->setItem( row, 0,
new QStandardItem( QLatin1String() ) );
1506 mMetadataUrlModel->setItem( row, 1,
new QStandardItem( QLatin1String() ) );
1507 mMetadataUrlModel->setItem( row, 2,
new QStandardItem( QLatin1String() ) );
1510 void QgsRasterLayerProperties::removeSelectedMetadataUrl()
1512 const QModelIndexList selectedRows = tableViewMetadataUrl->selectionModel()->selectedRows();
1513 if ( selectedRows.empty() )
1515 mMetadataUrlModel->removeRow( selectedRows[0].row() );
1524 void QgsRasterLayerProperties::loadDefaultStyle_clicked()
1526 bool defaultLoadedFlag =
false;
1529 if ( defaultLoadedFlag )
1536 QMessageBox::information(
this,
1537 tr(
"Default Style" ),
1543 void QgsRasterLayerProperties::saveDefaultStyle_clicked()
1549 bool defaultSavedFlag =
false;
1553 if ( !defaultSavedFlag )
1556 QMessageBox::information(
this,
1557 tr(
"Default Style" ),
1564 void QgsRasterLayerProperties::loadStyle_clicked()
1567 QString lastUsedDir = settings.
value( QStringLiteral(
"style/lastStyleDir" ), QDir::homePath() ).toString();
1569 QString fileName = QFileDialog::getOpenFileName(
1571 tr(
"Load layer properties from style file" ),
1573 tr(
"QGIS Layer Style File" ) +
" (*.qml)" );
1574 if ( fileName.isEmpty() )
1578 if ( !fileName.endsWith( QLatin1String(
".qml" ), Qt::CaseInsensitive ) )
1579 fileName += QLatin1String(
".qml" );
1583 bool defaultLoadedFlag =
false;
1584 QString message = mRasterLayer->
loadNamedStyle( fileName, defaultLoadedFlag );
1585 if ( defaultLoadedFlag )
1587 settings.
setValue( QStringLiteral(
"style/lastStyleDir" ), QFileInfo( fileName ).absolutePath() );
1592 QMessageBox::information(
this, tr(
"Save Style" ), message );
1597 void QgsRasterLayerProperties::saveStyleAs_clicked()
1600 QString lastUsedDir = settings.
value( QStringLiteral(
"style/lastStyleDir" ), QDir::homePath() ).toString();
1602 QString selectedFilter;
1603 QString outputFileName = QFileDialog::getSaveFileName(
1605 tr(
"Save layer properties as style file" ),
1607 tr(
"QGIS Layer Style File" ) +
" (*.qml)" +
";;" + tr(
"Styled Layer Descriptor" ) +
" (*.sld)",
1609 if ( outputFileName.isEmpty() )
1614 if ( selectedFilter.contains( QStringLiteral(
".qml" ), Qt::CaseInsensitive ) )
1617 type = StyleType::QML;
1622 type = StyleType::SLD;
1628 bool defaultLoadedFlag =
false;
1634 message = mRasterLayer->
saveNamedStyle( outputFileName, defaultLoadedFlag );
1639 message = mRasterLayer->
saveSldStyle( outputFileName, defaultLoadedFlag );
1643 if ( defaultLoadedFlag )
1645 settings.
setValue( QStringLiteral(
"style/lastStyleDir" ), QFileInfo( outputFileName ).absolutePath() );
1649 QMessageBox::information(
this, tr(
"Save Style" ), message );
1652 void QgsRasterLayerProperties::restoreWindowModality()
1667 void QgsRasterLayerProperties::loadMetadata()
1670 QString myLastUsedDir = myQSettings.
value( QStringLiteral(
"style/lastStyleDir" ), QDir::homePath() ).toString();
1672 QString myFileName = QFileDialog::getOpenFileName(
this, tr(
"Load layer metadata from metadata file" ), myLastUsedDir,
1673 tr(
"QGIS Layer Metadata File" ) +
" (*.qmd)" );
1674 if ( myFileName.isNull() )
1680 bool defaultLoadedFlag =
false;
1684 if ( defaultLoadedFlag )
1691 QMessageBox::warning(
this, tr(
"Load Metadata" ), myMessage );
1694 QFileInfo myFI( myFileName );
1695 QString myPath = myFI.path();
1696 myQSettings.
setValue( QStringLiteral(
"style/lastStyleDir" ), myPath );
1701 void QgsRasterLayerProperties::saveMetadataAs()
1704 QString myLastUsedDir = myQSettings.
value( QStringLiteral(
"style/lastStyleDir" ), QDir::homePath() ).toString();
1706 QString myOutputFileName = QFileDialog::getSaveFileName(
this, tr(
"Save Layer Metadata as QMD" ),
1707 myLastUsedDir, tr(
"QMD File" ) +
" (*.qmd)" );
1708 if ( myOutputFileName.isNull() )
1721 bool defaultLoadedFlag =
false;
1722 QString message = mRasterLayer->
saveNamedMetadata( myOutputFileName, defaultLoadedFlag );
1723 if ( defaultLoadedFlag )
1724 myQSettings.
setValue( QStringLiteral(
"style/lastStyleDir" ), QFileInfo( myOutputFileName ).absolutePath() );
1726 QMessageBox::information(
this, tr(
"Save Metadata" ), message );
1729 void QgsRasterLayerProperties::saveDefaultMetadata()
1733 bool defaultSavedFlag =
false;
1735 if ( !defaultSavedFlag )
1737 QMessageBox::warning(
this, tr(
"Default Metadata" ), errorMsg );
1741 void QgsRasterLayerProperties::loadDefaultMetadata()
1743 bool defaultLoadedFlag =
false;
1746 if ( defaultLoadedFlag )
1752 QMessageBox::information(
this, tr(
"Default Metadata" ), myMessage );
1757 void QgsRasterLayerProperties::toggleBuildPyramidsButton()
1759 if ( lbxPyramidResolutions->selectedItems().empty() )
1761 buttonBuildPyramids->setEnabled(
false );
1765 buttonBuildPyramids->setEnabled(
true );
1769 void QgsRasterLayerProperties::mResetColorRenderingBtn_clicked()
1771 mBlendModeComboBox->setBlendMode( QPainter::CompositionMode_SourceOver );
1772 mSliderBrightness->setValue( 0 );
1773 mSliderContrast->setValue( 0 );
1774 mGammaSpinBox->setValue( 1.0 );
1775 sliderSaturation->setValue( 0 );
1777 mColorizeCheck->setChecked(
false );
1778 sliderColorizeStrength->setValue( 100 );
1779 mInvertColorsCheck->setChecked(
false );
1782 bool QgsRasterLayerProperties::rasterIsMultiBandColor()
1787 void QgsRasterLayerProperties::updateInformationContent()
1791 const QString html { mRasterLayer->
htmlMetadata().replace( QLatin1String(
"<head>" ), QStringLiteral( R
"raw(<head><style type="text/css">%1</style>)raw" ) ).arg( myStyle ) };
1792 mMetadataViewer->setHtml( html );
1793 mMetadataFilled = true;
1796 void QgsRasterLayerProperties::onCancel()
1802 QDomDocument doc( QStringLiteral(
"qgis" ) );
1803 int errorLine, errorColumn;
1804 doc.setContent( mOldStyle.
xmlData(),
false, &myMessage, &errorLine, &errorColumn );
1808 if ( mBackupCrs != mRasterLayer->
crs() )
1809 mRasterLayer->
setCrs( mBackupCrs );
1812 void QgsRasterLayerProperties::showHelp()
1814 const QVariant helpPage = mOptionsStackedWidget->currentWidget()->property(
"helpPage" );
1816 if ( helpPage.isValid() )
1822 QgsHelp::openHelp( QStringLiteral(
"working_with_raster/raster_properties.html" ) );
1826 void QgsRasterLayerProperties::updateGammaSpinBox(
int value )
1831 void QgsRasterLayerProperties::updateGammaSlider(
double value )
@ 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).
QString userFriendlyIdentifier(IdentifierType type=MediumString) const
Returns a user friendly identifier for the CRS.
@ WKT_PREFERRED
Preferred format, matching the most recent WKT ISO standard. Currently an alias to WKT2_2019,...
QString toWkt(WktVariant variant=WKT1_GDAL, bool multiline=false, int indentationWidth=4) const
Returns a WKT representation of this CRS.
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 * 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 QgsGui * instance()
Returns a pointer to the singleton instance.
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
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.
bool isDefault(const QString &styleName) const
Returns true if this is the default 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.
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.
QgsMapLayerServerProperties * serverProperties()
Returns QGIS Server Properties for the map layer.
QPainter::CompositionMode blendMode() const
Returns the current blending mode for a layer.
void setDataUrl(const QString &dataUrl)
Sets the DataUrl of the layer used by QGIS Server in GetCapabilities request.
virtual QString saveDefaultStyle(bool &resultFlag)
Save the properties of this layer as the default style (either as a .qml file on disk or as a record ...
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.
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.
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 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...
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
Renderer for multiband images with the color components.
A base dialog for options and properties dialogs that offers vertical tabs.
void addPage(const QString &title, const QString &tooltip, const QIcon &icon, QWidget *widget, const QStringList &path=QStringList())
Adds a new page to the dialog pages.
virtual void optionsStackedWidget_CurrentChanged(int index)
Select relevant tab on current page change.
void insertPage(const QString &title, const QString &tooltip, const QIcon &icon, QWidget *widget, const QString &before, const QStringList &path=QStringList())
Inserts a new page into the dialog pages.
void restoreOptionsBaseUi(const QString &title=QString())
Restore the base ui.
QStackedWidget * mOptStackedWidget
void initOptionsBase(bool restoreUi=true, const QString &title=QString())
Set up the base ui connections for vertical tabs.
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", QgsRaster::RasterPyramidsFormat format=QgsRaster::PyramidsGTiff, const QStringList &configOptions=QStringList(), QgsRasterBlockFeedback *feedback=nullptr)
Creates pyramid overviews.
virtual QList< QgsRasterPyramid > buildPyramidList(const QList< int > &overviewList=QList< int >())
Returns the raster layers pyramid list.
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)
@ 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 addPropertiesPageFactory(const QgsMapLayerConfigWidgetFactory *factory)
Adds a properties page factory to the raster layer properties dialog.
QgsRasterLayerProperties(QgsMapLayer *lyr, QgsMapCanvas *canvas, QWidget *parent=nullptr, Qt::WindowFlags=QgsGuiUtils::ModalDialogFlags)
Constructor.
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.
QgsRasterPipe * pipe()
Returns the raster pipe.
QgsBrightnessContrastFilter * brightnessFilter() const
Returns the raster's brightness/contrast filter.
LayerType rasterType()
Returns the raster layer type (which is a read only property).
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
double opacity() const
Returns the opacity for the renderer, where opacity is a value between 0 (totally transparent) and 1....
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)
virtual QList< int > usesBands() const
Returns a list of band numbers used by the renderer.
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
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