From c93258e2b92aa87d0b20f35a96c2236790ffab7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Germ=C3=A1n=20Carrillo?= Date: Fri, 15 Mar 2024 16:28:59 +0100 Subject: [PATCH 01/11] Export DXF Export dialog's settings to XML file --- src/app/qgsdxfexportdialog.cpp | 134 +++++++++++++++++++++++++++++++++ src/app/qgsdxfexportdialog.h | 6 ++ 2 files changed, 140 insertions(+) diff --git a/src/app/qgsdxfexportdialog.cpp b/src/app/qgsdxfexportdialog.cpp index ff9f1cc5e5a2..53c04da438cf 100644 --- a/src/app/qgsdxfexportdialog.cpp +++ b/src/app/qgsdxfexportdialog.cpp @@ -33,6 +33,7 @@ #include #include +#include const int LAYER_COL = 0; const int OUTPUT_LAYER_ATTRIBUTE_COL = 1; @@ -731,6 +732,13 @@ QgsDxfExportDialog::QgsDxfExportDialog( QWidget *parent, Qt::WindowFlags f ) mEncoding->addItems( QgsDxfExport::encodings() ); mEncoding->setCurrentIndex( mEncoding->findText( QgsProject::instance()->readEntry( QStringLiteral( "dxf" ), QStringLiteral( "/lastDxfEncoding" ), settings.value( QStringLiteral( "qgis/lastDxfEncoding" ), "CP1252" ).toString() ) ) ); + mBtnLoadSaveSettings = new QPushButton( tr( "Settings" ), this ); + QMenu *menuSettings = new QMenu( this ); + menuSettings->addAction( tr( "Load Settings from File…" ), this, &QgsDxfExportDialog::loadSettingsFromFile ); + menuSettings->addAction( tr( "Save Settings to File…" ), this, &QgsDxfExportDialog::saveSettingsToFile ); + mBtnLoadSaveSettings->setMenu( menuSettings ); + buttonBox->addButton( mBtnLoadSaveSettings, QDialogButtonBox::ResetRole ); + mModel->loadLayersOutputAttribute( mModel->rootGroup() ); } @@ -797,6 +805,132 @@ void QgsDxfExportDialog::deselectDataDefinedBlocks() } +void QgsDxfExportDialog::loadSettingsFromFile() +{ + +} + + +void QgsDxfExportDialog::saveSettingsToFile() +{ + QgsSettings settings; + const QString lastUsedDir = settings.value( QStringLiteral( "dxf/lastSettingsDir" ), QDir::homePath() ).toString(); + + QString outputFileName = QFileDialog::getSaveFileName( this, tr( "Save DXF Export settings as XML" ), + lastUsedDir, tr( "XML file" ) + " (*.xml)" ); + // return dialog focus on Mac + activateWindow(); + raise(); + if ( outputFileName.isEmpty() ) + { + return; + } + + //ensure the user never omitted the extension from the file name + if ( !outputFileName.endsWith( QStringLiteral( ".xml" ), Qt::CaseInsensitive ) ) + { + outputFileName += QStringLiteral( ".xml" ); + } + + QString myErrorMessage; + QDomDocument myDocument; + + saveSettingsToXML( myDocument ); + + const QFileInfo myFileInfo( outputFileName ); + const QFileInfo myDirInfo( myFileInfo.path() ); //excludes file name + if ( !myDirInfo.isWritable() ) + { + QMessageBox::information( this, tr( "Save DXF settings" ), tr( "The directory containing your dataset needs to be writable!" ) ); + return; + } + + QFile myFile( outputFileName ); + if ( myFile.open( QFile::WriteOnly | QFile::Truncate ) ) + { + QTextStream myFileStream( &myFile ); + // save as utf-8 with 2 spaces for indents + myDocument.save( myFileStream, 2 ); + myFile.close(); + QMessageBox::information( this, tr( "Save DXF settings" ), tr( "Created DXF settings file as %1" ).arg( outputFileName ) ); + settings.setValue( QStringLiteral( "dxf/lastSettingsDir" ), QFileInfo( outputFileName ).absolutePath() ); + return; + } + else + { + QMessageBox::information( this, tr( "Save DXF settings" ), tr( "ERROR: Failed to created DXF Export settings file as %1. Check file permissions and retry." ).arg( outputFileName ) ); + return; + } +} + + +void QgsDxfExportDialog::saveSettingsToXML( QDomDocument &doc ) const +{ + QDomImplementation DomImplementation; + const QDomDocumentType documentType = DomImplementation.createDocumentType( QStringLiteral( "qgis" ), QStringLiteral( "http://mrcc.com/qgis.dtd" ), QStringLiteral( "SYSTEM" ) ); + QDomDocument myDocument( documentType ); + + QDomElement myRootNode = myDocument.createElement( QStringLiteral( "qgis" ) ); + myRootNode.setAttribute( QStringLiteral( "version" ), Qgis::version() ); + myDocument.appendChild( myRootNode ); + + QDomElement symbologyModeElement = myDocument.createElement( QStringLiteral( "symbology_mode" ) ); + symbologyModeElement.appendChild( QgsXmlUtils::writeVariant( static_cast( symbologyMode() ), doc ) ); + myRootNode.appendChild( symbologyModeElement ); + + QDomElement symbologyScaleElement = myDocument.createElement( QStringLiteral( "symbology_scale" ) ); + symbologyScaleElement.appendChild( QgsXmlUtils::writeVariant( symbologyScale(), doc ) ); + myRootNode.appendChild( symbologyScaleElement ); + + QDomElement encodingElement = myDocument.createElement( QStringLiteral( "encoding" ) ); + encodingElement.appendChild( QgsXmlUtils::writeVariant( encoding(), doc ) ); + myRootNode.appendChild( encodingElement ); + + QDomElement crsElement = myDocument.createElement( QStringLiteral( "crs" ) ); + crsElement.appendChild( QgsXmlUtils::writeVariant( crs(), doc ) ); + myRootNode.appendChild( crsElement ); + + QDomElement mapThemeElement = myDocument.createElement( QStringLiteral( "map_theme" ) ); + mapThemeElement.appendChild( QgsXmlUtils::writeVariant( mapTheme(), doc ) ); + myRootNode.appendChild( mapThemeElement ); + + QDomElement layersElement = myDocument.createElement( QStringLiteral( "layers" ) ); + for ( const auto dxfLayer : layers() ) + { + QgsVectorLayer *vl = dxfLayer.layer(); + QDomElement layerElement = myDocument.createElement( QStringLiteral( "layer" ) ); + layerElement.setAttribute( QStringLiteral( "source" ), vl->source() ); + layerElement.setAttribute( QStringLiteral( "attribute-index" ), dxfLayer.layerOutputAttributeIndex() ) ; + layerElement.setAttribute( QStringLiteral( "use_symbol_blocks" ), dxfLayer.buildDataDefinedBlocks() ) ; + layerElement.setAttribute( QStringLiteral( "max_number_of_classes" ), dxfLayer.dataDefinedBlocksMaximumNumberOfClasses() ) ; + layersElement.appendChild( layerElement ); + } + myRootNode.appendChild( layersElement ); + + QDomElement titleAsNameElement = myDocument.createElement( QStringLiteral( "use_layer_title" ) ); + titleAsNameElement.appendChild( QgsXmlUtils::writeVariant( layerTitleAsName(), doc ) ); + myRootNode.appendChild( titleAsNameElement ); + + QDomElement useMapExtentElement = myDocument.createElement( QStringLiteral( "use_map_extent" ) ); + useMapExtentElement.appendChild( QgsXmlUtils::writeVariant( exportMapExtent(), doc ) ); + myRootNode.appendChild( useMapExtentElement ); + + QDomElement force2dElement = myDocument.createElement( QStringLiteral( "force_2d" ) ); + force2dElement.appendChild( QgsXmlUtils::writeVariant( force2d(), doc ) ); + myRootNode.appendChild( force2dElement ); + + QDomElement useMTextElement = myDocument.createElement( QStringLiteral( "mtext" ) ); + useMTextElement.appendChild( QgsXmlUtils::writeVariant( useMText(), doc ) ); + myRootNode.appendChild( useMTextElement ); + + QDomElement selectedFeatures = myDocument.createElement( QStringLiteral( "selected_features_only" ) ); + selectedFeatures.appendChild( QgsXmlUtils::writeVariant( selectedFeaturesOnly(), doc ) ); + myRootNode.appendChild( selectedFeatures ); + + doc = myDocument; +} + + QList< QgsDxfExport::DxfLayer > QgsDxfExportDialog::layers() const { return mModel->layers(); diff --git a/src/app/qgsdxfexportdialog.h b/src/app/qgsdxfexportdialog.h index 973bea2722c3..838fa6037723 100644 --- a/src/app/qgsdxfexportdialog.h +++ b/src/app/qgsdxfexportdialog.h @@ -24,6 +24,7 @@ #include "qgsdxfexport.h" #include "qgssettingstree.h" #include "qgssettingsentryimpl.h" +#include "qgsxmlutils.h" #include #include @@ -118,6 +119,8 @@ class QgsDxfExportDialog : public QDialog, private Ui::QgsDxfExportDialogBase QString mapTheme() const; QString encoding() const; QgsCoordinateReferenceSystem crs() const; + bool loadSettingsFromXML( QDomDocument &document ) const; + void saveSettingsToXML( QDomDocument &document ) const; public slots: //! Change the selection of layers in the list @@ -125,6 +128,8 @@ class QgsDxfExportDialog : public QDialog, private Ui::QgsDxfExportDialogBase void deSelectAll(); void selectDataDefinedBlocks(); void deselectDataDefinedBlocks(); + void loadSettingsFromFile(); + void saveSettingsToFile(); private slots: void setOkEnabled(); @@ -139,6 +144,7 @@ class QgsDxfExportDialog : public QDialog, private Ui::QgsDxfExportDialogBase FieldSelectorDelegate *mFieldSelectorDelegate = nullptr; QgsVectorLayerAndAttributeModel *mModel = nullptr; QgsDxfExportLayerTreeView *mTreeView = nullptr; + QPushButton *mBtnLoadSaveSettings = nullptr; QgsCoordinateReferenceSystem mCRS; }; From eb3b13e67b3a69ccabf33467ce8078f3264b1c55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Germ=C3=A1n=20Carrillo?= Date: Fri, 15 Mar 2024 19:54:00 +0100 Subject: [PATCH 02/11] Load DXF Export dialog's settings from XML file --- src/app/qgsdxfexportdialog.cpp | 83 +++++++++++++++++++++++++++++++++- src/app/qgsdxfexportdialog.h | 2 +- 2 files changed, 83 insertions(+), 2 deletions(-) diff --git a/src/app/qgsdxfexportdialog.cpp b/src/app/qgsdxfexportdialog.cpp index 53c04da438cf..048863ef1ee5 100644 --- a/src/app/qgsdxfexportdialog.cpp +++ b/src/app/qgsdxfexportdialog.cpp @@ -807,7 +807,88 @@ void QgsDxfExportDialog::deselectDataDefinedBlocks() void QgsDxfExportDialog::loadSettingsFromFile() { + QgsSettings settings; + const QString lastUsedDir = settings.value( QStringLiteral( "dxf/lastSettingsDir" ), QDir::homePath() ).toString(); + + const QString fileName = QFileDialog::getOpenFileName( this, tr( "Load DXF Export settings" ), lastUsedDir, + tr( "XML file" ) + " (*.xml)" ); + if ( fileName.isNull() ) + { + return; + } + + bool resultFlag = false; + + QDomDocument myDocument( QStringLiteral( "qgis" ) ); + + // location of problem associated with errorMsg + int line, column; + QString myErrorMessage; + + QFile myFile( fileName ); + if ( myFile.open( QFile::ReadOnly ) ) + { + QgsDebugMsgLevel( QStringLiteral( "file found %1" ).arg( fileName ), 2 ); + // read file + resultFlag = myDocument.setContent( &myFile, &myErrorMessage, &line, &column ); + if ( !resultFlag ) + myErrorMessage = tr( "%1 at line %2 column %3" ).arg( myErrorMessage ).arg( line ).arg( column ); + myFile.close(); + } + + resultFlag = loadSettingsFromXML( myDocument, myErrorMessage ); + if ( !resultFlag ) + QMessageBox::information( this, tr( "Load DXF settings" ), tr( "ERROR: Failed to load DXF Export settings file as %1. %2" ).arg( fileName, myErrorMessage ) ); + else + { + settings.setValue( QStringLiteral( "dxf/lastSettingsDir" ), QFileInfo( fileName ).path() ); + QMessageBox::information( this, tr( "Load DXF settings" ), tr( "DXF Export settings loaded!" ) ); + } +} + + +bool QgsDxfExportDialog::loadSettingsFromXML( QDomDocument &doc, QString &errorMessage ) const +{ + const QDomElement myRoot = doc.firstChildElement( QStringLiteral( "qgis" ) ); + if ( myRoot.isNull() ) + { + errorMessage = tr( "Root element could not be found" ); + return false; + } + + QDomElement mne; + mne = myRoot.namedItem( QStringLiteral( "symbology_mode" ) ).toElement(); + mSymbologyModeComboBox->setCurrentIndex( QgsXmlUtils::readVariant( mne.firstChildElement() ).toInt() ); + + mne = myRoot.namedItem( QStringLiteral( "symbology_scale" ) ).toElement(); + mScaleWidget->setScale( QgsXmlUtils::readVariant( mne.firstChildElement() ).toDouble() ); + + mne = myRoot.namedItem( QStringLiteral( "encoding" ) ).toElement(); + mEncoding->setCurrentText( QgsXmlUtils::readVariant( mne.firstChildElement() ).toString() ); + + mne = myRoot.namedItem( QStringLiteral( "crs" ) ).toElement(); + mCrsSelector->setCrs( QgsXmlUtils::readVariant( mne.firstChildElement() ).value< QgsCoordinateReferenceSystem >() ); + + mne = myRoot.namedItem( QStringLiteral( "map_theme" ) ).toElement(); + mVisibilityPresets->setCurrentText( QgsXmlUtils::readVariant( mne.firstChildElement() ).toString() ); + + // layers + mne = myRoot.namedItem( QStringLiteral( "use_layer_title" ) ).toElement(); + mLayerTitleAsName->setChecked( QgsXmlUtils::readVariant( mne.firstChildElement() ) == true ); + + mne = myRoot.namedItem( QStringLiteral( "use_map_extent" ) ).toElement(); + mMapExtentCheckBox->setChecked( QgsXmlUtils::readVariant( mne.firstChildElement() ) == true ); + + mne = myRoot.namedItem( QStringLiteral( "force_2d" ) ).toElement(); + mForce2d->setChecked( QgsXmlUtils::readVariant( mne.firstChildElement() ) == true ); + + mne = myRoot.namedItem( QStringLiteral( "mtext" ) ).toElement(); + mMTextCheckBox->setChecked( QgsXmlUtils::readVariant( mne.firstChildElement() ) == true ); + + mne = myRoot.namedItem( QStringLiteral( "selected_features_only" ) ).toElement(); + mSelectedFeaturesOnly->setChecked( QgsXmlUtils::readVariant( mne.firstChildElement() ) == true ); + return true; } @@ -899,7 +980,7 @@ void QgsDxfExportDialog::saveSettingsToXML( QDomDocument &doc ) const { QgsVectorLayer *vl = dxfLayer.layer(); QDomElement layerElement = myDocument.createElement( QStringLiteral( "layer" ) ); - layerElement.setAttribute( QStringLiteral( "source" ), vl->source() ); + layerElement.setAttribute( QStringLiteral( "source" ), vl->publicSource() ); layerElement.setAttribute( QStringLiteral( "attribute-index" ), dxfLayer.layerOutputAttributeIndex() ) ; layerElement.setAttribute( QStringLiteral( "use_symbol_blocks" ), dxfLayer.buildDataDefinedBlocks() ) ; layerElement.setAttribute( QStringLiteral( "max_number_of_classes" ), dxfLayer.dataDefinedBlocksMaximumNumberOfClasses() ) ; diff --git a/src/app/qgsdxfexportdialog.h b/src/app/qgsdxfexportdialog.h index 838fa6037723..a66647de54be 100644 --- a/src/app/qgsdxfexportdialog.h +++ b/src/app/qgsdxfexportdialog.h @@ -119,7 +119,7 @@ class QgsDxfExportDialog : public QDialog, private Ui::QgsDxfExportDialogBase QString mapTheme() const; QString encoding() const; QgsCoordinateReferenceSystem crs() const; - bool loadSettingsFromXML( QDomDocument &document ) const; + bool loadSettingsFromXML( QDomDocument &document, QString &errorMessage ) const; void saveSettingsToXML( QDomDocument &document ) const; public slots: From 7c0713fac82a7c99901d06a404404ce23c96a674 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Germ=C3=A1n=20Carrillo?= Date: Mon, 18 Mar 2024 15:04:25 +0100 Subject: [PATCH 03/11] Make DXF Export load settings from XML flexible by ignoring elements not present in the XML; ask for confirmation before overriding GUI values --- src/app/qgsdxfexportdialog.cpp | 60 ++++++++++++++++++++++++---------- 1 file changed, 43 insertions(+), 17 deletions(-) diff --git a/src/app/qgsdxfexportdialog.cpp b/src/app/qgsdxfexportdialog.cpp index 048863ef1ee5..b4c4f4974d59 100644 --- a/src/app/qgsdxfexportdialog.cpp +++ b/src/app/qgsdxfexportdialog.cpp @@ -836,13 +836,18 @@ void QgsDxfExportDialog::loadSettingsFromFile() myFile.close(); } - resultFlag = loadSettingsFromXML( myDocument, myErrorMessage ); - if ( !resultFlag ) - QMessageBox::information( this, tr( "Load DXF settings" ), tr( "ERROR: Failed to load DXF Export settings file as %1. %2" ).arg( fileName, myErrorMessage ) ); - else + if ( QMessageBox::question( this, + tr( "DXF Export load from XML file" ), + tr( "Are you sure you want to load settings from XML? This will change some values in the DXF Export dialog." ) ) == QMessageBox::Yes ) { - settings.setValue( QStringLiteral( "dxf/lastSettingsDir" ), QFileInfo( fileName ).path() ); - QMessageBox::information( this, tr( "Load DXF settings" ), tr( "DXF Export settings loaded!" ) ); + resultFlag = loadSettingsFromXML( myDocument, myErrorMessage ); + if ( !resultFlag ) + QMessageBox::information( this, tr( "Load DXF settings" ), tr( "ERROR: Failed to load DXF Export settings file as %1. %2" ).arg( fileName, myErrorMessage ) ); + else + { + settings.setValue( QStringLiteral( "dxf/lastSettingsDir" ), QFileInfo( fileName ).path() ); + QMessageBox::information( this, tr( "Load DXF settings" ), tr( "DXF Export settings loaded!" ) ); + } } } @@ -857,36 +862,57 @@ bool QgsDxfExportDialog::loadSettingsFromXML( QDomDocument &doc, QString &errorM } QDomElement mne; + QVariant value; + mne = myRoot.namedItem( QStringLiteral( "symbology_mode" ) ).toElement(); - mSymbologyModeComboBox->setCurrentIndex( QgsXmlUtils::readVariant( mne.firstChildElement() ).toInt() ); + value = QgsXmlUtils::readVariant( mne.firstChildElement() ); + if ( !value.isNull() ) + mSymbologyModeComboBox->setCurrentIndex( value.toInt() ); mne = myRoot.namedItem( QStringLiteral( "symbology_scale" ) ).toElement(); - mScaleWidget->setScale( QgsXmlUtils::readVariant( mne.firstChildElement() ).toDouble() ); + value = QgsXmlUtils::readVariant( mne.firstChildElement() ); + if ( !value.isNull() ) + mScaleWidget->setScale( value.toDouble() ); mne = myRoot.namedItem( QStringLiteral( "encoding" ) ).toElement(); - mEncoding->setCurrentText( QgsXmlUtils::readVariant( mne.firstChildElement() ).toString() ); + value = QgsXmlUtils::readVariant( mne.firstChildElement() ); + if ( !value.isNull() ) + mEncoding->setCurrentText( value.toString() ); mne = myRoot.namedItem( QStringLiteral( "crs" ) ).toElement(); - mCrsSelector->setCrs( QgsXmlUtils::readVariant( mne.firstChildElement() ).value< QgsCoordinateReferenceSystem >() ); + value = QgsXmlUtils::readVariant( mne.firstChildElement() ); + if ( !value.isNull() ) + mCrsSelector->setCrs( value.value< QgsCoordinateReferenceSystem >() ); mne = myRoot.namedItem( QStringLiteral( "map_theme" ) ).toElement(); - mVisibilityPresets->setCurrentText( QgsXmlUtils::readVariant( mne.firstChildElement() ).toString() ); + value = QgsXmlUtils::readVariant( mne.firstChildElement() ); + if ( !value.isNull() ) + mVisibilityPresets->setCurrentText( value.toString() ); - // layers mne = myRoot.namedItem( QStringLiteral( "use_layer_title" ) ).toElement(); - mLayerTitleAsName->setChecked( QgsXmlUtils::readVariant( mne.firstChildElement() ) == true ); + value = QgsXmlUtils::readVariant( mne.firstChildElement() ); + if ( !value.isNull() ) + mLayerTitleAsName->setChecked( value == true ); mne = myRoot.namedItem( QStringLiteral( "use_map_extent" ) ).toElement(); - mMapExtentCheckBox->setChecked( QgsXmlUtils::readVariant( mne.firstChildElement() ) == true ); + value = QgsXmlUtils::readVariant( mne.firstChildElement() ); + if ( !value.isNull() ) + mMapExtentCheckBox->setChecked( value == true ); mne = myRoot.namedItem( QStringLiteral( "force_2d" ) ).toElement(); - mForce2d->setChecked( QgsXmlUtils::readVariant( mne.firstChildElement() ) == true ); + value = QgsXmlUtils::readVariant( mne.firstChildElement() ); + if ( !value.isNull() ) + mForce2d->setChecked( value == true ); mne = myRoot.namedItem( QStringLiteral( "mtext" ) ).toElement(); - mMTextCheckBox->setChecked( QgsXmlUtils::readVariant( mne.firstChildElement() ) == true ); + value = QgsXmlUtils::readVariant( mne.firstChildElement() ); + if ( !value.isNull() ) + mMTextCheckBox->setChecked( value == true ); mne = myRoot.namedItem( QStringLiteral( "selected_features_only" ) ).toElement(); - mSelectedFeaturesOnly->setChecked( QgsXmlUtils::readVariant( mne.firstChildElement() ) == true ); + value = QgsXmlUtils::readVariant( mne.firstChildElement() ); + if ( !value.isNull() ) + mSelectedFeaturesOnly->setChecked( value == true ); return true; } From 430dbf9e22c4d39371d3551a43cb274cad1c6836 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Germ=C3=A1n=20Carrillo?= Date: Wed, 20 Mar 2024 14:59:41 +0100 Subject: [PATCH 04/11] [dxf] Remove 'my' prefixes according to review --- src/app/qgsdxfexportdialog.cpp | 120 ++++++++++++++++----------------- 1 file changed, 60 insertions(+), 60 deletions(-) diff --git a/src/app/qgsdxfexportdialog.cpp b/src/app/qgsdxfexportdialog.cpp index b4c4f4974d59..abb4653eef39 100644 --- a/src/app/qgsdxfexportdialog.cpp +++ b/src/app/qgsdxfexportdialog.cpp @@ -819,30 +819,30 @@ void QgsDxfExportDialog::loadSettingsFromFile() bool resultFlag = false; - QDomDocument myDocument( QStringLiteral( "qgis" ) ); + QDomDocument domDocument( QStringLiteral( "qgis" ) ); // location of problem associated with errorMsg int line, column; - QString myErrorMessage; + QString errorMessage; - QFile myFile( fileName ); - if ( myFile.open( QFile::ReadOnly ) ) + QFile file( fileName ); + if ( file.open( QFile::ReadOnly ) ) { QgsDebugMsgLevel( QStringLiteral( "file found %1" ).arg( fileName ), 2 ); // read file - resultFlag = myDocument.setContent( &myFile, &myErrorMessage, &line, &column ); + resultFlag = domDocument.setContent( &file, &errorMessage, &line, &column ); if ( !resultFlag ) - myErrorMessage = tr( "%1 at line %2 column %3" ).arg( myErrorMessage ).arg( line ).arg( column ); - myFile.close(); + errorMessage = tr( "%1 at line %2 column %3" ).arg( errorMessage ).arg( line ).arg( column ); + file.close(); } if ( QMessageBox::question( this, tr( "DXF Export load from XML file" ), tr( "Are you sure you want to load settings from XML? This will change some values in the DXF Export dialog." ) ) == QMessageBox::Yes ) { - resultFlag = loadSettingsFromXML( myDocument, myErrorMessage ); + resultFlag = loadSettingsFromXML( domDocument, errorMessage ); if ( !resultFlag ) - QMessageBox::information( this, tr( "Load DXF settings" ), tr( "ERROR: Failed to load DXF Export settings file as %1. %2" ).arg( fileName, myErrorMessage ) ); + QMessageBox::information( this, tr( "Load DXF settings" ), tr( "ERROR: Failed to load DXF Export settings file as %1. %2" ).arg( fileName, errorMessage ) ); else { settings.setValue( QStringLiteral( "dxf/lastSettingsDir" ), QFileInfo( fileName ).path() ); @@ -854,8 +854,8 @@ void QgsDxfExportDialog::loadSettingsFromFile() bool QgsDxfExportDialog::loadSettingsFromXML( QDomDocument &doc, QString &errorMessage ) const { - const QDomElement myRoot = doc.firstChildElement( QStringLiteral( "qgis" ) ); - if ( myRoot.isNull() ) + const QDomElement rootElement = doc.firstChildElement( QStringLiteral( "qgis" ) ); + if ( rootElement.isNull() ) { errorMessage = tr( "Root element could not be found" ); return false; @@ -864,52 +864,52 @@ bool QgsDxfExportDialog::loadSettingsFromXML( QDomDocument &doc, QString &errorM QDomElement mne; QVariant value; - mne = myRoot.namedItem( QStringLiteral( "symbology_mode" ) ).toElement(); + mne = rootElement.namedItem( QStringLiteral( "symbology_mode" ) ).toElement(); value = QgsXmlUtils::readVariant( mne.firstChildElement() ); if ( !value.isNull() ) mSymbologyModeComboBox->setCurrentIndex( value.toInt() ); - mne = myRoot.namedItem( QStringLiteral( "symbology_scale" ) ).toElement(); + mne = rootElement.namedItem( QStringLiteral( "symbology_scale" ) ).toElement(); value = QgsXmlUtils::readVariant( mne.firstChildElement() ); if ( !value.isNull() ) mScaleWidget->setScale( value.toDouble() ); - mne = myRoot.namedItem( QStringLiteral( "encoding" ) ).toElement(); + mne = rootElement.namedItem( QStringLiteral( "encoding" ) ).toElement(); value = QgsXmlUtils::readVariant( mne.firstChildElement() ); if ( !value.isNull() ) mEncoding->setCurrentText( value.toString() ); - mne = myRoot.namedItem( QStringLiteral( "crs" ) ).toElement(); + mne = rootElement.namedItem( QStringLiteral( "crs" ) ).toElement(); value = QgsXmlUtils::readVariant( mne.firstChildElement() ); if ( !value.isNull() ) mCrsSelector->setCrs( value.value< QgsCoordinateReferenceSystem >() ); - mne = myRoot.namedItem( QStringLiteral( "map_theme" ) ).toElement(); + mne = rootElement.namedItem( QStringLiteral( "map_theme" ) ).toElement(); value = QgsXmlUtils::readVariant( mne.firstChildElement() ); if ( !value.isNull() ) mVisibilityPresets->setCurrentText( value.toString() ); - mne = myRoot.namedItem( QStringLiteral( "use_layer_title" ) ).toElement(); + mne = rootElement.namedItem( QStringLiteral( "use_layer_title" ) ).toElement(); value = QgsXmlUtils::readVariant( mne.firstChildElement() ); if ( !value.isNull() ) mLayerTitleAsName->setChecked( value == true ); - mne = myRoot.namedItem( QStringLiteral( "use_map_extent" ) ).toElement(); + mne = rootElement.namedItem( QStringLiteral( "use_map_extent" ) ).toElement(); value = QgsXmlUtils::readVariant( mne.firstChildElement() ); if ( !value.isNull() ) mMapExtentCheckBox->setChecked( value == true ); - mne = myRoot.namedItem( QStringLiteral( "force_2d" ) ).toElement(); + mne = rootElement.namedItem( QStringLiteral( "force_2d" ) ).toElement(); value = QgsXmlUtils::readVariant( mne.firstChildElement() ); if ( !value.isNull() ) mForce2d->setChecked( value == true ); - mne = myRoot.namedItem( QStringLiteral( "mtext" ) ).toElement(); + mne = rootElement.namedItem( QStringLiteral( "mtext" ) ).toElement(); value = QgsXmlUtils::readVariant( mne.firstChildElement() ); if ( !value.isNull() ) mMTextCheckBox->setChecked( value == true ); - mne = myRoot.namedItem( QStringLiteral( "selected_features_only" ) ).toElement(); + mne = rootElement.namedItem( QStringLiteral( "selected_features_only" ) ).toElement(); value = QgsXmlUtils::readVariant( mne.firstChildElement() ); if ( !value.isNull() ) mSelectedFeaturesOnly->setChecked( value == true ); @@ -939,26 +939,26 @@ void QgsDxfExportDialog::saveSettingsToFile() outputFileName += QStringLiteral( ".xml" ); } - QString myErrorMessage; - QDomDocument myDocument; + QString errorMessage; + QDomDocument domDocument; - saveSettingsToXML( myDocument ); + saveSettingsToXML( domDocument ); - const QFileInfo myFileInfo( outputFileName ); - const QFileInfo myDirInfo( myFileInfo.path() ); //excludes file name - if ( !myDirInfo.isWritable() ) + const QFileInfo fileInfo( outputFileName ); + const QFileInfo dirInfo( fileInfo.path() ); //excludes file name + if ( !dirInfo.isWritable() ) { QMessageBox::information( this, tr( "Save DXF settings" ), tr( "The directory containing your dataset needs to be writable!" ) ); return; } - QFile myFile( outputFileName ); - if ( myFile.open( QFile::WriteOnly | QFile::Truncate ) ) + QFile file( outputFileName ); + if ( file.open( QFile::WriteOnly | QFile::Truncate ) ) { - QTextStream myFileStream( &myFile ); + QTextStream fileStream( &file ); // save as utf-8 with 2 spaces for indents - myDocument.save( myFileStream, 2 ); - myFile.close(); + domDocument.save( fileStream, 2 ); + file.close(); QMessageBox::information( this, tr( "Save DXF settings" ), tr( "Created DXF settings file as %1" ).arg( outputFileName ) ); settings.setValue( QStringLiteral( "dxf/lastSettingsDir" ), QFileInfo( outputFileName ).absolutePath() ); return; @@ -975,66 +975,66 @@ void QgsDxfExportDialog::saveSettingsToXML( QDomDocument &doc ) const { QDomImplementation DomImplementation; const QDomDocumentType documentType = DomImplementation.createDocumentType( QStringLiteral( "qgis" ), QStringLiteral( "http://mrcc.com/qgis.dtd" ), QStringLiteral( "SYSTEM" ) ); - QDomDocument myDocument( documentType ); + QDomDocument domDocument( documentType ); - QDomElement myRootNode = myDocument.createElement( QStringLiteral( "qgis" ) ); - myRootNode.setAttribute( QStringLiteral( "version" ), Qgis::version() ); - myDocument.appendChild( myRootNode ); + QDomElement rootElement = domDocument.createElement( QStringLiteral( "qgis" ) ); + rootElement.setAttribute( QStringLiteral( "version" ), Qgis::version() ); + domDocument.appendChild( rootElement ); - QDomElement symbologyModeElement = myDocument.createElement( QStringLiteral( "symbology_mode" ) ); + QDomElement symbologyModeElement = domDocument.createElement( QStringLiteral( "symbology_mode" ) ); symbologyModeElement.appendChild( QgsXmlUtils::writeVariant( static_cast( symbologyMode() ), doc ) ); - myRootNode.appendChild( symbologyModeElement ); + rootElement.appendChild( symbologyModeElement ); - QDomElement symbologyScaleElement = myDocument.createElement( QStringLiteral( "symbology_scale" ) ); + QDomElement symbologyScaleElement = domDocument.createElement( QStringLiteral( "symbology_scale" ) ); symbologyScaleElement.appendChild( QgsXmlUtils::writeVariant( symbologyScale(), doc ) ); - myRootNode.appendChild( symbologyScaleElement ); + rootElement.appendChild( symbologyScaleElement ); - QDomElement encodingElement = myDocument.createElement( QStringLiteral( "encoding" ) ); + QDomElement encodingElement = domDocument.createElement( QStringLiteral( "encoding" ) ); encodingElement.appendChild( QgsXmlUtils::writeVariant( encoding(), doc ) ); - myRootNode.appendChild( encodingElement ); + rootElement.appendChild( encodingElement ); - QDomElement crsElement = myDocument.createElement( QStringLiteral( "crs" ) ); + QDomElement crsElement = domDocument.createElement( QStringLiteral( "crs" ) ); crsElement.appendChild( QgsXmlUtils::writeVariant( crs(), doc ) ); - myRootNode.appendChild( crsElement ); + rootElement.appendChild( crsElement ); - QDomElement mapThemeElement = myDocument.createElement( QStringLiteral( "map_theme" ) ); + QDomElement mapThemeElement = domDocument.createElement( QStringLiteral( "map_theme" ) ); mapThemeElement.appendChild( QgsXmlUtils::writeVariant( mapTheme(), doc ) ); - myRootNode.appendChild( mapThemeElement ); + rootElement.appendChild( mapThemeElement ); - QDomElement layersElement = myDocument.createElement( QStringLiteral( "layers" ) ); + QDomElement layersElement = domDocument.createElement( QStringLiteral( "layers" ) ); for ( const auto dxfLayer : layers() ) { QgsVectorLayer *vl = dxfLayer.layer(); - QDomElement layerElement = myDocument.createElement( QStringLiteral( "layer" ) ); + QDomElement layerElement = domDocument.createElement( QStringLiteral( "layer" ) ); layerElement.setAttribute( QStringLiteral( "source" ), vl->publicSource() ); layerElement.setAttribute( QStringLiteral( "attribute-index" ), dxfLayer.layerOutputAttributeIndex() ) ; layerElement.setAttribute( QStringLiteral( "use_symbol_blocks" ), dxfLayer.buildDataDefinedBlocks() ) ; layerElement.setAttribute( QStringLiteral( "max_number_of_classes" ), dxfLayer.dataDefinedBlocksMaximumNumberOfClasses() ) ; layersElement.appendChild( layerElement ); } - myRootNode.appendChild( layersElement ); + rootElement.appendChild( layersElement ); - QDomElement titleAsNameElement = myDocument.createElement( QStringLiteral( "use_layer_title" ) ); + QDomElement titleAsNameElement = domDocument.createElement( QStringLiteral( "use_layer_title" ) ); titleAsNameElement.appendChild( QgsXmlUtils::writeVariant( layerTitleAsName(), doc ) ); - myRootNode.appendChild( titleAsNameElement ); + rootElement.appendChild( titleAsNameElement ); - QDomElement useMapExtentElement = myDocument.createElement( QStringLiteral( "use_map_extent" ) ); + QDomElement useMapExtentElement = domDocument.createElement( QStringLiteral( "use_map_extent" ) ); useMapExtentElement.appendChild( QgsXmlUtils::writeVariant( exportMapExtent(), doc ) ); - myRootNode.appendChild( useMapExtentElement ); + rootElement.appendChild( useMapExtentElement ); - QDomElement force2dElement = myDocument.createElement( QStringLiteral( "force_2d" ) ); + QDomElement force2dElement = domDocument.createElement( QStringLiteral( "force_2d" ) ); force2dElement.appendChild( QgsXmlUtils::writeVariant( force2d(), doc ) ); - myRootNode.appendChild( force2dElement ); + rootElement.appendChild( force2dElement ); - QDomElement useMTextElement = myDocument.createElement( QStringLiteral( "mtext" ) ); + QDomElement useMTextElement = domDocument.createElement( QStringLiteral( "mtext" ) ); useMTextElement.appendChild( QgsXmlUtils::writeVariant( useMText(), doc ) ); - myRootNode.appendChild( useMTextElement ); + rootElement.appendChild( useMTextElement ); - QDomElement selectedFeatures = myDocument.createElement( QStringLiteral( "selected_features_only" ) ); + QDomElement selectedFeatures = domDocument.createElement( QStringLiteral( "selected_features_only" ) ); selectedFeatures.appendChild( QgsXmlUtils::writeVariant( selectedFeaturesOnly(), doc ) ); - myRootNode.appendChild( selectedFeatures ); + rootElement.appendChild( selectedFeatures ); - doc = myDocument; + doc = domDocument; } From 67bd1a26ee3f7c29f34d3c02599c4054c1088c1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Germ=C3=A1n=20Carrillo?= Date: Wed, 20 Mar 2024 17:08:17 +0100 Subject: [PATCH 05/11] [dxf] Use the new Settings API --- src/app/qgsdxfexportdialog.cpp | 16 ++++++---------- src/app/qgsdxfexportdialog.h | 1 + 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/app/qgsdxfexportdialog.cpp b/src/app/qgsdxfexportdialog.cpp index abb4653eef39..874d33982b04 100644 --- a/src/app/qgsdxfexportdialog.cpp +++ b/src/app/qgsdxfexportdialog.cpp @@ -807,10 +807,8 @@ void QgsDxfExportDialog::deselectDataDefinedBlocks() void QgsDxfExportDialog::loadSettingsFromFile() { - QgsSettings settings; - const QString lastUsedDir = settings.value( QStringLiteral( "dxf/lastSettingsDir" ), QDir::homePath() ).toString(); - - const QString fileName = QFileDialog::getOpenFileName( this, tr( "Load DXF Export settings" ), lastUsedDir, + const QString fileName = QFileDialog::getOpenFileName( this, tr( "Load DXF Export settings" ), + QgsDxfExportDialog::settingsDxfLastSettingsDir->value(), tr( "XML file" ) + " (*.xml)" ); if ( fileName.isNull() ) { @@ -845,7 +843,7 @@ void QgsDxfExportDialog::loadSettingsFromFile() QMessageBox::information( this, tr( "Load DXF settings" ), tr( "ERROR: Failed to load DXF Export settings file as %1. %2" ).arg( fileName, errorMessage ) ); else { - settings.setValue( QStringLiteral( "dxf/lastSettingsDir" ), QFileInfo( fileName ).path() ); + QgsDxfExportDialog::settingsDxfLastSettingsDir->setValue( QFileInfo( fileName ).path() ); QMessageBox::information( this, tr( "Load DXF settings" ), tr( "DXF Export settings loaded!" ) ); } } @@ -920,11 +918,9 @@ bool QgsDxfExportDialog::loadSettingsFromXML( QDomDocument &doc, QString &errorM void QgsDxfExportDialog::saveSettingsToFile() { - QgsSettings settings; - const QString lastUsedDir = settings.value( QStringLiteral( "dxf/lastSettingsDir" ), QDir::homePath() ).toString(); - QString outputFileName = QFileDialog::getSaveFileName( this, tr( "Save DXF Export settings as XML" ), - lastUsedDir, tr( "XML file" ) + " (*.xml)" ); + QgsDxfExportDialog::settingsDxfLastSettingsDir->value(), + tr( "XML file" ) + " (*.xml)" ); // return dialog focus on Mac activateWindow(); raise(); @@ -960,7 +956,7 @@ void QgsDxfExportDialog::saveSettingsToFile() domDocument.save( fileStream, 2 ); file.close(); QMessageBox::information( this, tr( "Save DXF settings" ), tr( "Created DXF settings file as %1" ).arg( outputFileName ) ); - settings.setValue( QStringLiteral( "dxf/lastSettingsDir" ), QFileInfo( outputFileName ).absolutePath() ); + QgsDxfExportDialog::settingsDxfLastSettingsDir->setValue( QFileInfo( outputFileName ).absolutePath() ); return; } else diff --git a/src/app/qgsdxfexportdialog.h b/src/app/qgsdxfexportdialog.h index a66647de54be..4afb9e33ac7d 100644 --- a/src/app/qgsdxfexportdialog.h +++ b/src/app/qgsdxfexportdialog.h @@ -102,6 +102,7 @@ class QgsDxfExportDialog : public QDialog, private Ui::QgsDxfExportDialogBase public: static inline QgsSettingsTreeNode *sTreeAppDdxf = QgsSettingsTree::sTreeApp->createChildNode( QStringLiteral( "dxf" ) ); static const inline QgsSettingsEntryBool *settingsDxfEnableDDBlocks = new QgsSettingsEntryBool( QStringLiteral( "enable-datadefined-blocks" ), sTreeAppDdxf, false ); + static const inline QgsSettingsEntryString *settingsDxfLastSettingsDir = new QgsSettingsEntryString( QStringLiteral( "last-settings-dir" ), sTreeAppDdxf, QDir::homePath() ); QgsDxfExportDialog( QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags() ); ~QgsDxfExportDialog() override; From 1e9cf8f68b3eabf33889dfac6469185848eb1104 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Germ=C3=A1n=20Carrillo?= Date: Wed, 20 Mar 2024 17:48:38 +0100 Subject: [PATCH 06/11] [dxf] Special tag for DXF settings XML document and correspondent validation --- src/app/qgsdxfexportdialog.cpp | 54 ++++++++++++++++++++-------------- 1 file changed, 32 insertions(+), 22 deletions(-) diff --git a/src/app/qgsdxfexportdialog.cpp b/src/app/qgsdxfexportdialog.cpp index 874d33982b04..429f70b2db01 100644 --- a/src/app/qgsdxfexportdialog.cpp +++ b/src/app/qgsdxfexportdialog.cpp @@ -840,7 +840,7 @@ void QgsDxfExportDialog::loadSettingsFromFile() { resultFlag = loadSettingsFromXML( domDocument, errorMessage ); if ( !resultFlag ) - QMessageBox::information( this, tr( "Load DXF settings" ), tr( "ERROR: Failed to load DXF Export settings file as %1. %2" ).arg( fileName, errorMessage ) ); + QMessageBox::information( this, tr( "Load DXF settings" ), tr( "ERROR: Failed to load DXF Export settings file as %1.\n\n%2" ).arg( fileName, errorMessage ) ); else { QgsDxfExportDialog::settingsDxfLastSettingsDir->setValue( QFileInfo( fileName ).path() ); @@ -859,55 +859,62 @@ bool QgsDxfExportDialog::loadSettingsFromXML( QDomDocument &doc, QString &errorM return false; } + const QDomElement dxfElement = rootElement.firstChildElement( QStringLiteral( "dxf_settings" ) ); + if ( dxfElement.isNull() ) + { + errorMessage = tr( "The XML file does not correspond to DXF settings. It must have a element." ); + return false; + } + QDomElement mne; QVariant value; - mne = rootElement.namedItem( QStringLiteral( "symbology_mode" ) ).toElement(); + mne = dxfElement.namedItem( QStringLiteral( "symbology_mode" ) ).toElement(); value = QgsXmlUtils::readVariant( mne.firstChildElement() ); if ( !value.isNull() ) mSymbologyModeComboBox->setCurrentIndex( value.toInt() ); - mne = rootElement.namedItem( QStringLiteral( "symbology_scale" ) ).toElement(); + mne = dxfElement.namedItem( QStringLiteral( "symbology_scale" ) ).toElement(); value = QgsXmlUtils::readVariant( mne.firstChildElement() ); if ( !value.isNull() ) mScaleWidget->setScale( value.toDouble() ); - mne = rootElement.namedItem( QStringLiteral( "encoding" ) ).toElement(); + mne = dxfElement.namedItem( QStringLiteral( "encoding" ) ).toElement(); value = QgsXmlUtils::readVariant( mne.firstChildElement() ); if ( !value.isNull() ) mEncoding->setCurrentText( value.toString() ); - mne = rootElement.namedItem( QStringLiteral( "crs" ) ).toElement(); + mne = dxfElement.namedItem( QStringLiteral( "crs" ) ).toElement(); value = QgsXmlUtils::readVariant( mne.firstChildElement() ); if ( !value.isNull() ) mCrsSelector->setCrs( value.value< QgsCoordinateReferenceSystem >() ); - mne = rootElement.namedItem( QStringLiteral( "map_theme" ) ).toElement(); + mne = dxfElement.namedItem( QStringLiteral( "map_theme" ) ).toElement(); value = QgsXmlUtils::readVariant( mne.firstChildElement() ); if ( !value.isNull() ) mVisibilityPresets->setCurrentText( value.toString() ); - mne = rootElement.namedItem( QStringLiteral( "use_layer_title" ) ).toElement(); + mne = dxfElement.namedItem( QStringLiteral( "use_layer_title" ) ).toElement(); value = QgsXmlUtils::readVariant( mne.firstChildElement() ); if ( !value.isNull() ) mLayerTitleAsName->setChecked( value == true ); - mne = rootElement.namedItem( QStringLiteral( "use_map_extent" ) ).toElement(); + mne = dxfElement.namedItem( QStringLiteral( "use_map_extent" ) ).toElement(); value = QgsXmlUtils::readVariant( mne.firstChildElement() ); if ( !value.isNull() ) mMapExtentCheckBox->setChecked( value == true ); - mne = rootElement.namedItem( QStringLiteral( "force_2d" ) ).toElement(); + mne = dxfElement.namedItem( QStringLiteral( "force_2d" ) ).toElement(); value = QgsXmlUtils::readVariant( mne.firstChildElement() ); if ( !value.isNull() ) mForce2d->setChecked( value == true ); - mne = rootElement.namedItem( QStringLiteral( "mtext" ) ).toElement(); + mne = dxfElement.namedItem( QStringLiteral( "mtext" ) ).toElement(); value = QgsXmlUtils::readVariant( mne.firstChildElement() ); if ( !value.isNull() ) mMTextCheckBox->setChecked( value == true ); - mne = rootElement.namedItem( QStringLiteral( "selected_features_only" ) ).toElement(); + mne = dxfElement.namedItem( QStringLiteral( "selected_features_only" ) ).toElement(); value = QgsXmlUtils::readVariant( mne.firstChildElement() ); if ( !value.isNull() ) mSelectedFeaturesOnly->setChecked( value == true ); @@ -977,25 +984,28 @@ void QgsDxfExportDialog::saveSettingsToXML( QDomDocument &doc ) const rootElement.setAttribute( QStringLiteral( "version" ), Qgis::version() ); domDocument.appendChild( rootElement ); + QDomElement dxfElement = domDocument.createElement( QStringLiteral( "dxf_settings" ) ); + rootElement.appendChild( dxfElement ); + QDomElement symbologyModeElement = domDocument.createElement( QStringLiteral( "symbology_mode" ) ); symbologyModeElement.appendChild( QgsXmlUtils::writeVariant( static_cast( symbologyMode() ), doc ) ); - rootElement.appendChild( symbologyModeElement ); + dxfElement.appendChild( symbologyModeElement ); QDomElement symbologyScaleElement = domDocument.createElement( QStringLiteral( "symbology_scale" ) ); symbologyScaleElement.appendChild( QgsXmlUtils::writeVariant( symbologyScale(), doc ) ); - rootElement.appendChild( symbologyScaleElement ); + dxfElement.appendChild( symbologyScaleElement ); QDomElement encodingElement = domDocument.createElement( QStringLiteral( "encoding" ) ); encodingElement.appendChild( QgsXmlUtils::writeVariant( encoding(), doc ) ); - rootElement.appendChild( encodingElement ); + dxfElement.appendChild( encodingElement ); QDomElement crsElement = domDocument.createElement( QStringLiteral( "crs" ) ); crsElement.appendChild( QgsXmlUtils::writeVariant( crs(), doc ) ); - rootElement.appendChild( crsElement ); + dxfElement.appendChild( crsElement ); QDomElement mapThemeElement = domDocument.createElement( QStringLiteral( "map_theme" ) ); mapThemeElement.appendChild( QgsXmlUtils::writeVariant( mapTheme(), doc ) ); - rootElement.appendChild( mapThemeElement ); + dxfElement.appendChild( mapThemeElement ); QDomElement layersElement = domDocument.createElement( QStringLiteral( "layers" ) ); for ( const auto dxfLayer : layers() ) @@ -1008,27 +1018,27 @@ void QgsDxfExportDialog::saveSettingsToXML( QDomDocument &doc ) const layerElement.setAttribute( QStringLiteral( "max_number_of_classes" ), dxfLayer.dataDefinedBlocksMaximumNumberOfClasses() ) ; layersElement.appendChild( layerElement ); } - rootElement.appendChild( layersElement ); + dxfElement.appendChild( layersElement ); QDomElement titleAsNameElement = domDocument.createElement( QStringLiteral( "use_layer_title" ) ); titleAsNameElement.appendChild( QgsXmlUtils::writeVariant( layerTitleAsName(), doc ) ); - rootElement.appendChild( titleAsNameElement ); + dxfElement.appendChild( titleAsNameElement ); QDomElement useMapExtentElement = domDocument.createElement( QStringLiteral( "use_map_extent" ) ); useMapExtentElement.appendChild( QgsXmlUtils::writeVariant( exportMapExtent(), doc ) ); - rootElement.appendChild( useMapExtentElement ); + dxfElement.appendChild( useMapExtentElement ); QDomElement force2dElement = domDocument.createElement( QStringLiteral( "force_2d" ) ); force2dElement.appendChild( QgsXmlUtils::writeVariant( force2d(), doc ) ); - rootElement.appendChild( force2dElement ); + dxfElement.appendChild( force2dElement ); QDomElement useMTextElement = domDocument.createElement( QStringLiteral( "mtext" ) ); useMTextElement.appendChild( QgsXmlUtils::writeVariant( useMText(), doc ) ); - rootElement.appendChild( useMTextElement ); + dxfElement.appendChild( useMTextElement ); QDomElement selectedFeatures = domDocument.createElement( QStringLiteral( "selected_features_only" ) ); selectedFeatures.appendChild( QgsXmlUtils::writeVariant( selectedFeaturesOnly(), doc ) ); - rootElement.appendChild( selectedFeatures ); + dxfElement.appendChild( selectedFeatures ); doc = domDocument; } From 51596fa1262fdf72f755608fde06e0941845ea5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Germ=C3=A1n=20Carrillo?= Date: Thu, 21 Mar 2024 16:14:50 +0100 Subject: [PATCH 07/11] [dxf] Save and restore layer settings (XML) in DXF dialog --- src/app/qgsdxfexportdialog.cpp | 84 ++++++++++++++++++++++++---------- src/app/qgsdxfexportdialog.h | 1 + 2 files changed, 62 insertions(+), 23 deletions(-) diff --git a/src/app/qgsdxfexportdialog.cpp b/src/app/qgsdxfexportdialog.cpp index 429f70b2db01..14f51659587c 100644 --- a/src/app/qgsdxfexportdialog.cpp +++ b/src/app/qgsdxfexportdialog.cpp @@ -866,56 +866,91 @@ bool QgsDxfExportDialog::loadSettingsFromXML( QDomDocument &doc, QString &errorM return false; } - QDomElement mne; + QDomElement element; QVariant value; - mne = dxfElement.namedItem( QStringLiteral( "symbology_mode" ) ).toElement(); - value = QgsXmlUtils::readVariant( mne.firstChildElement() ); + element = dxfElement.namedItem( QStringLiteral( "symbology_mode" ) ).toElement(); + value = QgsXmlUtils::readVariant( element.firstChildElement() ); if ( !value.isNull() ) mSymbologyModeComboBox->setCurrentIndex( value.toInt() ); - mne = dxfElement.namedItem( QStringLiteral( "symbology_scale" ) ).toElement(); - value = QgsXmlUtils::readVariant( mne.firstChildElement() ); + element = dxfElement.namedItem( QStringLiteral( "symbology_scale" ) ).toElement(); + value = QgsXmlUtils::readVariant( element.firstChildElement() ); if ( !value.isNull() ) mScaleWidget->setScale( value.toDouble() ); - mne = dxfElement.namedItem( QStringLiteral( "encoding" ) ).toElement(); - value = QgsXmlUtils::readVariant( mne.firstChildElement() ); + element = dxfElement.namedItem( QStringLiteral( "encoding" ) ).toElement(); + value = QgsXmlUtils::readVariant( element.firstChildElement() ); if ( !value.isNull() ) mEncoding->setCurrentText( value.toString() ); - mne = dxfElement.namedItem( QStringLiteral( "crs" ) ).toElement(); - value = QgsXmlUtils::readVariant( mne.firstChildElement() ); + element = dxfElement.namedItem( QStringLiteral( "crs" ) ).toElement(); + value = QgsXmlUtils::readVariant( element.firstChildElement() ); if ( !value.isNull() ) mCrsSelector->setCrs( value.value< QgsCoordinateReferenceSystem >() ); - mne = dxfElement.namedItem( QStringLiteral( "map_theme" ) ).toElement(); - value = QgsXmlUtils::readVariant( mne.firstChildElement() ); + element = dxfElement.namedItem( QStringLiteral( "map_theme" ) ).toElement(); + value = QgsXmlUtils::readVariant( element.firstChildElement() ); if ( !value.isNull() ) mVisibilityPresets->setCurrentText( value.toString() ); - mne = dxfElement.namedItem( QStringLiteral( "use_layer_title" ) ).toElement(); - value = QgsXmlUtils::readVariant( mne.firstChildElement() ); + // layer settings + element = dxfElement.namedItem( QStringLiteral( "layers" ) ).toElement(); + QDomNodeList layerNodeList = element.elementsByTagName( QStringLiteral( "layer" ) ); + const QgsReadWriteContext rwContext = QgsReadWriteContext(); + + QgsVectorLayer *vl; + QgsVectorLayerRef vlRef; + + for ( int i = 0; i < layerNodeList.length(); i++ ) + { + element = layerNodeList.at( i ).toElement(); + if ( vlRef.readXml( element, rwContext ) ) + { + vl = vlRef.resolveWeakly( QgsProject::instance() ); + if ( vl ) + { + QgsLayerTreeLayer *treeNode = mLayerTreeGroup->findLayer( vl ); + QModelIndex idx = mModel->node2index( treeNode ); + + idx = mModel->index( idx.row(), OUTPUT_LAYER_ATTRIBUTE_COL, idx.parent() ); + mModel->setData( idx, element.attribute( QStringLiteral( "attribute-index" ), QStringLiteral( "-1" ) ) ); + + idx = mModel->index( idx.row(), ALLOW_DD_SYMBOL_BLOCKS_COL, idx.parent() ); + mModel->setData( idx, element.attribute( QStringLiteral( "use_symbol_blocks" ), QStringLiteral( "0" ) ), Qt::CheckStateRole ); + + idx = mModel->index( idx.row(), MAXIMUM_DD_SYMBOL_BLOCKS_COL, idx.parent() ); + mModel->setData( idx, element.attribute( QStringLiteral( "max_number_of_classes" ), QStringLiteral( "-1" ) ) ); + } + else + { + QgsDebugMsgLevel( QStringLiteral( " Layer '%1' found in the DXF settings XML file, but not present in the project." ).arg( element.attribute( QStringLiteral( "name" ) ) ), 1 ); + } + } + } + + element = dxfElement.namedItem( QStringLiteral( "use_layer_title" ) ).toElement(); + value = QgsXmlUtils::readVariant( element.firstChildElement() ); if ( !value.isNull() ) mLayerTitleAsName->setChecked( value == true ); - mne = dxfElement.namedItem( QStringLiteral( "use_map_extent" ) ).toElement(); - value = QgsXmlUtils::readVariant( mne.firstChildElement() ); + element = dxfElement.namedItem( QStringLiteral( "use_map_extent" ) ).toElement(); + value = QgsXmlUtils::readVariant( element.firstChildElement() ); if ( !value.isNull() ) mMapExtentCheckBox->setChecked( value == true ); - mne = dxfElement.namedItem( QStringLiteral( "force_2d" ) ).toElement(); - value = QgsXmlUtils::readVariant( mne.firstChildElement() ); + element = dxfElement.namedItem( QStringLiteral( "force_2d" ) ).toElement(); + value = QgsXmlUtils::readVariant( element.firstChildElement() ); if ( !value.isNull() ) mForce2d->setChecked( value == true ); - mne = dxfElement.namedItem( QStringLiteral( "mtext" ) ).toElement(); - value = QgsXmlUtils::readVariant( mne.firstChildElement() ); + element = dxfElement.namedItem( QStringLiteral( "mtext" ) ).toElement(); + value = QgsXmlUtils::readVariant( element.firstChildElement() ); if ( !value.isNull() ) mMTextCheckBox->setChecked( value == true ); - mne = dxfElement.namedItem( QStringLiteral( "selected_features_only" ) ).toElement(); - value = QgsXmlUtils::readVariant( mne.firstChildElement() ); + element = dxfElement.namedItem( QStringLiteral( "selected_features_only" ) ).toElement(); + value = QgsXmlUtils::readVariant( element.firstChildElement() ); if ( !value.isNull() ) mSelectedFeaturesOnly->setChecked( value == true ); @@ -1008,11 +1043,14 @@ void QgsDxfExportDialog::saveSettingsToXML( QDomDocument &doc ) const dxfElement.appendChild( mapThemeElement ); QDomElement layersElement = domDocument.createElement( QStringLiteral( "layers" ) ); + QgsVectorLayerRef vlRef; + const QgsReadWriteContext rwContext = QgsReadWriteContext(); + for ( const auto dxfLayer : layers() ) { - QgsVectorLayer *vl = dxfLayer.layer(); QDomElement layerElement = domDocument.createElement( QStringLiteral( "layer" ) ); - layerElement.setAttribute( QStringLiteral( "source" ), vl->publicSource() ); + vlRef.setLayer( dxfLayer.layer() ); + vlRef.writeXml( layerElement, rwContext ); layerElement.setAttribute( QStringLiteral( "attribute-index" ), dxfLayer.layerOutputAttributeIndex() ) ; layerElement.setAttribute( QStringLiteral( "use_symbol_blocks" ), dxfLayer.buildDataDefinedBlocks() ) ; layerElement.setAttribute( QStringLiteral( "max_number_of_classes" ), dxfLayer.dataDefinedBlocksMaximumNumberOfClasses() ) ; diff --git a/src/app/qgsdxfexportdialog.h b/src/app/qgsdxfexportdialog.h index 4afb9e33ac7d..59beaafb57f2 100644 --- a/src/app/qgsdxfexportdialog.h +++ b/src/app/qgsdxfexportdialog.h @@ -25,6 +25,7 @@ #include "qgssettingstree.h" #include "qgssettingsentryimpl.h" #include "qgsxmlutils.h" +#include "qgsvectorlayerref.h" #include #include From ddc75a5e5e1231bd07e8b58b02320f0ffcef16f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Germ=C3=A1n=20Carrillo?= Date: Thu, 21 Mar 2024 18:19:26 +0100 Subject: [PATCH 08/11] [dxf] Non-modal success message for DXF Export dialog --- src/app/qgsdxfexportdialog.cpp | 6 +- src/app/qgsdxfexportdialog.h | 2 + src/ui/qgsdxfexportdialogbase.ui | 220 ++++++++++++++++--------------- 3 files changed, 119 insertions(+), 109 deletions(-) diff --git a/src/app/qgsdxfexportdialog.cpp b/src/app/qgsdxfexportdialog.cpp index 14f51659587c..850f90d37ee3 100644 --- a/src/app/qgsdxfexportdialog.cpp +++ b/src/app/qgsdxfexportdialog.cpp @@ -739,6 +739,10 @@ QgsDxfExportDialog::QgsDxfExportDialog( QWidget *parent, Qt::WindowFlags f ) mBtnLoadSaveSettings->setMenu( menuSettings ); buttonBox->addButton( mBtnLoadSaveSettings, QDialogButtonBox::ResetRole ); + mMessageBar = new QgsMessageBar(); + mMessageBar->setSizePolicy( QSizePolicy::Minimum, QSizePolicy::Fixed ); + mainLayout->insertWidget( 0, mMessageBar ); + mModel->loadLayersOutputAttribute( mModel->rootGroup() ); } @@ -844,7 +848,7 @@ void QgsDxfExportDialog::loadSettingsFromFile() else { QgsDxfExportDialog::settingsDxfLastSettingsDir->setValue( QFileInfo( fileName ).path() ); - QMessageBox::information( this, tr( "Load DXF settings" ), tr( "DXF Export settings loaded!" ) ); + mMessageBar->pushMessage( QString(), tr( "DXF Export settings loaded!" ), Qgis::MessageLevel::Success, 0 ); } } } diff --git a/src/app/qgsdxfexportdialog.h b/src/app/qgsdxfexportdialog.h index 59beaafb57f2..d811e43bf08b 100644 --- a/src/app/qgsdxfexportdialog.h +++ b/src/app/qgsdxfexportdialog.h @@ -26,6 +26,7 @@ #include "qgssettingsentryimpl.h" #include "qgsxmlutils.h" #include "qgsvectorlayerref.h" +#include "qgsmessagebar.h" #include #include @@ -147,6 +148,7 @@ class QgsDxfExportDialog : public QDialog, private Ui::QgsDxfExportDialogBase QgsVectorLayerAndAttributeModel *mModel = nullptr; QgsDxfExportLayerTreeView *mTreeView = nullptr; QPushButton *mBtnLoadSaveSettings = nullptr; + QgsMessageBar *mMessageBar = nullptr; QgsCoordinateReferenceSystem mCRS; }; diff --git a/src/ui/qgsdxfexportdialogbase.ui b/src/ui/qgsdxfexportdialogbase.ui index 2a3acbc211d8..46baa4792078 100644 --- a/src/ui/qgsdxfexportdialogbase.ui +++ b/src/ui/qgsdxfexportdialogbase.ui @@ -13,93 +13,121 @@ DXF Export - - - - - - 0 - 0 - - - - Symbology mode - - - - - - - - 0 - 0 - - - - Save as - - - - - - - - - - - 0 - 0 - - - - Symbology scale - - - - - - + + + + + + + + 0 + 0 + + + + Save as + + + + + + + + + + + 0 + 0 + + + + Symbology mode + + + + + + + + + + + 0 + 0 + + + + Symbology scale + + + + + + + Qt::StrongFocus + + + true + + + + + + + + 0 + 0 + + + + Encoding + + + + + + + + + + + 0 + 0 + + + + CRS + + + + + + + Qt::StrongFocus + + + + + + + + 0 + 0 + + + + Map themes + + + + + + - - - - Qt::StrongFocus - - - true - - - - - - - Qt::StrongFocus - - - - - - - - - - - - - - 0 - 0 - - - - CRS - - - @@ -132,32 +160,6 @@ - - - - - 0 - 0 - - - - Encoding - - - - - - - - 0 - 0 - - - - Map themes - - - @@ -224,6 +226,8 @@ + + From f26786c11f5af13803bf223452953a3e77c0a30b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Germ=C3=A1n=20Carrillo?= Date: Fri, 22 Mar 2024 10:14:24 +0100 Subject: [PATCH 09/11] [dxf] Adjust tab order in DXF Export dialog --- src/ui/qgsdxfexportdialogbase.ui | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ui/qgsdxfexportdialogbase.ui b/src/ui/qgsdxfexportdialogbase.ui index 46baa4792078..16b1a6890140 100644 --- a/src/ui/qgsdxfexportdialogbase.ui +++ b/src/ui/qgsdxfexportdialogbase.ui @@ -257,9 +257,12 @@ mVisibilityPresets mSelectAllButton mDeselectAllButton + mSelectDataDefinedBlocks + mDeselectDataDefinedBlocks mLayerTitleAsName mMTextCheckBox mMapExtentCheckBox + mSelectedFeaturesOnly mForce2d buttonBox From 3eded68a244afa28975c4f9eb123477d2855eff0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Germ=C3=A1n=20Carrillo?= Date: Wed, 27 Mar 2024 14:19:44 +0100 Subject: [PATCH 10/11] [dxf] Adress review on title case consistency --- src/app/qgsdxfexportdialog.cpp | 19 +++++++++---------- src/ui/qgsdxfexportdialogbase.ui | 4 ++-- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/app/qgsdxfexportdialog.cpp b/src/app/qgsdxfexportdialog.cpp index 850f90d37ee3..cecb8dc24c6a 100644 --- a/src/app/qgsdxfexportdialog.cpp +++ b/src/app/qgsdxfexportdialog.cpp @@ -811,7 +811,7 @@ void QgsDxfExportDialog::deselectDataDefinedBlocks() void QgsDxfExportDialog::loadSettingsFromFile() { - const QString fileName = QFileDialog::getOpenFileName( this, tr( "Load DXF Export settings" ), + const QString fileName = QFileDialog::getOpenFileName( this, tr( "Load DXF Export Settings" ), QgsDxfExportDialog::settingsDxfLastSettingsDir->value(), tr( "XML file" ) + " (*.xml)" ); if ( fileName.isNull() ) @@ -839,12 +839,12 @@ void QgsDxfExportDialog::loadSettingsFromFile() } if ( QMessageBox::question( this, - tr( "DXF Export load from XML file" ), + tr( "DXF Export - Load from XML File" ), tr( "Are you sure you want to load settings from XML? This will change some values in the DXF Export dialog." ) ) == QMessageBox::Yes ) { resultFlag = loadSettingsFromXML( domDocument, errorMessage ); if ( !resultFlag ) - QMessageBox::information( this, tr( "Load DXF settings" ), tr( "ERROR: Failed to load DXF Export settings file as %1.\n\n%2" ).arg( fileName, errorMessage ) ); + QMessageBox::information( this, tr( "Load DXF Export Settings" ), tr( "ERROR: Failed to load DXF Export settings file as %1.\n\n%2" ).arg( fileName, errorMessage ) ); else { QgsDxfExportDialog::settingsDxfLastSettingsDir->setValue( QFileInfo( fileName ).path() ); @@ -866,7 +866,7 @@ bool QgsDxfExportDialog::loadSettingsFromXML( QDomDocument &doc, QString &errorM const QDomElement dxfElement = rootElement.firstChildElement( QStringLiteral( "dxf_settings" ) ); if ( dxfElement.isNull() ) { - errorMessage = tr( "The XML file does not correspond to DXF settings. It must have a element." ); + errorMessage = tr( "The XML file does not correspond to DXF Export settings. It must have a element." ); return false; } @@ -928,7 +928,7 @@ bool QgsDxfExportDialog::loadSettingsFromXML( QDomDocument &doc, QString &errorM } else { - QgsDebugMsgLevel( QStringLiteral( " Layer '%1' found in the DXF settings XML file, but not present in the project." ).arg( element.attribute( QStringLiteral( "name" ) ) ), 1 ); + QgsDebugMsgLevel( QStringLiteral( " Layer '%1' found in the DXF Export settings XML file, but not present in the project." ).arg( element.attribute( QStringLiteral( "name" ) ) ), 1 ); } } } @@ -964,7 +964,7 @@ bool QgsDxfExportDialog::loadSettingsFromXML( QDomDocument &doc, QString &errorM void QgsDxfExportDialog::saveSettingsToFile() { - QString outputFileName = QFileDialog::getSaveFileName( this, tr( "Save DXF Export settings as XML" ), + QString outputFileName = QFileDialog::getSaveFileName( this, tr( "Save DXF Export Settings as XML" ), QgsDxfExportDialog::settingsDxfLastSettingsDir->value(), tr( "XML file" ) + " (*.xml)" ); // return dialog focus on Mac @@ -981,7 +981,6 @@ void QgsDxfExportDialog::saveSettingsToFile() outputFileName += QStringLiteral( ".xml" ); } - QString errorMessage; QDomDocument domDocument; saveSettingsToXML( domDocument ); @@ -990,7 +989,7 @@ void QgsDxfExportDialog::saveSettingsToFile() const QFileInfo dirInfo( fileInfo.path() ); //excludes file name if ( !dirInfo.isWritable() ) { - QMessageBox::information( this, tr( "Save DXF settings" ), tr( "The directory containing your dataset needs to be writable!" ) ); + QMessageBox::information( this, tr( "Save DXF Export Settings" ), tr( "The directory containing your dataset needs to be writable!" ) ); return; } @@ -1001,13 +1000,13 @@ void QgsDxfExportDialog::saveSettingsToFile() // save as utf-8 with 2 spaces for indents domDocument.save( fileStream, 2 ); file.close(); - QMessageBox::information( this, tr( "Save DXF settings" ), tr( "Created DXF settings file as %1" ).arg( outputFileName ) ); + QMessageBox::information( this, tr( "Save DXF Export Settings" ), tr( "Created DXF Export settings file as %1" ).arg( outputFileName ) ); QgsDxfExportDialog::settingsDxfLastSettingsDir->setValue( QFileInfo( outputFileName ).absolutePath() ); return; } else { - QMessageBox::information( this, tr( "Save DXF settings" ), tr( "ERROR: Failed to created DXF Export settings file as %1. Check file permissions and retry." ).arg( outputFileName ) ); + QMessageBox::information( this, tr( "Save DXF Export Settings" ), tr( "ERROR: Failed to created DXF Export settings file as %1. Check file permissions and retry." ).arg( outputFileName ) ); return; } } diff --git a/src/ui/qgsdxfexportdialogbase.ui b/src/ui/qgsdxfexportdialogbase.ui index 16b1a6890140..679c46bf1b2c 100644 --- a/src/ui/qgsdxfexportdialogbase.ui +++ b/src/ui/qgsdxfexportdialogbase.ui @@ -147,14 +147,14 @@ - Select Data DefinedBlocks + Select Data Defined Blocks - Deselect Data DefinedBlocks + Deselect Data Defined Blocks From 6ca63b06acbd81b38e383f6221e83b6ed8096ae3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Germ=C3=A1n=20Carrillo?= Date: Fri, 5 Apr 2024 15:49:33 +0200 Subject: [PATCH 11/11] [dxf] Apply review suggestions (use message bar instead of blocking messages, avoid member variable) --- src/app/qgsdxfexportdialog.cpp | 20 +++++++++++--------- src/app/qgsdxfexportdialog.h | 1 - 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/app/qgsdxfexportdialog.cpp b/src/app/qgsdxfexportdialog.cpp index cecb8dc24c6a..6aaa2177c31a 100644 --- a/src/app/qgsdxfexportdialog.cpp +++ b/src/app/qgsdxfexportdialog.cpp @@ -732,12 +732,12 @@ QgsDxfExportDialog::QgsDxfExportDialog( QWidget *parent, Qt::WindowFlags f ) mEncoding->addItems( QgsDxfExport::encodings() ); mEncoding->setCurrentIndex( mEncoding->findText( QgsProject::instance()->readEntry( QStringLiteral( "dxf" ), QStringLiteral( "/lastDxfEncoding" ), settings.value( QStringLiteral( "qgis/lastDxfEncoding" ), "CP1252" ).toString() ) ) ); - mBtnLoadSaveSettings = new QPushButton( tr( "Settings" ), this ); + QPushButton *btnLoadSaveSettings = new QPushButton( tr( "Settings" ), this ); QMenu *menuSettings = new QMenu( this ); menuSettings->addAction( tr( "Load Settings from File…" ), this, &QgsDxfExportDialog::loadSettingsFromFile ); menuSettings->addAction( tr( "Save Settings to File…" ), this, &QgsDxfExportDialog::saveSettingsToFile ); - mBtnLoadSaveSettings->setMenu( menuSettings ); - buttonBox->addButton( mBtnLoadSaveSettings, QDialogButtonBox::ResetRole ); + btnLoadSaveSettings->setMenu( menuSettings ); + buttonBox->addButton( btnLoadSaveSettings, QDialogButtonBox::ResetRole ); mMessageBar = new QgsMessageBar(); mMessageBar->setSizePolicy( QSizePolicy::Minimum, QSizePolicy::Fixed ); @@ -844,7 +844,9 @@ void QgsDxfExportDialog::loadSettingsFromFile() { resultFlag = loadSettingsFromXML( domDocument, errorMessage ); if ( !resultFlag ) - QMessageBox::information( this, tr( "Load DXF Export Settings" ), tr( "ERROR: Failed to load DXF Export settings file as %1.\n\n%2" ).arg( fileName, errorMessage ) ); + { + mMessageBar->pushWarning( tr( "Load DXF Export Settings" ), tr( "Failed to load DXF Export settings file as %1. Details: %2" ).arg( fileName, errorMessage ) ); + } else { QgsDxfExportDialog::settingsDxfLastSettingsDir->setValue( QFileInfo( fileName ).path() ); @@ -859,14 +861,14 @@ bool QgsDxfExportDialog::loadSettingsFromXML( QDomDocument &doc, QString &errorM const QDomElement rootElement = doc.firstChildElement( QStringLiteral( "qgis" ) ); if ( rootElement.isNull() ) { - errorMessage = tr( "Root element could not be found" ); + errorMessage = tr( "Root <qgis> element could not be found." ); return false; } const QDomElement dxfElement = rootElement.firstChildElement( QStringLiteral( "dxf_settings" ) ); if ( dxfElement.isNull() ) { - errorMessage = tr( "The XML file does not correspond to DXF Export settings. It must have a element." ); + errorMessage = tr( "The XML file does not correspond to DXF Export settings. It must have a <dxf-settings> element." ); return false; } @@ -989,7 +991,7 @@ void QgsDxfExportDialog::saveSettingsToFile() const QFileInfo dirInfo( fileInfo.path() ); //excludes file name if ( !dirInfo.isWritable() ) { - QMessageBox::information( this, tr( "Save DXF Export Settings" ), tr( "The directory containing your dataset needs to be writable!" ) ); + mMessageBar->pushInfo( tr( "Save DXF Export Settings" ), tr( "The directory containing your dataset needs to be writable!" ) ); return; } @@ -1000,13 +1002,13 @@ void QgsDxfExportDialog::saveSettingsToFile() // save as utf-8 with 2 spaces for indents domDocument.save( fileStream, 2 ); file.close(); - QMessageBox::information( this, tr( "Save DXF Export Settings" ), tr( "Created DXF Export settings file as %1" ).arg( outputFileName ) ); + mMessageBar->pushSuccess( tr( "Save DXF Export Settings" ), tr( "Created DXF Export settings file as %1" ).arg( outputFileName ) ); QgsDxfExportDialog::settingsDxfLastSettingsDir->setValue( QFileInfo( outputFileName ).absolutePath() ); return; } else { - QMessageBox::information( this, tr( "Save DXF Export Settings" ), tr( "ERROR: Failed to created DXF Export settings file as %1. Check file permissions and retry." ).arg( outputFileName ) ); + mMessageBar->pushWarning( tr( "Save DXF Export Settings" ), tr( "Failed to created DXF Export settings file as %1. Check file permissions and retry." ).arg( outputFileName ) ); return; } } diff --git a/src/app/qgsdxfexportdialog.h b/src/app/qgsdxfexportdialog.h index d811e43bf08b..a6fd724ddda0 100644 --- a/src/app/qgsdxfexportdialog.h +++ b/src/app/qgsdxfexportdialog.h @@ -147,7 +147,6 @@ class QgsDxfExportDialog : public QDialog, private Ui::QgsDxfExportDialogBase FieldSelectorDelegate *mFieldSelectorDelegate = nullptr; QgsVectorLayerAndAttributeModel *mModel = nullptr; QgsDxfExportLayerTreeView *mTreeView = nullptr; - QPushButton *mBtnLoadSaveSettings = nullptr; QgsMessageBar *mMessageBar = nullptr; QgsCoordinateReferenceSystem mCRS;