Skip to content

Commit 4587961

Browse files
authoredSep 19, 2017
Merge pull request #5214 from boundlessgeo/gpkg_import_master_task
Geopackage import multiple files master task
2 parents f5c4fdf + 1f0e73a commit 4587961

File tree

2 files changed

+44
-10
lines changed

2 files changed

+44
-10
lines changed
 

‎src/providers/ogr/qgsgeopackagedataitems.cpp

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include "qgsmessageoutput.h"
2929
#include "qgsvectorlayerexporter.h"
3030
#include "qgsgeopackagerasterwritertask.h"
31+
#include "qgstaskmanager.h"
3132

3233
#include <QAction>
3334
#include <QMessageBox>
@@ -202,6 +203,10 @@ bool QgsGeoPackageCollectionItem::handleDrop( const QMimeData *data, Qt::DropAct
202203
QStringList importResults;
203204
bool hasError = false;
204205

206+
// Main task
207+
std::unique_ptr< QgsConcurrentFileWriterImportTask > mainTask( new QgsConcurrentFileWriterImportTask( tr( "GeoPackage import" ) ) );
208+
QgsTaskList importTasks;
209+
205210
const auto lst = QgsMimeDataUtils::decodeUriList( data );
206211
for ( const QgsMimeDataUtils::Uri &dropUri : lst )
207212
{
@@ -263,18 +268,19 @@ bool QgsGeoPackageCollectionItem::handleDrop( const QMimeData *data, Qt::DropAct
263268
options.insert( QStringLiteral( "update" ), true );
264269
options.insert( QStringLiteral( "overwrite" ), true );
265270
options.insert( QStringLiteral( "layerName" ), dropUri.name );
266-
267-
std::unique_ptr< QgsVectorLayerExporterTask > exportTask( new QgsVectorLayerExporterTask( vectorSrcLayer, uri, QStringLiteral( "ogr" ), vectorSrcLayer->crs(), options, owner ) );
271+
QgsVectorLayerExporterTask *exportTask = new QgsVectorLayerExporterTask( vectorSrcLayer, uri, QStringLiteral( "ogr" ), vectorSrcLayer->crs(), options, owner ) ;
272+
mainTask->addSubTask( exportTask, importTasks );
273+
importTasks << exportTask;
268274
// when export is successful:
269-
connect( exportTask.get(), &QgsVectorLayerExporterTask::exportComplete, this, [ = ]()
275+
connect( exportTask, &QgsVectorLayerExporterTask::exportComplete, this, [ = ]()
270276
{
271277
// this is gross - TODO - find a way to get access to messageBar from data items
272278
QMessageBox::information( nullptr, tr( "Import to GeoPackage database" ), tr( "Import was successful." ) );
273279
refreshConnections();
274280
} );
275281

276282
// when an error occurs:
277-
connect( exportTask.get(), &QgsVectorLayerExporterTask::errorOccurred, this, [ = ]( int error, const QString & errorMessage )
283+
connect( exportTask, &QgsVectorLayerExporterTask::errorOccurred, this, [ = ]( int error, const QString & errorMessage )
278284
{
279285
if ( error != QgsVectorLayerExporter::ErrUserCanceled )
280286
{
@@ -285,22 +291,22 @@ bool QgsGeoPackageCollectionItem::handleDrop( const QMimeData *data, Qt::DropAct
285291
}
286292
} );
287293

288-
QgsApplication::taskManager()->addTask( exportTask.release() );
289294
}
290295
else // Import raster
291296
{
292-
293-
std::unique_ptr< QgsGeoPackageRasterWriterTask > exportTask( new QgsGeoPackageRasterWriterTask( dropUri, mPath ) );
297+
QgsGeoPackageRasterWriterTask *exportTask = new QgsGeoPackageRasterWriterTask( dropUri, mPath ) ;
298+
mainTask->addSubTask( exportTask, importTasks );
299+
importTasks << exportTask;
294300
// when export is successful:
295-
connect( exportTask.get(), &QgsGeoPackageRasterWriterTask::writeComplete, this, [ = ]()
301+
connect( exportTask, &QgsGeoPackageRasterWriterTask::writeComplete, this, [ = ]()
296302
{
297303
// this is gross - TODO - find a way to get access to messageBar from data items
298304
QMessageBox::information( nullptr, tr( "Import to GeoPackage database" ), tr( "Import was successful." ) );
299305
refreshConnections();
300306
} );
301307

302308
// when an error occurs:
303-
connect( exportTask.get(), &QgsGeoPackageRasterWriterTask::errorOccurred, this, [ = ]( QgsGeoPackageRasterWriter::WriterError error, const QString & errorMessage )
309+
connect( exportTask, &QgsGeoPackageRasterWriterTask::errorOccurred, this, [ = ]( QgsGeoPackageRasterWriter::WriterError error, const QString & errorMessage )
304310
{
305311
if ( error != QgsGeoPackageRasterWriter::WriterError::ErrUserCanceled )
306312
{
@@ -315,7 +321,6 @@ bool QgsGeoPackageCollectionItem::handleDrop( const QMimeData *data, Qt::DropAct
315321
deleteGeoPackageRasterLayer( QStringLiteral( "GPKG:%1:%2" ).arg( mPath, dropUri.name ), deleteErr );
316322
} );
317323

318-
QgsApplication::taskManager()->addTask( exportTask.release() );
319324
}
320325
} // do not overwrite
321326
}
@@ -334,6 +339,10 @@ bool QgsGeoPackageCollectionItem::handleDrop( const QMimeData *data, Qt::DropAct
334339
output->setMessage( tr( "Failed to import some layers!\n\n" ) + importResults.join( QStringLiteral( "\n" ) ), QgsMessageOutput::MessageText );
335340
output->showMessage();
336341
}
342+
if ( ! importTasks.isEmpty() )
343+
{
344+
QgsApplication::taskManager()->addTask( mainTask.release() );
345+
}
337346
return true;
338347
}
339348

‎src/providers/ogr/qgsgeopackagedataitems.h

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "qgsdataitem.h"
1919
#include "qgsdataitemprovider.h"
2020
#include "qgsdataprovider.h"
21+
#include "qgstaskmanager.h"
2122

2223

2324
/**
@@ -156,5 +157,29 @@ class QgsGeoPackageDataItemProvider : public QgsDataItemProvider
156157
};
157158

158159

160+
/**
161+
* \brief The QgsConcurrentFileWriterImportTask class is the parent task for
162+
* importing layers from a drag and drop operation in the browser.
163+
* Individual layers need to be added as individual substask.
164+
*/
165+
class QgsConcurrentFileWriterImportTask : public QgsTask
166+
{
167+
Q_OBJECT
168+
169+
public:
170+
171+
QgsConcurrentFileWriterImportTask( const QString &desc = QString() ) : QgsTask( desc ) {}
172+
173+
void emitProgressChanged( double progress ) { setProgress( progress ); }
174+
175+
176+
protected:
177+
178+
bool run() override
179+
{
180+
return true;
181+
}
182+
183+
};
159184

160185
#endif // QGSGEOPACKAGEDATAITEMS_H

0 commit comments

Comments
 (0)
Please sign in to comment.