diff --git a/python/gui/auto_generated/qgsnewvectorlayerdialog.sip.in b/python/gui/auto_generated/qgsnewvectorlayerdialog.sip.in index d7f122c86620..fa5a81b394fa 100644 --- a/python/gui/auto_generated/qgsnewvectorlayerdialog.sip.in +++ b/python/gui/auto_generated/qgsnewvectorlayerdialog.sip.in @@ -107,6 +107,10 @@ Sets the ``crs`` value for the new layer in the dialog. .. versionadded:: 3.0 %End + public slots: + virtual void accept(); + + }; /************************************************************************ diff --git a/src/gui/qgsnewvectorlayerdialog.cpp b/src/gui/qgsnewvectorlayerdialog.cpp index bdd9d14a5386..f41650ef856d 100644 --- a/src/gui/qgsnewvectorlayerdialog.cpp +++ b/src/gui/qgsnewvectorlayerdialog.cpp @@ -28,6 +28,7 @@ #include "qgsogrprovider.h" #include "qgsgui.h" #include "qgsiconutils.h" +#include "qgsfileutils.h" #include #include @@ -109,21 +110,9 @@ QgsNewVectorLayerDialog::QgsNewVectorLayerDialog( QWidget *parent, Qt::WindowFla mAttributeView->addTopLevelItem( new QTreeWidgetItem( QStringList() << QStringLiteral( "id" ) << QStringLiteral( "Integer" ) << QStringLiteral( "10" ) << QString() ) ); connect( mNameEdit, &QLineEdit::textChanged, this, &QgsNewVectorLayerDialog::nameChanged ); connect( mAttributeView, &QTreeWidget::itemSelectionChanged, this, &QgsNewVectorLayerDialog::selectionChanged ); - connect( mGeometryTypeBox, static_cast( &QComboBox::currentIndexChanged ), this, [ = ]( int index ) + connect( mGeometryTypeBox, static_cast( &QComboBox::currentIndexChanged ), this, [ = ]( int ) { - QString fileName = mFileName->filePath(); - if ( !fileName.isEmpty() ) - { - if ( index == 0 ) - { - fileName = fileName.replace( fileName.lastIndexOf( QLatin1String( ".shp" ), -1, Qt::CaseInsensitive ), 4, QLatin1String( ".dbf" ) ); - } - else - { - fileName = fileName.replace( fileName.lastIndexOf( QLatin1String( ".dbf" ), -1, Qt::CaseInsensitive ), 4, QLatin1String( ".shp" ) ); - } - mFileName->setFilePath( fileName ); - } + updateExtension(); checkOk(); } ); @@ -293,6 +282,39 @@ QString QgsNewVectorLayerDialog::runAndCreateLayer( QWidget *parent, QString *pE return res; } +void QgsNewVectorLayerDialog::updateExtension() +{ + QString fileName = filename(); + const QString fileformat = selectedFileFormat(); + const QgsWkbTypes::Type geometrytype = selectedType(); + if ( fileformat == QLatin1String( "ESRI Shapefile" ) ) + { + if ( geometrytype != QgsWkbTypes::NoGeometry ) + { + fileName = fileName.replace( fileName.lastIndexOf( QLatin1String( ".dbf" ), -1, Qt::CaseInsensitive ), 4, QLatin1String( ".shp" ) ); + fileName = QgsFileUtils::ensureFileNameHasExtension( fileName, { QStringLiteral( "shp" ) } ); + } + else + { + fileName = fileName.replace( fileName.lastIndexOf( QLatin1String( ".shp" ), -1, Qt::CaseInsensitive ), 4, QLatin1String( ".dbf" ) ); + fileName = QgsFileUtils::ensureFileNameHasExtension( fileName, { QStringLiteral( "dbf" ) } ); + } + } + setFilename( fileName ); + +} + +void QgsNewVectorLayerDialog::accept() +{ + updateExtension(); + + if ( QFile::exists( filename() ) && QMessageBox::warning( this, tr( "New ShapeFile Layer" ), tr( "The layer already exists. Are you sure you want to overwrite the existing file?" ), + QMessageBox::Yes | QMessageBox::Cancel, QMessageBox::Cancel ) != QMessageBox::Yes ) + return; + + QDialog::accept(); +} + QString QgsNewVectorLayerDialog::execAndCreateLayer( QString &errorMessage, QWidget *parent, const QString &initialPath, QString *encoding, const QgsCoordinateReferenceSystem &crs ) { errorMessage.clear(); @@ -305,12 +327,10 @@ QString QgsNewVectorLayerDialog::execAndCreateLayer( QString &errorMessage, QWid return QString(); } - if ( QFile::exists( geomDialog.filename() ) && QMessageBox::warning( parent, tr( "New ShapeFile Layer" ), tr( "The layer already exists. Are you sure you want to overwrite the existing file?" ), - QMessageBox::Yes | QMessageBox::Cancel, QMessageBox::Cancel ) != QMessageBox::Yes ) - return QString(); - - const QgsWkbTypes::Type geometrytype = geomDialog.selectedType(); const QString fileformat = geomDialog.selectedFileFormat(); + const QgsWkbTypes::Type geometrytype = geomDialog.selectedType(); + QString fileName = geomDialog.filename(); + const QString enc = geomDialog.selectedFileEncoding(); QgsDebugMsg( QStringLiteral( "New file format will be: %1" ).arg( fileformat ) ); @@ -318,17 +338,6 @@ QString QgsNewVectorLayerDialog::execAndCreateLayer( QString &errorMessage, QWid geomDialog.attributes( attributes ); QgsSettings settings; - QString fileName = geomDialog.filename(); - if ( fileformat == QLatin1String( "ESRI Shapefile" ) && ( geometrytype != QgsWkbTypes::NoGeometry && !fileName.endsWith( QLatin1String( ".shp" ), Qt::CaseInsensitive ) ) ) - fileName += QLatin1String( ".shp" ); - else if ( fileformat == QLatin1String( "ESRI Shapefile" ) && ( geometrytype == QgsWkbTypes::NoGeometry && !fileName.endsWith( QLatin1String( ".dbf" ), Qt::CaseInsensitive ) ) ) - { - if ( fileName.endsWith( QLatin1String( ".shp" ), Qt::CaseInsensitive ) ) - fileName = fileName.replace( fileName.lastIndexOf( QLatin1String( ".shp" ), -1, Qt::CaseInsensitive ), 4, QLatin1String( ".dbf" ) ); - else - fileName += QLatin1String( ".dbf" ); - } - settings.setValue( QStringLiteral( "UI/lastVectorFileFilterDir" ), QFileInfo( fileName ).absolutePath() ); settings.setValue( QStringLiteral( "UI/encoding" ), enc ); diff --git a/src/gui/qgsnewvectorlayerdialog.h b/src/gui/qgsnewvectorlayerdialog.h index 2890d6bad9fa..c9d283166104 100644 --- a/src/gui/qgsnewvectorlayerdialog.h +++ b/src/gui/qgsnewvectorlayerdialog.h @@ -112,6 +112,9 @@ class GUI_EXPORT QgsNewVectorLayerDialog: public QDialog, private Ui::QgsNewVect */ void setCrs( const QgsCoordinateReferenceSystem &crs ); + public slots: + void accept() override; + private slots: void mAddAttributeButton_clicked(); void mRemoveAttributeButton_clicked(); @@ -126,6 +129,8 @@ class GUI_EXPORT QgsNewVectorLayerDialog: public QDialog, private Ui::QgsNewVect private: QPushButton *mOkButton = nullptr; + + void updateExtension(); }; #endif //qgsnewvectorlayerdialog_H