bool QgsVectorLayerFeatureIterator::nextFeatureFid( QgsFeature& f ) { QgsFeatureId featureId = mRequest.filterFid(); // deleted already? if ( mDeletedFeatureIds.contains( featureId ) ) return false; // has changed geometry? if ( !( mRequest.flags() & QgsFeatureRequest::NoGeometry ) && mChangedGeometries.contains( featureId ) ) { useChangedAttributeFeature( featureId, mChangedGeometries[featureId], f ); return true; } // added features for ( QgsFeatureMap::ConstIterator iter = mAddedFeatures.constBegin(); iter != mAddedFeatures.constEnd(); ++iter ) { if ( iter->id() == featureId ) { useAddedFeature( *iter, f ); return true; } } // regular features QgsFeatureIterator fi = L->dataProvider()->getFeatures( mProviderRequest ); if ( fi.nextFeature( f ) ) { updateChangedAttributes( f ); if ( !mFetchJoinInfo.isEmpty() ) addJoinedAttributes( f ); return true; } return false; }
bool QgsVectorLayerFeatureIterator::fetchNextAddedFeature( QgsFeature& f ) { while ( mFetchAddedFeaturesIt-- != mAddedFeatures.constBegin() ) { QgsFeatureId fid = mFetchAddedFeaturesIt->id(); if ( mFetchConsidered.contains( fid ) ) // must have changed geometry outside rectangle continue; if ( !mRequest.acceptFeature( *mFetchAddedFeaturesIt ) ) // skip features which are not accepted by the filter continue; useAddedFeature( *mFetchAddedFeaturesIt, f ); return true; } mFetchAddedFeaturesIt = mAddedFeatures.constBegin(); return false; // no more added features }
bool QgsVectorLayerFeatureIterator::fetchNextAddedFeature( QgsFeature& f ) { for ( ; mFetchAddedFeaturesIt != mAddedFeatures.constEnd(); mFetchAddedFeaturesIt++ ) { QgsFeatureId fid = mFetchAddedFeaturesIt->id(); if ( mFetchConsidered.contains( fid ) ) // must have changed geometry outside rectangle continue; if ( mRequest.filterType() == QgsFeatureRequest::FilterRect && mFetchAddedFeaturesIt->geometry() && !mFetchAddedFeaturesIt->geometry()->intersects( mRequest.filterRect() ) ) // skip added features not in rectangle continue; useAddedFeature( *mFetchAddedFeaturesIt, f ); mFetchAddedFeaturesIt++; return true; } return false; // no more added features }