diff --git a/src/providers/delimitedtext/qgsdelimitedtextsourceselect.cpp b/src/providers/delimitedtext/qgsdelimitedtextsourceselect.cpp index ad4254b285c..9b679519510 100644 --- a/src/providers/delimitedtext/qgsdelimitedtextsourceselect.cpp +++ b/src/providers/delimitedtext/qgsdelimitedtextsourceselect.cpp @@ -37,7 +37,6 @@ const int MAX_SAMPLE_LENGTH = 200; QgsDelimitedTextSourceSelect::QgsDelimitedTextSourceSelect( QWidget *parent, Qt::WindowFlags fl, QgsProviderRegistry::WidgetMode theWidgetMode ) : QgsAbstractDataSourceWidget( parent, fl, theWidgetMode ) - , mFile( std::make_unique() ) , mSettingsKey( QStringLiteral( "/Plugin-DelimitedText" ) ) { setupUi( this ); @@ -137,7 +136,8 @@ void QgsDelimitedTextSourceSelect::addButtonClicked() return; } } - if ( !mFile->isValid() ) + QgsDelimitedTextFile mFile; + if ( !loadDelimitedFileDefinition( mFile ) ) { QMessageBox::warning( this, tr( "Invalid delimited text file" ), tr( "Please enter a valid file and delimiter" ) ); return; @@ -146,7 +146,7 @@ void QgsDelimitedTextSourceSelect::addButtonClicked() cancelScanTask(); //Build the delimited text URI from the user provided information - const QString datasourceUrl { url() }; + const QString datasourceUrl { url( mFile ) }; // store the settings saveSettings(); @@ -341,28 +341,28 @@ void QgsDelimitedTextSourceSelect::saveSettingsForFile( const QString &filename } -bool QgsDelimitedTextSourceSelect::loadDelimitedFileDefinition() +bool QgsDelimitedTextSourceSelect::loadDelimitedFileDefinition( QgsDelimitedTextFile &file ) { - mFile->setFileName( mFileWidget->filePath() ); - mFile->setEncoding( cmbEncoding->currentText() ); + file.setFileName( mFileWidget->filePath() ); + file.setEncoding( cmbEncoding->currentText() ); if ( delimiterChars->isChecked() ) { - mFile->setTypeCSV( selectedChars(), txtQuoteChars->text(), txtEscapeChars->text() ); + file.setTypeCSV( selectedChars(), txtQuoteChars->text(), txtEscapeChars->text() ); } else if ( delimiterRegexp->isChecked() ) { - mFile->setTypeRegexp( txtDelimiterRegexp->text() ); + file.setTypeRegexp( txtDelimiterRegexp->text() ); } else { - mFile->setTypeCSV(); + file.setTypeCSV(); } - mFile->setSkipLines( rowCounter->value() ); - mFile->setUseHeader( cbxUseHeader->isChecked() ); - mFile->setDiscardEmptyFields( cbxSkipEmptyFields->isChecked() ); - mFile->setTrimFields( cbxTrimFields->isChecked() ); - mFile->setMaxFields( mMaxFields ); - return mFile->isValid(); + file.setSkipLines( rowCounter->value() ); + file.setUseHeader( cbxUseHeader->isChecked() ); + file.setDiscardEmptyFields( cbxSkipEmptyFields->isChecked() ); + file.setTrimFields( cbxTrimFields->isChecked() ); + file.setMaxFields( mMaxFields ); + return file.isValid(); } @@ -395,8 +395,8 @@ void QgsDelimitedTextSourceSelect::updateFieldLists() tblSample->clear(); tblSample->setColumnCount( 0 ); tblSample->setRowCount( 0 ); - - if ( !loadDelimitedFileDefinition() ) + QgsDelimitedTextFile mFile; + if ( !loadDelimitedFileDefinition( mFile ) ) return; // Put a sample set of records into the sample box. Also while scanning assess suitability of @@ -413,7 +413,7 @@ void QgsDelimitedTextSourceSelect::updateFieldLists() while ( counter < mExampleRowCount ) { - const QgsDelimitedTextFile::Status status = mFile->nextRecord( values ); + const QgsDelimitedTextFile::Status status = mFile.nextRecord( values ); if ( status == QgsDelimitedTextFile::RecordEOF ) break; if ( status != QgsDelimitedTextFile::RecordOk ) @@ -488,7 +488,7 @@ void QgsDelimitedTextSourceSelect::updateFieldLists() } - QStringList fieldList = mFile->fieldNames(); + QStringList fieldList = mFile.fieldNames(); if ( isEmpty.size() < fieldList.size() ) { @@ -537,7 +537,7 @@ void QgsDelimitedTextSourceSelect::updateFieldLists() // Run the scan in a separate thread cancelScanTask(); - mScanTask = new QgsDelimitedTextFileScanTask( url( /* skip overridden types */ true ) ); + mScanTask = new QgsDelimitedTextFileScanTask( url( mFile, /* skip overridden types */ true ) ); mCancelButton->show(); connect( mScanTask, &QgsDelimitedTextFileScanTask::scanCompleted, this, [=]( const QgsFields &fields ) { updateFieldTypes( fields ); @@ -745,6 +745,7 @@ bool QgsDelimitedTextSourceSelect::validate() message = tr( "At least one delimiter character must be specified" ); } + QgsDelimitedTextFile mFile; if ( message.isEmpty() && delimiterRegexp->isChecked() ) { const QRegularExpression re( txtDelimiterRegexp->text() ); @@ -763,7 +764,7 @@ bool QgsDelimitedTextSourceSelect::validate() // continue... } // Hopefully won't hit this none-specific message, but just in case ... - else if ( !mFile->isValid() ) + else if ( !loadDelimitedFileDefinition( mFile ) ) { message = tr( "Definition of filename and delimiters is not valid" ); } @@ -860,9 +861,9 @@ void QgsDelimitedTextSourceSelect::updateCrsWidgetVisibility() textLabelCrs->setVisible( !geomTypeNone->isChecked() ); } -QString QgsDelimitedTextSourceSelect::url( bool skipOverriddenTypes ) +QString QgsDelimitedTextSourceSelect::url( QgsDelimitedTextFile &file, bool skipOverriddenTypes ) { - QUrl url = mFile->url(); + QUrl url = file.url(); QUrlQuery query( url ); query.addQueryItem( QStringLiteral( "detectTypes" ), cbxDetectTypes->isChecked() ? QStringLiteral( "yes" ) : QStringLiteral( "no" ) ); @@ -968,7 +969,7 @@ void QgsDelimitedTextSourceSelect::cancelScanTask() if ( mScanTask ) { mScanTask->cancel(); - mScanTask = nullptr; + mScanTask.clear(); } } diff --git a/src/providers/delimitedtext/qgsdelimitedtextsourceselect.h b/src/providers/delimitedtext/qgsdelimitedtextsourceselect.h index 18159a07f57..95d2abf5a17 100644 --- a/src/providers/delimitedtext/qgsdelimitedtextsourceselect.h +++ b/src/providers/delimitedtext/qgsdelimitedtextsourceselect.h @@ -91,7 +91,7 @@ class QgsDelimitedTextSourceSelect : public QgsAbstractDataSourceWidget, private QgsDelimitedTextSourceSelect( QWidget *parent = nullptr, Qt::WindowFlags fl = QgsGuiUtils::ModalDialogFlags, QgsProviderRegistry::WidgetMode widgetMode = QgsProviderRegistry::WidgetMode::Standalone ); private: - bool loadDelimitedFileDefinition(); + bool loadDelimitedFileDefinition( QgsDelimitedTextFile &file ); void updateFieldLists(); QString selectedChars(); void setSelectedChars( const QString &delimiters ); @@ -102,7 +102,6 @@ class QgsDelimitedTextSourceSelect : public QgsAbstractDataSourceWidget, private bool trySetXYField( QStringList &fields, QList &isValidNumber, const QString &xname, const QString &yname ); private: - std::unique_ptr mFile; int mExampleRowCount = 20; int mBadRowCount = 0; QgsFields mFields; //!< Stores the fields as returned by the provider to determine if their types were overridden @@ -116,7 +115,7 @@ class QgsDelimitedTextSourceSelect : public QgsAbstractDataSourceWidget, private QButtonGroup *bgGeomType = nullptr; void showHelp(); void updateCrsWidgetVisibility(); - QString url( bool skipOverriddenTypes = false ); + QString url( QgsDelimitedTextFile &file, bool skipOverriddenTypes = false ); public slots: void addButtonClicked() override;