diff --git a/src/gui/qgsnewgeopackagelayerdialog.cpp b/src/gui/qgsnewgeopackagelayerdialog.cpp index 0da9df6d938..b17a5e2b8eb 100644 --- a/src/gui/qgsnewgeopackagelayerdialog.cpp +++ b/src/gui/qgsnewgeopackagelayerdialog.cpp @@ -51,8 +51,6 @@ QgsNewGeoPackageLayerDialog::QgsNewGeoPackageLayerDialog( QWidget *parent, Qt::W connect( mRemoveAttributeButton, &QToolButton::clicked, this, &QgsNewGeoPackageLayerDialog::mRemoveAttributeButton_clicked ); connect( mFieldTypeBox, static_cast( &QComboBox::currentIndexChanged ), this, &QgsNewGeoPackageLayerDialog::mFieldTypeBox_currentIndexChanged ); connect( mGeometryTypeBox, static_cast( &QComboBox::currentIndexChanged ), this, &QgsNewGeoPackageLayerDialog::mGeometryTypeBox_currentIndexChanged ); - connect( mSelectDatabaseButton, &QToolButton::clicked, this, &QgsNewGeoPackageLayerDialog::mSelectDatabaseButton_clicked ); - connect( mDatabaseEdit, &QLineEdit::textChanged, this, &QgsNewGeoPackageLayerDialog::mDatabaseEdit_textChanged ); connect( mTableNameEdit, &QLineEdit::textChanged, this, &QgsNewGeoPackageLayerDialog::mTableNameEdit_textChanged ); connect( mTableNameEdit, &QLineEdit::textEdited, this, &QgsNewGeoPackageLayerDialog::mTableNameEdit_textEdited ); connect( mLayerIdentifierEdit, &QLineEdit::textEdited, this, &QgsNewGeoPackageLayerDialog::mLayerIdentifierEdit_textEdited ); @@ -102,12 +100,29 @@ QgsNewGeoPackageLayerDialog::QgsNewGeoPackageLayerDialog( QWidget *parent, Qt::W connect( mFieldNameEdit, &QLineEdit::textChanged, this, &QgsNewGeoPackageLayerDialog::fieldNameChanged ); connect( mAttributeView, &QTreeWidget::itemSelectionChanged, this, &QgsNewGeoPackageLayerDialog::selectionChanged ); connect( mTableNameEdit, &QLineEdit::textChanged, this, &QgsNewGeoPackageLayerDialog::checkOk ); - connect( mDatabaseEdit, &QLineEdit::textChanged, this, &QgsNewGeoPackageLayerDialog::checkOk ); mAddAttributeButton->setEnabled( false ); mRemoveAttributeButton->setEnabled( false ); mCheckBoxCreateSpatialIndex->setChecked( true ); + + mDatabase->setStorageMode( QgsFileWidget::SaveFile ); + mDatabase->setFilter( tr( "GeoPackage" ) + " (*.gpkg)" ); + mDatabase->setDialogTitle( tr( "Select Existing or Create a New GeoPackage Database File..." ) ); + mDatabase->setDefaultRoot( settings.value( QStringLiteral( "UI/lastVectorFileFilterDir" ), QDir::homePath() ).toString() ); + mDatabase->setConfirmOverwrite( false ); + connect( mDatabase, &QgsFileWidget::fileChanged, this, [ = ]( const QString & filePath ) + { + QgsSettings settings; + QFileInfo tmplFileInfo( filePath ); + settings.setValue( QStringLiteral( "UI/lastVectorFileFilterDir" ), tmplFileInfo.absolutePath() ); + if ( !filePath.isEmpty() && !mTableNameEdited ) + { + QFileInfo fileInfo( filePath ); + mTableNameEdit->setText( fileInfo.baseName() ); + } + checkOk(); + } ); } QgsNewGeoPackageLayerDialog::~QgsNewGeoPackageLayerDialog() @@ -123,10 +138,7 @@ void QgsNewGeoPackageLayerDialog::setCrs( const QgsCoordinateReferenceSystem &cr void QgsNewGeoPackageLayerDialog::lockDatabasePath() { - mDatabaseEdit->setReadOnly( true ); - mSelectDatabaseButton->hide(); - mSelectDatabaseButton->deleteLater(); - mSelectDatabaseButton = nullptr; + mDatabase->setReadOnly( true ); } void QgsNewGeoPackageLayerDialog::mFieldTypeBox_currentIndexChanged( int ) @@ -150,34 +162,6 @@ void QgsNewGeoPackageLayerDialog::mGeometryTypeBox_currentIndexChanged( int ) mCrsSelector->setEnabled( isSpatial ); } -void QgsNewGeoPackageLayerDialog::mSelectDatabaseButton_clicked() -{ - QString fileName = QFileDialog::getSaveFileName( this, tr( "Select existing or create new GeoPackage Database File" ), - QDir::homePath(), - tr( "GeoPackage" ) + " (*.gpkg)", - nullptr, - QFileDialog::DontConfirmOverwrite ); - - if ( fileName.isEmpty() ) - return; - - if ( !fileName.endsWith( QLatin1String( ".gpkg" ), Qt::CaseInsensitive ) ) - { - fileName += QLatin1String( ".gpkg" ); - } - - mDatabaseEdit->setText( fileName ); -} - -void QgsNewGeoPackageLayerDialog::mDatabaseEdit_textChanged( const QString &text ) -{ - if ( !text.isEmpty() && !mTableNameEdited ) - { - QFileInfo fileInfo( text ); - mTableNameEdit->setText( fileInfo.baseName() ); - } -} - void QgsNewGeoPackageLayerDialog::mTableNameEdit_textChanged( const QString &text ) { mTableNameEdited = !text.isEmpty(); @@ -201,7 +185,7 @@ void QgsNewGeoPackageLayerDialog::mLayerIdentifierEdit_textEdited( const QString void QgsNewGeoPackageLayerDialog::checkOk() { - bool ok = !mDatabaseEdit->text().isEmpty() && + bool ok = !mDatabase->filePath().isEmpty() && !mTableNameEdit->text().isEmpty(); mOkButton->setEnabled( ok ); } @@ -258,7 +242,10 @@ void QgsNewGeoPackageLayerDialog::buttonBox_rejected() bool QgsNewGeoPackageLayerDialog::apply() { - QString fileName( mDatabaseEdit->text() ); + QString fileName( mDatabase->filePath() ); + if ( !fileName.endsWith( QLatin1String( ".gpkg" ), Qt::CaseInsensitive ) ) + fileName += QLatin1String( ".gpkg" ); + bool createNewDb = false; if ( QFile( fileName ).exists( fileName ) ) @@ -490,7 +477,7 @@ bool QgsNewGeoPackageLayerDialog::apply() } hDS.reset(); - QString uri( QStringLiteral( "%1|layername=%2" ).arg( mDatabaseEdit->text(), tableName ) ); + QString uri( QStringLiteral( "%1|layername=%2" ).arg( fileName, tableName ) ); QString userVisiblelayerName( layerIdentifier.isEmpty() ? tableName : layerIdentifier ); QgsVectorLayer *layer = new QgsVectorLayer( uri, userVisiblelayerName, QStringLiteral( "ogr" ) ); if ( layer->isValid() ) diff --git a/src/gui/qgsnewgeopackagelayerdialog.h b/src/gui/qgsnewgeopackagelayerdialog.h index fb6f6f678ab..c2982a7d0c4 100644 --- a/src/gui/qgsnewgeopackagelayerdialog.h +++ b/src/gui/qgsnewgeopackagelayerdialog.h @@ -54,13 +54,13 @@ class GUI_EXPORT QgsNewGeoPackageLayerDialog: public QDialog, private Ui::QgsNew * Returns the database path * \since QGIS 3.0 */ - QString databasePath() const { return mDatabaseEdit->text(); } + QString databasePath() const { return mDatabase->filePath(); } /** * Sets the initial database \a path * \since QGIS 3.0 */ - void setDatabasePath( const QString &path ) { mDatabaseEdit->setText( path ); } + void setDatabasePath( const QString &path ) { mDatabase->setFilePath( path ); } /** * Sets the database path widgets to a locked and read-only mode. @@ -82,8 +82,6 @@ class GUI_EXPORT QgsNewGeoPackageLayerDialog: public QDialog, private Ui::QgsNew void mRemoveAttributeButton_clicked(); void mFieldTypeBox_currentIndexChanged( int index ); void mGeometryTypeBox_currentIndexChanged( int index ); - void mSelectDatabaseButton_clicked(); - void mDatabaseEdit_textChanged( const QString &text ); void mTableNameEdit_textChanged( const QString &text ); void mTableNameEdit_textEdited( const QString &text ); void mLayerIdentifierEdit_textEdited( const QString &text ); diff --git a/src/ui/qgsnewgeopackagelayerdialogbase.ui b/src/ui/qgsnewgeopackagelayerdialogbase.ui index 121f392ab9f..0acbae0dbc7 100644 --- a/src/ui/qgsnewgeopackagelayerdialogbase.ui +++ b/src/ui/qgsnewgeopackagelayerdialogbase.ui @@ -149,7 +149,7 @@ - + 0 @@ -161,16 +161,6 @@ - - - - <html><head/><body><p>Select an existing or create a new database</p></body></html> - - - - - - @@ -478,11 +468,16 @@
qgsscrollarea.h
1 + + QgsFileWidget + QWidget +
qgsfilewidget.h
+ 1 +
scrollArea - mDatabaseEdit - mSelectDatabaseButton + mDatabase mTableNameEdit mLayerIdentifierEdit mLayerDescriptionEdit diff --git a/tests/src/python/test_qgsnewgeopackagelayerdialog.py b/tests/src/python/test_qgsnewgeopackagelayerdialog.py index 41aefec87c8..63de1a3c117 100644 --- a/tests/src/python/test_qgsnewgeopackagelayerdialog.py +++ b/tests/src/python/test_qgsnewgeopackagelayerdialog.py @@ -63,7 +63,7 @@ class TestPyQgsNewGeoPackageLayerDialog(unittest.TestCase): dialog = QgsNewGeoPackageLayerDialog() dialog.setProperty("hideDialogs", True) - mDatabaseEdit = dialog.findChild(QLineEdit, "mDatabaseEdit") + mDatabase = dialog.findChild(QLineEdit, "mDatabase") buttonBox = dialog.findChild(QDialogButtonBox, "buttonBox") ok_button = buttonBox.button(QDialogButtonBox.Ok) mTableNameEdit = dialog.findChild(QLineEdit, "mTableNameEdit") @@ -86,7 +86,7 @@ class TestPyQgsNewGeoPackageLayerDialog(unittest.TestCase): self.assertFalse(ok_button.isEnabled()) dbname = os.path.join(self.basetestpath, 'test.gpkg') - mDatabaseEdit.setText(dbname) + mDatabase.setFilePath(dbname) self.assertEqual(mTableNameEdit.text(), 'test') self.assertEqual(mLayerIdentifierEdit.text(), 'test') self.assertTrue(ok_button.isEnabled()) @@ -261,7 +261,7 @@ class TestPyQgsNewGeoPackageLayerDialog(unittest.TestCase): QgsProject.instance().removeAllMapLayers() # Try invalid path - mDatabaseEdit.setText('/this/is/invalid/test.gpkg') + mDatabase.setFilePath('/this/is/invalid/test.gpkg') self.accepted = False QTest.mouseClick(ok_button, Qt.LeftButton) self.assertFalse(self.accepted)