From bb6009260c86e54b673b22f05e666c9305ad8e52 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Tue, 9 Feb 2021 10:34:56 +1000 Subject: [PATCH] Fix setting the current GDAL profile options temporarily overwrites the definition of one of the stored GDAL profiles Fixes #41378 Fixes #40235 (cherry picked from commit 7454a0e0dbcc9d27403bf05c8dee680fbc614e0d) --- src/gui/qgsrasterformatsaveoptionswidget.cpp | 23 +++++++++++++------- src/gui/qgsrasterformatsaveoptionswidget.h | 1 + 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/gui/qgsrasterformatsaveoptionswidget.cpp b/src/gui/qgsrasterformatsaveoptionswidget.cpp index 773f23d2f93e..c5eb665e554c 100644 --- a/src/gui/qgsrasterformatsaveoptionswidget.cpp +++ b/src/gui/qgsrasterformatsaveoptionswidget.cpp @@ -217,6 +217,7 @@ void QgsRasterFormatSaveOptionsWidget::updateProfiles() void QgsRasterFormatSaveOptionsWidget::updateOptions() { + mBlockOptionUpdates++; QString myOptions = mOptionsMap.value( currentProfileKey() ); QStringList myOptionsList = myOptions.trimmed().split( ' ', QString::SkipEmptyParts ); @@ -248,6 +249,7 @@ void QgsRasterFormatSaveOptionsWidget::updateOptions() mOptionsLineEdit->setCursorPosition( 0 ); } + mBlockOptionUpdates--; emit optionsChanged(); } @@ -363,6 +365,9 @@ QString QgsRasterFormatSaveOptionsWidget::validateOptions( bool gui, bool report void QgsRasterFormatSaveOptionsWidget::optionsTableChanged() { + if ( mBlockOptionUpdates ) + return; + QTableWidgetItem *key, *value; QString options; for ( int i = 0; i < mOptionsTable->rowCount(); i++ ) @@ -591,30 +596,32 @@ void QgsRasterFormatSaveOptionsWidget::showEvent( QShowEvent *event ) void QgsRasterFormatSaveOptionsWidget::setOptions( const QString &options ) { - mOptionsTable->blockSignals( true ); + mBlockOptionUpdates++; mOptionsTable->clearContents(); - QStringList values; - QStringList optionsList = options.trimmed().split( ' ', QString::SkipEmptyParts ); - const auto constOptionsList = optionsList; - for ( const QString &opt : constOptionsList ) + const QStringList optionsList = options.trimmed().split( ' ', QString::SkipEmptyParts ); + for ( const QString &opt : optionsList ) { int rowCount = mOptionsTable->rowCount(); mOptionsTable->insertRow( rowCount ); - values = opt.split( '=' ); + const QStringList values = opt.split( '=' ); if ( values.count() == 2 ) { QTableWidgetItem *nameItem = new QTableWidgetItem( values.at( 0 ) ); mOptionsTable->setItem( rowCount, 0, nameItem ); QTableWidgetItem *valueItem = new QTableWidgetItem( values.at( 1 ) ); - mOptionsTable->setItem( rowCount, 0, valueItem ); + mOptionsTable->setItem( rowCount, 1, valueItem ); } } + // reset to no profile index, otherwise we are changing the definition of whichever profile + // is currently selected... + mProfileComboBox->setCurrentIndex( 0 ); + mOptionsMap[ currentProfileKey()] = options.trimmed(); mOptionsLineEdit->setText( options.trimmed() ); mOptionsLineEdit->setCursorPosition( 0 ); - mOptionsTable->blockSignals( false ); + mBlockOptionUpdates--; } diff --git a/src/gui/qgsrasterformatsaveoptionswidget.h b/src/gui/qgsrasterformatsaveoptionswidget.h index be2a651833f6..410e87a2fe34 100644 --- a/src/gui/qgsrasterformatsaveoptionswidget.h +++ b/src/gui/qgsrasterformatsaveoptionswidget.h @@ -145,6 +145,7 @@ class GUI_EXPORT QgsRasterFormatSaveOptionsWidget: public QWidget, private Ui::Q static QMap< QString, QStringList > sBuiltinProfiles; bool mPyramids = false; QgsRaster::RasterPyramidsFormat mPyramidsFormat = QgsRaster::PyramidsGTiff; + int mBlockOptionUpdates = 0; QString settingsKey( QString profile ) const SIP_FORCE; QString currentProfileKey() const SIP_FORCE;