mirror of
https://github.com/qgis/QGIS.git
synced 2025-02-22 00:06:12 -05:00
Merge pull request #60663 from hxbb00/fix-csv-file-not-release-after-close-ds-dialog
fix: Data Source Manager doesn't release CSV file after closing dialog
This commit is contained in:
commit
31c4399650
@ -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<QgsDelimitedTextFile>() )
|
||||
, 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();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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<bool> &isValidNumber, const QString &xname, const QString &yname );
|
||||
|
||||
private:
|
||||
std::unique_ptr<QgsDelimitedTextFile> 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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user