Skip to content

Commit 7d2d6e8

Browse files
committedFeb 16, 2017
Better feedback and responsiveness when saving large shapefile layers
1 parent 5f5c1dd commit 7d2d6e8

File tree

1 file changed

+22
-4
lines changed

1 file changed

+22
-4
lines changed
 

‎src/core/qgsvectorfilewriter.cpp

100644100755
Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2284,6 +2284,9 @@ QgsVectorFileWriter::writeAsVectorFormat( QgsVectorLayer* layer,
22842284
}
22852285
}
22862286

2287+
int lastProgressReport = 0;
2288+
long total = options.onlySelectedFeatures ? layer->selectedFeatureCount() : layer->featureCount();
2289+
22872290
if ( layer->providerType() == QLatin1String( "ogr" ) && layer->dataProvider() )
22882291
{
22892292
QStringList theURIParts = layer->dataProvider()->dataSourceUri().split( '|' );
@@ -2307,14 +2310,30 @@ QgsVectorFileWriter::writeAsVectorFormat( QgsVectorLayer* layer,
23072310
req.setSubsetOfAttributes( QgsAttributeList() );
23082311
QgsFeatureIterator fit = layer->getFeatures( req );
23092312
QgsFeature fet;
2310-
2313+
long scanned = 0;
23112314
while ( fit.nextFeature( fet ) )
23122315
{
2316+
if ( options.feedback && options.feedback->isCanceled() )
2317+
{
2318+
return Canceled;
2319+
}
2320+
if ( options.feedback )
2321+
{
2322+
//dedicate first 5% of progress bar to this scan
2323+
int newProgress = ( 5.0 * scanned ) / total;
2324+
if ( newProgress != lastProgressReport )
2325+
{
2326+
lastProgressReport = newProgress;
2327+
options.feedback->setProgress( lastProgressReport );
2328+
}
2329+
}
2330+
23132331
if ( fet.hasGeometry() && QgsWkbTypes::isMultiType( fet.geometry().geometry()->wkbType() ) )
23142332
{
23152333
destWkbType = QgsWkbTypes::multiType( destWkbType );
23162334
break;
23172335
}
2336+
scanned++;
23182337
}
23192338
}
23202339
}
@@ -2426,8 +2445,7 @@ QgsVectorFileWriter::writeAsVectorFormat( QgsVectorLayer* layer,
24262445

24272446
// write all features
24282447
long saved = 0;
2429-
long total = options.onlySelectedFeatures ? layer->selectedFeatureCount() : layer->featureCount();
2430-
int lastProgressReport = 0;
2448+
int initialProgress = lastProgressReport;
24312449
while ( fit.nextFeature( fet ) )
24322450
{
24332451
if ( options.feedback && options.feedback->isCanceled() )
@@ -2440,7 +2458,7 @@ QgsVectorFileWriter::writeAsVectorFormat( QgsVectorLayer* layer,
24402458
if ( options.feedback )
24412459
{
24422460
//avoid spamming progress reports
2443-
int newProgress = ( 100.0 * saved ) / total;
2461+
int newProgress = initialProgress + (( 100.0 - initialProgress ) * saved ) / total;
24442462
if ( newProgress < 100 && newProgress != lastProgressReport )
24452463
{
24462464
lastProgressReport = newProgress;

0 commit comments

Comments
 (0)
Please sign in to comment.