@@ -2284,6 +2284,9 @@ QgsVectorFileWriter::writeAsVectorFormat( QgsVectorLayer* layer,
2284
2284
}
2285
2285
}
2286
2286
2287
+ int lastProgressReport = 0 ;
2288
+ long total = options.onlySelectedFeatures ? layer->selectedFeatureCount () : layer->featureCount ();
2289
+
2287
2290
if ( layer->providerType () == QLatin1String ( " ogr" ) && layer->dataProvider () )
2288
2291
{
2289
2292
QStringList theURIParts = layer->dataProvider ()->dataSourceUri ().split ( ' |' );
@@ -2307,14 +2310,30 @@ QgsVectorFileWriter::writeAsVectorFormat( QgsVectorLayer* layer,
2307
2310
req.setSubsetOfAttributes ( QgsAttributeList () );
2308
2311
QgsFeatureIterator fit = layer->getFeatures ( req );
2309
2312
QgsFeature fet;
2310
-
2313
+ long scanned = 0 ;
2311
2314
while ( fit.nextFeature ( fet ) )
2312
2315
{
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
+
2313
2331
if ( fet.hasGeometry () && QgsWkbTypes::isMultiType ( fet.geometry ().geometry ()->wkbType () ) )
2314
2332
{
2315
2333
destWkbType = QgsWkbTypes::multiType ( destWkbType );
2316
2334
break ;
2317
2335
}
2336
+ scanned++;
2318
2337
}
2319
2338
}
2320
2339
}
@@ -2426,8 +2445,7 @@ QgsVectorFileWriter::writeAsVectorFormat( QgsVectorLayer* layer,
2426
2445
2427
2446
// write all features
2428
2447
long saved = 0 ;
2429
- long total = options.onlySelectedFeatures ? layer->selectedFeatureCount () : layer->featureCount ();
2430
- int lastProgressReport = 0 ;
2448
+ int initialProgress = lastProgressReport;
2431
2449
while ( fit.nextFeature ( fet ) )
2432
2450
{
2433
2451
if ( options.feedback && options.feedback ->isCanceled () )
@@ -2440,7 +2458,7 @@ QgsVectorFileWriter::writeAsVectorFormat( QgsVectorLayer* layer,
2440
2458
if ( options.feedback )
2441
2459
{
2442
2460
// avoid spamming progress reports
2443
- int newProgress = ( 100.0 * saved ) / total;
2461
+ int newProgress = initialProgress + (( 100.0 - initialProgress ) * saved ) / total;
2444
2462
if ( newProgress < 100 && newProgress != lastProgressReport )
2445
2463
{
2446
2464
lastProgressReport = newProgress;
0 commit comments