@@ -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