37 #include "qgsnative.h"
76 #include <QDesktopServices>
77 #include <QTableWidgetItem>
78 #include <QHeaderView>
79 #include <QTextStream>
81 #include <QFileDialog>
82 #include <QMessageBox>
84 #include <QLinearGradient>
85 #include <QPainterPath>
87 #include <QColorDialog>
89 #include <QMouseEvent>
94 #include <QRegularExpressionValidator>
95 #include <QRegularExpression>
100 , TRSTRING_NOT_SET( tr(
"Not Set" ) )
101 , mDefaultStandardDeviation( 0 )
102 , mDefaultRedBand( 0 )
103 , mDefaultGreenBand( 0 )
104 , mDefaultBlueBand( 0 )
106 , mGradientHeight( 0.0 )
107 , mGradientWidth( 0.0 )
108 , mMapCanvas( canvas )
109 , mMetadataFilled( false )
111 mGrayMinimumMaximumEstimated =
true;
112 mRGBMinimumMaximumEstimated =
true;
117 mOptsPage_Information->layout()->addWidget( mMetadataViewer );
121 transparencyScrollArea->setWidget( mRasterTransparencyWidget );
123 connect( buttonBuildPyramids, &QPushButton::clicked,
this, &QgsRasterLayerProperties::buttonBuildPyramids_clicked );
125 connect( mRenderTypeComboBox,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsRasterLayerProperties::mRenderTypeComboBox_currentIndexChanged );
126 connect( mResetColorRenderingBtn, &QToolButton::clicked,
this, &QgsRasterLayerProperties::mResetColorRenderingBtn_clicked );
127 connect( buttonRemoveMetadataUrl, &QPushButton::clicked,
this, &QgsRasterLayerProperties::removeSelectedMetadataUrl );
128 connect( buttonAddMetadataUrl, &QPushButton::clicked,
this, &QgsRasterLayerProperties::addMetadataUrl );
133 connect( buttonBox, &QDialogButtonBox::helpRequested,
this, &QgsRasterLayerProperties::showHelp );
135 mSourceGroupBox->hide();
137 mBtnStyle =
new QPushButton( tr(
"Style" ) );
138 QMenu *menuStyle =
new QMenu(
this );
139 menuStyle->addAction( tr(
"Load Style…" ),
this, &QgsRasterLayerProperties::loadStyle_clicked );
140 menuStyle->addAction( tr(
"Save Style…" ),
this, &QgsRasterLayerProperties::saveStyleAs_clicked );
141 menuStyle->addSeparator();
142 menuStyle->addAction( tr(
"Save as Default" ),
this, &QgsRasterLayerProperties::saveDefaultStyle_clicked );
143 menuStyle->addAction( tr(
"Restore Default" ),
this, &QgsRasterLayerProperties::loadDefaultStyle_clicked );
144 mBtnStyle->setMenu( menuStyle );
145 connect( menuStyle, &QMenu::aboutToShow,
this, &QgsRasterLayerProperties::aboutToShowStyleMenu );
146 buttonBox->addButton( mBtnStyle, QDialogButtonBox::ResetRole );
148 mBtnMetadata =
new QPushButton( tr(
"Metadata" ),
this );
149 QMenu *menuMetadata =
new QMenu(
this );
150 mActionLoadMetadata = menuMetadata->addAction( tr(
"Load Metadata…" ),
this, &QgsRasterLayerProperties::loadMetadata );
151 mActionSaveMetadataAs = menuMetadata->addAction( tr(
"Save Metadata…" ),
this, &QgsRasterLayerProperties::saveMetadataAs );
152 menuMetadata->addSeparator();
153 menuMetadata->addAction( tr(
"Save as Default" ),
this, &QgsRasterLayerProperties::saveDefaultMetadata );
154 menuMetadata->addAction( tr(
"Restore Default" ),
this, &QgsRasterLayerProperties::loadDefaultMetadata );
155 mBtnMetadata->setMenu( menuMetadata );
156 buttonBox->addButton( mBtnMetadata, QDialogButtonBox::ResetRole );
160 connect(
this, &QDialog::accepted,
this, &QgsRasterLayerProperties::apply );
161 connect(
this, &QDialog::rejected,
this, &QgsRasterLayerProperties::onCancel );
163 connect( buttonBox->button( QDialogButtonBox::Apply ), &QAbstractButton::clicked,
this, &QgsRasterLayerProperties::apply );
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 mBackupCrs = mRasterLayer->
crs();
252 connect( mRasterTransparencyWidget->pbnAddValuesFromDisplay, &QPushButton::clicked,
this, [ = ]
258 mMapCanvas->window()->raise();
259 mMapCanvas->window()->activateWindow();
260 mMapCanvas->window()->setFocus();
277 cboResamplingMethod->clear();
280 for (
const QPair<QString, QString> &method : std::as_const( constProviderType ) )
282 cboResamplingMethod->addItem( method.second, method.first );
286 QString prefix = provider->
name() +
"/driverOptions/_pyramids/";
288 QString defaultMethod = mySettings.
value( prefix +
"resampling",
"AVERAGE" ).toString();
289 int idx = cboResamplingMethod->findData( defaultMethod );
291 cboResamplingMethod->setCurrentIndex( idx );
295 const QList< QgsRasterPyramid > myPyramidList = provider->
buildPyramidList();
299 if ( pyramid.getExists() )
301 lbxPyramidResolutions->addItem(
new QListWidgetItem( myPyramidPixmap,
302 QString::number( pyramid.getXDim() ) + QStringLiteral(
" x " ) +
303 QString::number( pyramid.getYDim() ) ) );
307 lbxPyramidResolutions->addItem(
new QListWidgetItem( myNoPyramidPixmap,
308 QString::number( pyramid.getXDim() ) + QStringLiteral(
" x " ) +
309 QString::number( pyramid.getYDim() ) ) );
316 mOptsPage_Pyramids->setEnabled(
false );
325 mOptsPage_Histogram->setEnabled(
false );
328 QVBoxLayout *layout =
new QVBoxLayout( metadataFrame );
329 layout->setContentsMargins( 0, 0, 0, 0 );
331 mMetadataWidget->layout()->setContentsMargins( 0, 0, 0, 0 );
333 layout->addWidget( mMetadataWidget );
334 metadataFrame->setLayout( layout );
336 QVBoxLayout *temporalLayout =
new QVBoxLayout( temporalFrame );
337 temporalLayout->setContentsMargins( 0, 0, 0, 0 );
339 temporalLayout->addWidget( mTemporalWidget );
343 mCrsSelector->setCrs( mRasterLayer->
crs() );
346 QString pyramidFormat( QStringLiteral(
"<h2>%1</h2><p>%2 %3 %4</p><b><font color='red'><p>%5</p><p>%6</p>" ) );
347 QString pyramidHeader = tr(
"Description" );
348 QString pyramidSentence1 = tr(
"Large resolution raster layers can slow navigation in QGIS." );
349 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." );
350 QString pyramidSentence3 = tr(
"You must have write access in the directory where the original data is stored to build pyramids." );
351 QString pyramidSentence4 = tr(
"Please note that building internal pyramids may alter the original data file and once created they cannot be removed!" );
352 QString pyramidSentence5 = tr(
"Please note that building internal pyramids could corrupt your image - always make a backup of your data first!" );
354 tePyramidDescription->setHtml( pyramidFormat.arg( pyramidHeader,
359 pyramidSentence5 ) );
362 mResamplingGroupBox->setSaveCheckedState(
true );
363 mResamplingUtils.initWidgets( mRasterLayer, mZoomedInResamplingComboBox, mZoomedOutResamplingComboBox, mMaximumOversamplingSpinBox, mCbEarlyResampling );
364 mResamplingUtils.refreshWidgetsFromLayer();
368 btnColorizeColor->setColorDialogTitle( tr(
"Select Color" ) );
369 btnColorizeColor->setContext( QStringLiteral(
"symbology" ) );
374 if ( hueSaturationFilter )
376 sliderSaturation->setValue( hueSaturationFilter->
saturation() );
377 comboGrayscale->setCurrentIndex( (
int ) hueSaturationFilter->
grayscaleMode() );
380 toggleSaturationControls(
static_cast<int>( hueSaturationFilter->
grayscaleMode() ) );
383 mColorizeCheck->setChecked( hueSaturationFilter->
colorizeOn() );
384 btnColorizeColor->setColor( hueSaturationFilter->
colorizeColor() );
385 toggleColorizeControls( hueSaturationFilter->
colorizeOn() );
386 sliderColorizeStrength->setValue( hueSaturationFilter->
colorizeStrength() );
387 mInvertColorsCheck->setChecked( hueSaturationFilter->
invertColors() );
392 mBlendModeComboBox->setBlendMode( mRasterLayer->
blendMode() );
397 mRasterTransparencyWidget->cboxTransparencyBand->setShowNotSetOption(
true, tr(
"None" ) );
398 mRasterTransparencyWidget->cboxTransparencyBand->setLayer( mRasterLayer );
407 cboxTransparencyBand->setCurrentIndex( cboxTransparencyBand->findData( renderer->
alphaBand() ) );
414 mHistogramWidget =
nullptr;
415 if ( mOptsPage_Histogram->isEnabled() )
418 mHistogramStackedWidget->addWidget( mHistogramWidget );
431 mDisableRenderTypeComboBoxCurrentIndexChanged =
true;
433 for (
const QString &name : constRenderersList )
444 mDisableRenderTypeComboBoxCurrentIndexChanged =
false;
449 QString rendererType = renderer->
type();
450 widgetIndex = mRenderTypeComboBox->findData( rendererType );
451 if ( widgetIndex != -1 )
453 mDisableRenderTypeComboBoxCurrentIndexChanged =
true;
454 mRenderTypeComboBox->setCurrentIndex( widgetIndex );
455 mDisableRenderTypeComboBoxCurrentIndexChanged =
false;
458 if ( rendererType == QLatin1String(
"singlebandcolordata" ) && mRenderTypeComboBox->count() == 1 )
461 QSizePolicy sizep = mBandRenderingGrpBx->sizePolicy();
462 sizep.setVerticalStretch( 0 );
463 sizep.setVerticalPolicy( QSizePolicy::Maximum );
464 mBandRenderingGrpBx->setSizePolicy( sizep );
465 mBandRenderingGrpBx->updateGeometry();
468 if ( mRasterLayer->
providerType() != QLatin1String(
"wms" ) )
470 mWMSPrintGroupBox->hide();
471 mPublishDataSourceUrlCheckBox->hide();
472 mBackgroundLayerCheckBox->hide();
479 const int horizontalDpi = logicalDpiX();
482 if ( horizontalDpi > 96 )
484 mMetadataViewer->setZoomFactor( mMetadataViewer->zoomFactor() * 0.9 );
486 mMetadataViewer->page()->setLinkDelegationPolicy( QWebPage::LinkDelegationPolicy::DelegateAllLinks );
487 connect( mMetadataViewer->page(), &QWebPage::linkClicked,
this, &QgsRasterLayerProperties::urlClicked );
488 mMetadataViewer->page()->settings()->setAttribute( QWebSettings::DeveloperExtrasEnabled,
true );
489 mMetadataViewer->page()->settings()->setAttribute( QWebSettings::JavascriptEnabled,
true );
495 mRenderTypeComboBox_currentIndexChanged( widgetIndex );
503 if ( !settings.
contains( QStringLiteral(
"/Windows/RasterLayerProperties/tab" ) ) )
505 settings.
setValue( QStringLiteral(
"Windows/RasterLayerProperties/tab" ),
511 QString title = tr(
"Layer Properties — %1" ).arg( lyr->
name() );
519 mOptsPage_Information->setProperty(
"helpPage", QStringLiteral(
"working_with_raster/raster_properties.html#information-properties" ) );
520 mOptsPage_Source->setProperty(
"helpPage", QStringLiteral(
"working_with_raster/raster_properties.html#source-properties" ) );
521 mOptsPage_Style->setProperty(
"helpPage", QStringLiteral(
"working_with_raster/raster_properties.html#symbology-properties" ) );
522 mOptsPage_Transparency->setProperty(
"helpPage", QStringLiteral(
"working_with_raster/raster_properties.html#transparency-properties" ) );
524 if ( mOptsPage_Histogram )
525 mOptsPage_Histogram->setProperty(
"helpPage", QStringLiteral(
"working_with_raster/raster_properties.html#histogram-properties" ) );
527 mOptsPage_Rendering->setProperty(
"helpPage", QStringLiteral(
"working_with_raster/raster_properties.html#rendering-properties" ) );
529 if ( mOptsPage_Pyramids )
530 mOptsPage_Pyramids->setProperty(
"helpPage", QStringLiteral(
"working_with_raster/raster_properties.html#pyramids-properties" ) );
532 mOptsPage_Metadata->setProperty(
"helpPage", QStringLiteral(
"working_with_raster/raster_properties.html#metadata-properties" ) );
533 mOptsPage_Legend->setProperty(
"helpPage", QStringLiteral(
"working_with_raster/raster_properties.html#legend-properties" ) );
534 mOptsPage_Server->setProperty(
"helpPage", QStringLiteral(
"working_with_raster/raster_properties.html#server-properties" ) );
549 mLayerPropertiesPages << page;
552 if ( beforePage.isEmpty() )
570 void QgsRasterLayerProperties::setRendererWidget(
const QString &rendererName )
583 opacity = oldRenderer->
opacity();
592 QgsDebugMsgLevel( QStringLiteral(
"renderer has widgetCreateFunction" ), 3 );
595 if ( oldWidget && ( !oldRenderer || rendererName != oldRenderer->
type() ) )
597 if ( rendererName == QLatin1String(
"singlebandgray" ) )
600 whileBlocking( mRasterLayer )->setDefaultContrastEnhancement();
602 else if ( rendererName == QLatin1String(
"multibandcolor" ) )
605 whileBlocking( mRasterLayer )->setDefaultContrastEnhancement();
613 mRendererStackedWidget->addWidget( mRendererWidget );
617 std::unique_ptr<QgsRasterRenderer> oldRenderer;
618 oldRenderer.reset( oldWidget->
renderer() );
619 std::unique_ptr<QgsRasterRenderer> newRenderer;
620 newRenderer.reset( mRendererWidget->
renderer() );
621 const QList<int> oldBands = oldRenderer->
usesBands();
622 const QList<int> newBands = newRenderer->usesBands();
623 if ( oldBands != newBands )
631 const int widgetIndex = mRenderTypeComboBox->findData( rendererName );
632 if ( widgetIndex != -1 )
634 mDisableRenderTypeComboBoxCurrentIndexChanged =
true;
635 mRenderTypeComboBox->setCurrentIndex( widgetIndex );
636 mDisableRenderTypeComboBoxCurrentIndexChanged =
false;
639 if ( mRendererWidget != oldWidget )
642 if ( mHistogramWidget )
648 void QgsRasterLayerProperties::sync()
652 if ( !mSourceWidget )
657 QHBoxLayout *layout =
new QHBoxLayout();
658 layout->addWidget( mSourceWidget );
659 mSourceGroupBox->setLayout( layout );
660 mSourceGroupBox->show();
664 buttonBox->button( QDialogButtonBox::Apply )->setEnabled( isValid );
665 buttonBox->button( QDialogButtonBox::Ok )->setEnabled( isValid );
680 mRasterTransparencyWidget->gboxNoDataValue->setEnabled(
false );
681 mRasterTransparencyWidget->gboxCustomTransparency->setEnabled(
false );
682 mOptionsStackedWidget->setCurrentWidget( mOptsPage_Server );
688 if ( mOptsPage_Pyramids )
690 delete mOptsPage_Pyramids;
691 mOptsPage_Pyramids =
nullptr;
697 if ( mOptsPage_Histogram )
699 delete mOptsPage_Histogram;
700 mOptsPage_Histogram =
nullptr;
701 delete mHistogramWidget;
702 mHistogramWidget =
nullptr;
714 if ( brightnessFilter )
716 mSliderBrightness->setValue( brightnessFilter->
brightness() );
717 mSliderContrast->setValue( brightnessFilter->
contrast() );
718 mGammaSpinBox->setValue( brightnessFilter->
gamma() );
724 if ( hueSaturationFilter )
726 sliderSaturation->setValue( hueSaturationFilter->
saturation() );
727 comboGrayscale->setCurrentIndex( (
int ) hueSaturationFilter->
grayscaleMode() );
730 toggleSaturationControls(
static_cast<int>( hueSaturationFilter->
grayscaleMode() ) );
733 mColorizeCheck->setChecked( hueSaturationFilter->
colorizeOn() );
734 btnColorizeColor->setColor( hueSaturationFilter->
colorizeColor() );
735 toggleColorizeControls( hueSaturationFilter->
colorizeOn() );
736 sliderColorizeStrength->setValue( hueSaturationFilter->
colorizeStrength() );
737 mInvertColorsCheck->setChecked( hueSaturationFilter->
invertColors() );
750 mLayerOrigNameLineEd->setText( mRasterLayer->
name() );
757 updateInformationContent();
760 mLayerShortNameLineEdit->setText( mRasterLayer->
shortName() );
763 mLayerShortNameLineEdit->setValidator( shortNameValidator );
766 mLayerTitleLineEdit->setText( mRasterLayer->
title() );
767 mLayerAbstractTextEdit->setPlainText( mRasterLayer->
abstract() );
768 mLayerKeywordListLineEdit->setText( mRasterLayer->
keywordList() );
769 mLayerDataUrlLineEdit->setText( mRasterLayer->
dataUrl() );
770 mLayerDataUrlFormatComboBox->setCurrentIndex(
771 mLayerDataUrlFormatComboBox->findText(
777 mLayerAttributionLineEdit->setText( mRasterLayer->
attribution() );
778 mLayerAttributionUrlLineEdit->setText( mRasterLayer->
attributionUrl() );
784 const int row = mMetadataUrlModel->rowCount();
785 mMetadataUrlModel->setItem( row, 0,
new QStandardItem( metaUrl.url ) );
786 mMetadataUrlModel->setItem( row, 1,
new QStandardItem( metaUrl.type ) );
787 mMetadataUrlModel->setItem( row, 2,
new QStandardItem( metaUrl.format ) );
791 mLayerLegendUrlLineEdit->setText( mRasterLayer->
legendUrl() );
792 mLayerLegendUrlFormatComboBox->setCurrentIndex( mLayerLegendUrlFormatComboBox->findText( mRasterLayer->
legendUrlFormat() ) );
795 QVariant wmsPrintLayer = mRasterLayer->
customProperty( QStringLiteral(
"WMSPrintLayer" ) );
796 if ( wmsPrintLayer.isValid() )
798 mWMSPrintLayerLineEdit->setText( wmsPrintLayer.toString() );
801 QVariant wmsPublishDataSourceUrl = mRasterLayer->
customProperty( QStringLiteral(
"WMSPublishDataSourceUrl" ),
false );
802 mPublishDataSourceUrlCheckBox->setChecked( wmsPublishDataSourceUrl.toBool() );
804 QVariant wmsBackgroundLayer = mRasterLayer->
customProperty( QStringLiteral(
"WMSBackgroundLayer" ),
false );
805 mBackgroundLayerCheckBox->setChecked( wmsBackgroundLayer.toBool() );
807 mLegendPlaceholderWidget->setLastPathSettingsKey( QStringLiteral(
"lastLegendPlaceholderDir" ) );
809 mLegendConfigEmbeddedWidget->setLayer( mRasterLayer );
814 updateDataDefinedButtons();
818 page->syncToLayer( mRasterLayer );
823 void QgsRasterLayerProperties::apply()
827 const QString newSource = mSourceWidget->
sourceUri();
828 if ( newSource != mRasterLayer->
source() )
835 if ( !mRasterLayer->
isValid() )
849 mLegendConfigEmbeddedWidget->applyToLayer();
870 if (
"" != mRasterTransparencyWidget->leNoDataValue->text() )
872 bool myDoubleOk =
false;
877 myNoDataRangeList << myNoDataRange;
880 for (
int bandNo = 1; bandNo <= mRasterLayer->
dataProvider()->bandCount(); bandNo++ )
888 if ( rendererWidget )
895 mBackupCrs = mRasterLayer->
crs();
897 mMetadataFilled =
false;
901 if ( rasterRenderer )
903 rasterRenderer->
setAlphaBand( mRasterTransparencyWidget->cboxTransparencyBand->currentBand() );
904 rasterRenderer->
setNodataColor( mRasterTransparencyWidget->mNodataColorButton->color() );
908 if ( mRasterTransparencyWidget->tableTransparency->columnCount() == 4 )
911 QList<QgsRasterTransparency::TransparentThreeValuePixel> myTransparentThreeValuePixelList;
912 for (
int myListRunner = 0; myListRunner < mRasterTransparencyWidget->tableTransparency->rowCount(); myListRunner++ )
914 myTransparentPixel.
red = transparencyCellValue( myListRunner, 0 );
915 myTransparentPixel.
green = transparencyCellValue( myListRunner, 1 );
916 myTransparentPixel.
blue = transparencyCellValue( myListRunner, 2 );
918 myTransparentThreeValuePixelList.append( myTransparentPixel );
922 else if ( mRasterTransparencyWidget->tableTransparency->columnCount() == 3 )
925 QList<QgsRasterTransparency::TransparentSingleValuePixel> myTransparentSingleValuePixelList;
926 for (
int myListRunner = 0; myListRunner < mRasterTransparencyWidget->tableTransparency->rowCount(); myListRunner++ )
928 myTransparentPixel.
min = transparencyCellValue( myListRunner, 0 );
929 myTransparentPixel.
max = transparencyCellValue( myListRunner, 1 );
932 myTransparentSingleValuePixelList.append( myTransparentPixel );
943 rasterRenderer->
setOpacity( mRasterTransparencyWidget->mOpacityWidget->opacity() );
950 mRasterLayer->
setName( mLayerOrigNameLineEd->text() );
965 mResamplingUtils.refreshLayerFromWidgets();
969 if ( hueSaturationFilter )
971 hueSaturationFilter->
setSaturation( sliderSaturation->value() );
973 hueSaturationFilter->
setColorizeOn( mColorizeCheck->checkState() );
976 hueSaturationFilter->
setInvertColors( mInvertColorsCheck->isChecked() );
980 mRasterLayer->
setBlendMode( mBlendModeComboBox->blendMode() );
985 mRasterLayer->
setCrs( mCrsSelector->crs() );
987 if ( mRasterLayer->
shortName() != mLayerShortNameLineEdit->text() )
988 mMetadataFilled =
false;
989 mRasterLayer->
setShortName( mLayerShortNameLineEdit->text() );
991 if ( mRasterLayer->
title() != mLayerTitleLineEdit->text() )
992 mMetadataFilled =
false;
993 mRasterLayer->
setTitle( mLayerTitleLineEdit->text() );
995 if ( mRasterLayer->
abstract() != mLayerAbstractTextEdit->toPlainText() )
996 mMetadataFilled =
false;
997 mRasterLayer->
setAbstract( mLayerAbstractTextEdit->toPlainText() );
999 if ( mRasterLayer->
keywordList() != mLayerKeywordListLineEdit->text() )
1000 mMetadataFilled =
false;
1001 mRasterLayer->
setKeywordList( mLayerKeywordListLineEdit->text() );
1003 if ( mRasterLayer->
dataUrl() != mLayerDataUrlLineEdit->text() )
1004 mMetadataFilled =
false;
1005 mRasterLayer->
setDataUrl( mLayerDataUrlLineEdit->text() );
1007 if ( mRasterLayer->
dataUrlFormat() != mLayerDataUrlFormatComboBox->currentText() )
1008 mMetadataFilled =
false;
1009 mRasterLayer->
setDataUrlFormat( mLayerDataUrlFormatComboBox->currentText() );
1012 if ( mRasterLayer->
attribution() != mLayerAttributionLineEdit->text() )
1013 mMetadataFilled =
false;
1014 mRasterLayer->
setAttribution( mLayerAttributionLineEdit->text() );
1016 if ( mRasterLayer->
attributionUrl() != mLayerAttributionUrlLineEdit->text() )
1017 mMetadataFilled =
false;
1021 QList<QgsMapLayerServerProperties::MetadataUrl> metaUrls;
1022 for (
int row = 0; row < mMetadataUrlModel->rowCount() ; row++ )
1025 metaUrl.
url = mMetadataUrlModel->item( row, 0 )->text();
1026 metaUrl.
type = mMetadataUrlModel->item( row, 1 )->text();
1027 metaUrl.
format = mMetadataUrlModel->item( row, 2 )->text();
1028 metaUrls.append( metaUrl );
1029 mMetadataFilled =
false;
1033 if ( mRasterLayer->
legendUrl() != mLayerLegendUrlLineEdit->text() )
1034 mMetadataFilled =
false;
1035 mRasterLayer->
setLegendUrl( mLayerLegendUrlLineEdit->text() );
1037 if ( mRasterLayer->
legendUrlFormat() != mLayerLegendUrlFormatComboBox->currentText() )
1038 mMetadataFilled =
false;
1041 if ( !mWMSPrintLayerLineEdit->text().isEmpty() )
1043 mRasterLayer->
setCustomProperty( QStringLiteral(
"WMSPrintLayer" ), mWMSPrintLayerLineEdit->text() );
1046 mRasterLayer->
setCustomProperty(
"WMSPublishDataSourceUrl", mPublishDataSourceUrlCheckBox->isChecked() );
1047 mRasterLayer->
setCustomProperty(
"WMSBackgroundLayer", mBackgroundLayerCheckBox->isChecked() );
1061 void QgsRasterLayerProperties::buttonBuildPyramids_clicked()
1073 for (
int myCounterInt = 0; myCounterInt < lbxPyramidResolutions->count(); myCounterInt++ )
1075 QListWidgetItem *myItem = lbxPyramidResolutions->item( myCounterInt );
1077 myPyramidList[myCounterInt].setBuild( myItem->isSelected() || myPyramidList[myCounterInt].getExists() );
1081 QString prefix = provider->
name() +
"/driverOptions/_pyramids/";
1083 QString resamplingMethod( cboResamplingMethod->currentData().toString() );
1084 mySettings.
setValue( prefix +
"resampling", resamplingMethod );
1091 QApplication::setOverrideCursor( Qt::WaitCursor );
1098 QApplication::restoreOverrideCursor();
1099 mPyramidProgress->setValue( 0 );
1100 buttonBuildPyramids->setEnabled(
false );
1101 if ( !res.isNull() )
1103 if ( res == QLatin1String(
"CANCELED" ) )
1107 else if ( res == QLatin1String(
"ERROR_WRITE_ACCESS" ) )
1109 QMessageBox::warning(
this, tr(
"Building Pyramids" ),
1110 tr(
"Write access denied. Adjust the file permissions and try again." ) );
1112 else if ( res == QLatin1String(
"ERROR_WRITE_FORMAT" ) )
1114 QMessageBox::warning(
this, tr(
"Building Pyramids" ),
1115 tr(
"The file was not writable. Some formats do not "
1116 "support pyramid overviews. Consult the GDAL documentation if in doubt." ) );
1118 else if ( res == QLatin1String(
"FAILED_NOT_SUPPORTED" ) )
1120 QMessageBox::warning(
this, tr(
"Building Pyramids" ),
1121 tr(
"Building pyramid overviews is not supported on this type of raster." ) );
1123 else if ( res == QLatin1String(
"ERROR_JPEG_COMPRESSION" ) )
1125 QMessageBox::warning(
this, tr(
"Building Pyramids" ),
1126 tr(
"Building internal pyramid overviews is not supported on raster layers with JPEG compression and your current libtiff library." ) );
1128 else if ( res == QLatin1String(
"ERROR_VIRTUAL" ) )
1130 QMessageBox::warning(
this, tr(
"Building Pyramids" ),
1131 tr(
"Building pyramid overviews is not supported on this type of raster." ) );
1139 lbxPyramidResolutions->clear();
1147 if ( pyramid.getExists() )
1149 lbxPyramidResolutions->addItem(
new QListWidgetItem( myPyramidPixmap,
1150 QString::number( pyramid.getXDim() ) + QStringLiteral(
" x " ) +
1151 QString::number( pyramid.getYDim() ) ) );
1155 lbxPyramidResolutions->addItem(
new QListWidgetItem( myNoPyramidPixmap,
1156 QString::number( pyramid.getXDim() ) + QStringLiteral(
" x " ) +
1157 QString::number( pyramid.getYDim() ) ) );
1166 updateInformationContent();
1169 void QgsRasterLayerProperties::urlClicked(
const QUrl &url )
1171 QFileInfo file( url.toLocalFile() );
1172 if ( file.exists() && !file.isDir() )
1175 QDesktopServices::openUrl( url );
1178 void QgsRasterLayerProperties::mRenderTypeComboBox_currentIndexChanged(
int index )
1180 if ( index < 0 || mDisableRenderTypeComboBoxCurrentIndexChanged || ! mRasterLayer->renderer() )
1185 QString rendererName = mRenderTypeComboBox->itemData( index ).toString();
1186 setRendererWidget( rendererName );
1196 void QgsRasterLayerProperties::setTransparencyCell(
int row,
int column,
double value )
1198 QgsDebugMsgLevel( QStringLiteral(
"value = %1" ).arg( value, 0,
'g', 17 ), 3 );
1200 if ( !provider )
return;
1203 if ( !renderer )
return;
1204 int nBands = renderer->
usesBands().size();
1206 QLineEdit *lineEdit =
new QLineEdit();
1207 lineEdit->setFrame(
false );
1209 lineEdit->setContentsMargins( 1, 1, 1, 1 );
1211 if ( column == mRasterTransparencyWidget->tableTransparency->columnCount() - 1 )
1215 lineEdit->setValidator(
new QIntValidator(
nullptr ) );
1216 lineEdit->setText( QString::number(
static_cast<int>( value ) ) );
1221 QString valueString;
1227 if ( !std::isnan( value ) )
1230 valueString = QLocale().toString( v,
'g' ) ;
1234 lineEdit->setValidator(
new QIntValidator(
nullptr ) );
1235 if ( !std::isnan( value ) )
1237 valueString = QLocale().toString(
static_cast<int>( value ) );
1241 lineEdit->setText( valueString );
1243 mRasterTransparencyWidget->tableTransparency->setCellWidget( row, column, lineEdit );
1244 adjustTransparencyCellWidth( row, column );
1246 if ( nBands == 1 && ( column == 0 || column == 1 ) )
1248 connect( lineEdit, &QLineEdit::textEdited,
this, &QgsRasterLayerProperties::transparencyCellTextEdited );
1250 mRasterTransparencyWidget->tableTransparency->resizeColumnsToContents();
1253 void QgsRasterLayerProperties::setTransparencyCellValue(
int row,
int column,
double value )
1255 QLineEdit *lineEdit =
dynamic_cast<QLineEdit *
>( mRasterTransparencyWidget->tableTransparency->cellWidget( row, column ) );
1256 if ( !lineEdit )
return;
1258 lineEdit->setText( QLocale().toString( v,
'g' ) );
1259 lineEdit->adjustSize();
1260 adjustTransparencyCellWidth( row, column );
1261 mRasterTransparencyWidget->tableTransparency->resizeColumnsToContents();
1264 double QgsRasterLayerProperties::transparencyCellValue(
int row,
int column )
1266 QLineEdit *lineEdit =
dynamic_cast<QLineEdit *
>( mRasterTransparencyWidget->tableTransparency->cellWidget( row, column ) );
1267 if ( !lineEdit || lineEdit->text().isEmpty() )
1269 return std::numeric_limits<double>::quiet_NaN();
1271 return QLocale().toDouble( lineEdit->text() );
1274 void QgsRasterLayerProperties::adjustTransparencyCellWidth(
int row,
int column )
1276 QLineEdit *lineEdit =
dynamic_cast<QLineEdit *
>( mRasterTransparencyWidget->tableTransparency->cellWidget( row, column ) );
1277 if ( !lineEdit )
return;
1279 int width = std::max( lineEdit->fontMetrics().boundingRect( lineEdit->text() ).width() + 10, 100 );
1280 width = std::max( width, mRasterTransparencyWidget->tableTransparency->columnWidth( column ) );
1282 lineEdit->setFixedWidth( width );
1285 void QgsRasterLayerProperties::transparencyCellTextEdited(
const QString &text )
1294 int nBands = renderer->
usesBands().size();
1297 QLineEdit *lineEdit = qobject_cast<QLineEdit *>( sender() );
1298 if ( !lineEdit )
return;
1301 for (
int r = 0; r < mRasterTransparencyWidget->tableTransparency->rowCount(); r++ )
1303 for (
int c = 0;
c < mRasterTransparencyWidget->tableTransparency->columnCount();
c++ )
1305 if ( mRasterTransparencyWidget->tableTransparency->cellWidget( r,
c ) == sender() )
1312 if ( row != -1 )
break;
1314 QgsDebugMsgLevel( QStringLiteral(
"row = %1 column =%2" ).arg( row ).arg( column ), 3 );
1318 QLineEdit *toLineEdit =
dynamic_cast<QLineEdit *
>( mRasterTransparencyWidget->tableTransparency->cellWidget( row, 1 ) );
1319 if ( !toLineEdit )
return;
1320 bool toChanged = mTransparencyToEdited.value( row );
1321 QgsDebugMsgLevel( QStringLiteral(
"toChanged = %1" ).arg( toChanged ), 3 );
1324 toLineEdit->setText( lineEdit->text() );
1327 else if ( column == 1 )
1329 setTransparencyToEdited( row );
1334 void QgsRasterLayerProperties::aboutToShowStyleMenu()
1338 QMenu *m = qobject_cast<QMenu *>( sender() );
1346 void QgsRasterLayerProperties::syncToLayer()
1351 setRendererWidget( renderer->
type() );
1357 void QgsRasterLayerProperties::setTransparencyToEdited(
int row )
1359 if ( row >= mTransparencyToEdited.size() )
1361 mTransparencyToEdited.resize( row + 1 );
1363 mTransparencyToEdited[row] =
true;
1370 bool isMetadataPanel = ( index ==
mOptStackedWidget->indexOf( mOptsPage_Metadata ) );
1371 mBtnStyle->setVisible( ! isMetadataPanel );
1372 mBtnMetadata->setVisible( isMetadataPanel );
1374 if ( !mHistogramWidget )
1386 if ( index ==
mOptStackedWidget->indexOf( mOptsPage_Information ) || !mMetadataFilled )
1389 updateInformationContent();
1395 button->blockSignals(
true );
1399 button->blockSignals(
false );
1402 void QgsRasterLayerProperties::updateDataDefinedButtons()
1404 const auto propertyOverrideButtons { findChildren< QgsPropertyOverrideButton * >() };
1407 updateDataDefinedButton( button );
1423 void QgsRasterLayerProperties::updateProperty()
1430 void QgsRasterLayerProperties::toggleSaturationControls(
int grayscaleMode )
1433 if ( grayscaleMode == 0 )
1435 sliderSaturation->setEnabled(
true );
1436 spinBoxSaturation->setEnabled(
true );
1440 sliderSaturation->setEnabled(
false );
1441 spinBoxSaturation->setEnabled(
false );
1445 void QgsRasterLayerProperties::toggleColorizeControls(
bool colorizeEnabled )
1448 btnColorizeColor->setEnabled( colorizeEnabled );
1449 sliderColorizeStrength->setEnabled( colorizeEnabled );
1450 spinColorizeStrength->setEnabled( colorizeEnabled );
1454 QLinearGradient QgsRasterLayerProperties::redGradient()
1458 QLinearGradient myGradient = QLinearGradient( mGradientWidth, 0, mGradientWidth, mGradientHeight );
1459 myGradient.setColorAt( 0.0, QColor( 242, 14, 25, 190 ) );
1460 myGradient.setColorAt( 0.5, QColor( 175, 29, 37, 190 ) );
1461 myGradient.setColorAt( 1.0, QColor( 114, 17, 22, 190 ) );
1464 QLinearGradient QgsRasterLayerProperties::greenGradient()
1468 QLinearGradient myGradient = QLinearGradient( mGradientWidth, 0, mGradientWidth, mGradientHeight );
1469 myGradient.setColorAt( 0.0, QColor( 48, 168, 5, 190 ) );
1470 myGradient.setColorAt( 0.8, QColor( 36, 122, 4, 190 ) );
1471 myGradient.setColorAt( 1.0, QColor( 21, 71, 2, 190 ) );
1474 QLinearGradient QgsRasterLayerProperties::blueGradient()
1478 QLinearGradient myGradient = QLinearGradient( mGradientWidth, 0, mGradientWidth, mGradientHeight );
1479 myGradient.setColorAt( 0.0, QColor( 30, 0, 106, 190 ) );
1480 myGradient.setColorAt( 0.2, QColor( 30, 72, 128, 190 ) );
1481 myGradient.setColorAt( 1.0, QColor( 30, 223, 196, 190 ) );
1484 QLinearGradient QgsRasterLayerProperties::grayGradient()
1488 QLinearGradient myGradient = QLinearGradient( mGradientWidth, 0, mGradientWidth, mGradientHeight );
1489 myGradient.setColorAt( 0.0, QColor( 5, 5, 5, 190 ) );
1490 myGradient.setColorAt( 0.8, QColor( 122, 122, 122, 190 ) );
1491 myGradient.setColorAt( 1.0, QColor( 220, 220, 220, 190 ) );
1494 QLinearGradient QgsRasterLayerProperties::highlightGradient()
1498 QLinearGradient myGradient = QLinearGradient( mGradientWidth, 0, mGradientWidth, mGradientHeight );
1499 myGradient.setColorAt( 1.0, QColor( 255, 255, 255, 50 ) );
1500 myGradient.setColorAt( 0.5, QColor( 255, 255, 255, 100 ) );
1501 myGradient.setColorAt( 0.0, QColor( 255, 255, 255, 150 ) );
1505 void QgsRasterLayerProperties::addMetadataUrl()
1507 const int row = mMetadataUrlModel->rowCount();
1508 mMetadataUrlModel->setItem( row, 0,
new QStandardItem( QLatin1String() ) );
1509 mMetadataUrlModel->setItem( row, 1,
new QStandardItem( QLatin1String() ) );
1510 mMetadataUrlModel->setItem( row, 2,
new QStandardItem( QLatin1String() ) );
1513 void QgsRasterLayerProperties::removeSelectedMetadataUrl()
1515 const QModelIndexList selectedRows = tableViewMetadataUrl->selectionModel()->selectedRows();
1516 if ( selectedRows.empty() )
1518 mMetadataUrlModel->removeRow( selectedRows[0].row() );
1527 void QgsRasterLayerProperties::loadDefaultStyle_clicked()
1529 bool defaultLoadedFlag =
false;
1532 if ( defaultLoadedFlag )
1539 QMessageBox::information(
this,
1540 tr(
"Default Style" ),
1546 void QgsRasterLayerProperties::saveDefaultStyle_clicked()
1552 bool defaultSavedFlag =
false;
1556 if ( !defaultSavedFlag )
1559 QMessageBox::information(
this,
1560 tr(
"Default Style" ),
1567 void QgsRasterLayerProperties::loadStyle_clicked()
1570 QString lastUsedDir = settings.
value( QStringLiteral(
"style/lastStyleDir" ), QDir::homePath() ).toString();
1572 QString fileName = QFileDialog::getOpenFileName(
1574 tr(
"Load layer properties from style file" ),
1576 tr(
"QGIS Layer Style File" ) +
" (*.qml)" );
1577 if ( fileName.isEmpty() )
1581 if ( !fileName.endsWith( QLatin1String(
".qml" ), Qt::CaseInsensitive ) )
1582 fileName += QLatin1String(
".qml" );
1586 bool defaultLoadedFlag =
false;
1587 QString message = mRasterLayer->
loadNamedStyle( fileName, defaultLoadedFlag );
1588 if ( defaultLoadedFlag )
1590 settings.
setValue( QStringLiteral(
"style/lastStyleDir" ), QFileInfo( fileName ).absolutePath() );
1595 QMessageBox::information(
this, tr(
"Save Style" ), message );
1600 void QgsRasterLayerProperties::saveStyleAs_clicked()
1603 QString lastUsedDir = settings.
value( QStringLiteral(
"style/lastStyleDir" ), QDir::homePath() ).toString();
1605 QString selectedFilter;
1606 QString outputFileName = QFileDialog::getSaveFileName(
1608 tr(
"Save layer properties as style file" ),
1610 tr(
"QGIS Layer Style File" ) +
" (*.qml)" +
";;" + tr(
"Styled Layer Descriptor" ) +
" (*.sld)",
1612 if ( outputFileName.isEmpty() )
1617 if ( selectedFilter.contains( QStringLiteral(
".qml" ), Qt::CaseInsensitive ) )
1620 type = StyleType::QML;
1625 type = StyleType::SLD;
1631 bool defaultLoadedFlag =
false;
1637 message = mRasterLayer->
saveNamedStyle( outputFileName, defaultLoadedFlag );
1642 message = mRasterLayer->
saveSldStyle( outputFileName, defaultLoadedFlag );
1646 if ( defaultLoadedFlag )
1648 settings.
setValue( QStringLiteral(
"style/lastStyleDir" ), QFileInfo( outputFileName ).absolutePath() );
1652 QMessageBox::information(
this, tr(
"Save Style" ), message );
1655 void QgsRasterLayerProperties::restoreWindowModality()
1670 void QgsRasterLayerProperties::loadMetadata()
1673 QString myLastUsedDir = myQSettings.
value( QStringLiteral(
"style/lastStyleDir" ), QDir::homePath() ).toString();
1675 QString myFileName = QFileDialog::getOpenFileName(
this, tr(
"Load layer metadata from metadata file" ), myLastUsedDir,
1676 tr(
"QGIS Layer Metadata File" ) +
" (*.qmd)" );
1677 if ( myFileName.isNull() )
1683 bool defaultLoadedFlag =
false;
1687 if ( defaultLoadedFlag )
1694 QMessageBox::warning(
this, tr(
"Load Metadata" ), myMessage );
1697 QFileInfo myFI( myFileName );
1698 QString myPath = myFI.path();
1699 myQSettings.
setValue( QStringLiteral(
"style/lastStyleDir" ), myPath );
1704 void QgsRasterLayerProperties::saveMetadataAs()
1707 QString myLastUsedDir = myQSettings.
value( QStringLiteral(
"style/lastStyleDir" ), QDir::homePath() ).toString();
1709 QString myOutputFileName = QFileDialog::getSaveFileName(
this, tr(
"Save Layer Metadata as QMD" ),
1710 myLastUsedDir, tr(
"QMD File" ) +
" (*.qmd)" );
1711 if ( myOutputFileName.isNull() )
1724 bool defaultLoadedFlag =
false;
1725 QString message = mRasterLayer->
saveNamedMetadata( myOutputFileName, defaultLoadedFlag );
1726 if ( defaultLoadedFlag )
1727 myQSettings.
setValue( QStringLiteral(
"style/lastStyleDir" ), QFileInfo( myOutputFileName ).absolutePath() );
1729 QMessageBox::information(
this, tr(
"Save Metadata" ), message );
1732 void QgsRasterLayerProperties::saveDefaultMetadata()
1736 bool defaultSavedFlag =
false;
1738 if ( !defaultSavedFlag )
1740 QMessageBox::warning(
this, tr(
"Default Metadata" ), errorMsg );
1744 void QgsRasterLayerProperties::loadDefaultMetadata()
1746 bool defaultLoadedFlag =
false;
1749 if ( defaultLoadedFlag )
1755 QMessageBox::information(
this, tr(
"Default Metadata" ), myMessage );
1760 void QgsRasterLayerProperties::toggleBuildPyramidsButton()
1762 if ( lbxPyramidResolutions->selectedItems().empty() )
1764 buttonBuildPyramids->setEnabled(
false );
1768 buttonBuildPyramids->setEnabled(
true );
1772 void QgsRasterLayerProperties::mResetColorRenderingBtn_clicked()
1774 mBlendModeComboBox->setBlendMode( QPainter::CompositionMode_SourceOver );
1775 mSliderBrightness->setValue( 0 );
1776 mSliderContrast->setValue( 0 );
1777 mGammaSpinBox->setValue( 1.0 );
1778 sliderSaturation->setValue( 0 );
1780 mColorizeCheck->setChecked(
false );
1781 sliderColorizeStrength->setValue( 100 );
1782 mInvertColorsCheck->setChecked(
false );
1785 bool QgsRasterLayerProperties::rasterIsMultiBandColor()
1790 void QgsRasterLayerProperties::updateInformationContent()
1794 const QString html { mRasterLayer->
htmlMetadata().replace( QLatin1String(
"<head>" ), QStringLiteral( R
"raw(<head><style type="text/css">%1</style>)raw" ) ).arg( myStyle ) };
1795 mMetadataViewer->setHtml( html );
1796 mMetadataFilled = true;
1799 void QgsRasterLayerProperties::onCancel()
1805 QDomDocument doc( QStringLiteral(
"qgis" ) );
1806 int errorLine, errorColumn;
1807 doc.setContent( mOldStyle.
xmlData(),
false, &myMessage, &errorLine, &errorColumn );
1811 if ( mBackupCrs != mRasterLayer->
crs() )
1812 mRasterLayer->
setCrs( mBackupCrs );
1815 void QgsRasterLayerProperties::showHelp()
1817 const QVariant helpPage = mOptionsStackedWidget->currentWidget()->property(
"helpPage" );
1819 if ( helpPage.isValid() )
1825 QgsHelp::openHelp( QStringLiteral(
"working_with_raster/raster_properties.html" ) );
1829 void QgsRasterLayerProperties::updateGammaSpinBox(
int value )
1834 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 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 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", 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