28 static int sAddedIdLowWaterMark = -1;
31 sAddedIdLowWaterMark--;
33 QgsDebugMsgLevel(
"Assigned feature id " + QString::number( sAddedIdLowWaterMark ), 4 );
38 f.
setId( sAddedIdLowWaterMark );
46 const QgsFeatureMap::const_iterator it =
mBuffer->mAddedFeatures.constFind( mFeature.id() );
47 Q_ASSERT( it !=
mBuffer->mAddedFeatures.constEnd() );
49 mBuffer->mAddedFeatures.remove( mFeature.id() );
51 emit
mBuffer->featureDeleted( mFeature.id() );
56 mBuffer->mAddedFeatures.insert( mFeature.id(), mFeature );
58 emit
mBuffer->featureAdded( mFeature.id() );
70 const QgsFeatureMap::const_iterator it =
mBuffer->mAddedFeatures.constFind( mFid );
71 Q_ASSERT( it !=
mBuffer->mAddedFeatures.constEnd() );
72 mOldAddedFeature = it.value();
80 mBuffer->mAddedFeatures.insert( mOldAddedFeature.id(), mOldAddedFeature );
84 mBuffer->mDeletedFeatureIds.remove( mFid );
87 emit
mBuffer->featureAdded( mFid );
94 mBuffer->mAddedFeatures.remove( mFid );
98 mBuffer->mDeletedFeatureIds.insert( mFid );
101 emit
mBuffer->featureDeleted( mFid );
109 , mNewGeom( newGeom )
113 const QgsFeatureMap::const_iterator it =
mBuffer->mAddedFeatures.constFind( mFid );
114 Q_ASSERT( it !=
mBuffer->mAddedFeatures.constEnd() );
115 mOldGeom = ( it.value().geometry() );
127 if ( other->id() !=
id() )
134 if ( merge->mFid != mFid )
137 mNewGeom = merge->mNewGeom;
148 const QgsFeatureMap::iterator it =
mBuffer->mAddedFeatures.find( mFid );
149 Q_ASSERT( it !=
mBuffer->mAddedFeatures.end() );
150 it.value().setGeometry( mOldGeom );
152 emit
mBuffer->geometryChanged( mFid, mOldGeom );
158 if ( mOldGeom.isNull() )
160 mBuffer->mChangedGeometries.remove( mFid );
170 mBuffer->mChangedGeometries[mFid] = mOldGeom;
171 emit
mBuffer->geometryChanged( mFid, mOldGeom );
182 const QgsFeatureMap::iterator it =
mBuffer->mAddedFeatures.find( mFid );
183 Q_ASSERT( it !=
mBuffer->mAddedFeatures.end() );
184 it.value().setGeometry( mNewGeom );
188 mBuffer->mChangedGeometries[ mFid ] = mNewGeom;
190 emit
mBuffer->geometryChanged( mFid, mNewGeom );
197 , mFieldIndex( fieldIndex )
198 , mOldValue( oldValue )
199 , mNewValue( newValue )
200 , mFirstChange( true )
205 const QgsFeatureMap::const_iterator it =
mBuffer->mAddedFeatures.constFind( mFid );
206 if ( it !=
mBuffer->mAddedFeatures.constEnd() )
208 if ( it.value().attribute( mFieldIndex ).isValid() )
210 mOldValue = it.value().attribute( mFieldIndex );
211 mFirstChange =
false;
222 const QgsChangedAttributesMap::const_iterator it =
mBuffer->mChangedAttributeValues.constFind( mFid );
223 if ( it !=
mBuffer->mChangedAttributeValues.constEnd() )
225 if ( it->contains( mFieldIndex ) )
227 mOldValue =
mBuffer->mChangedAttributeValues[mFid][mFieldIndex];
228 mFirstChange =
false;
241 QVariant original = mOldValue;
246 const QgsFeatureMap::iterator it =
mBuffer->mAddedFeatures.find( mFid );
247 if ( it ==
mBuffer->mAddedFeatures.end() )
255 it.value().setAttribute( mFieldIndex, mOldValue );
258 else if ( mFirstChange )
261 mBuffer->mChangedAttributeValues[mFid].remove( mFieldIndex );
262 if (
mBuffer->mChangedAttributeValues[mFid].isEmpty() )
263 mBuffer->mChangedAttributeValues.remove( mFid );
265 if ( !mOldValue.isValid() )
280 mBuffer->mChangedAttributeValues[mFid][mFieldIndex] = mOldValue;
283 emit
mBuffer->attributeValueChanged( mFid, mFieldIndex, original );
291 const QgsFeatureMap::iterator it =
mBuffer->mAddedFeatures.find( mFid );
292 Q_ASSERT( it !=
mBuffer->mAddedFeatures.end() );
293 it.value().setAttribute( mFieldIndex, mNewValue );
298 if ( !
mBuffer->mChangedAttributeValues.contains( mFid ) )
303 mBuffer->mChangedAttributeValues[mFid].insert( mFieldIndex, mNewValue );
306 emit
mBuffer->attributeValueChanged( mFid, mFieldIndex, mNewValue );
325 mBuffer->mAddedAttributes.removeAt( index );
326 mBuffer->handleAttributeDeleted( mFieldIndex );
329 emit
mBuffer->attributeDeleted( mFieldIndex );
334 mBuffer->mAddedAttributes.append( mField );
335 mBuffer->handleAttributeAdded( mFieldIndex, mField );
338 emit
mBuffer->attributeAdded( mFieldIndex );
344 , mFieldIndex( fieldIndex )
350 mFieldName = fields.
field( mFieldIndex ).
name();
352 if ( !mProviderField )
355 mOldField =
mBuffer->mAddedAttributes[mOriginIndex];
358 if (
mBuffer->mRenamedAttributes.contains( fieldIndex ) )
360 mOldName =
mBuffer->mRenamedAttributes.value( fieldIndex );
364 for ( QgsFeatureMap::const_iterator it =
mBuffer->mAddedFeatures.constBegin(); it !=
mBuffer->mAddedFeatures.constEnd(); ++it )
367 mDeletedValues.insert( f.
id(), f.
attribute( mFieldIndex ) );
371 for ( QgsChangedAttributesMap::const_iterator it =
mBuffer->mChangedAttributeValues.constBegin(); it !=
mBuffer->mChangedAttributeValues.constEnd(); ++it )
374 if ( attrs.contains( mFieldIndex ) )
375 mDeletedValues.insert( it.key(), attrs[mFieldIndex] );
381 if ( mProviderField )
383 mBuffer->mDeletedAttributeIds.removeOne( mOriginIndex );
388 mBuffer->mAddedAttributes.insert( mOriginIndex, mOldField );
392 mBuffer->handleAttributeAdded( mFieldIndex, mOldField );
394 if ( !mOldName.isEmpty() )
396 mBuffer->mRenamedAttributes[ mFieldIndex ] = mOldName;
401 for ( QgsFeatureMap::iterator it =
mBuffer->mAddedFeatures.begin(); it !=
mBuffer->mAddedFeatures.end(); ++it )
407 for ( QMap<QgsFeatureId, QVariant>::const_iterator it = mDeletedValues.constBegin(); it != mDeletedValues.constEnd(); ++it )
412 attrs.insert( mFieldIndex, it.value() );
417 mBuffer->L->setEditFormConfig( formConfig );
419 emit
mBuffer->attributeAdded( mFieldIndex );
424 if ( mProviderField )
426 mBuffer->mDeletedAttributeIds.append( mOriginIndex );
427 std::sort(
mBuffer->mDeletedAttributeIds.begin(),
mBuffer->mDeletedAttributeIds.end() );
432 mBuffer->mAddedAttributes.removeAt( mOriginIndex );
435 mBuffer->handleAttributeDeleted( mFieldIndex );
437 emit
mBuffer->attributeDeleted( mFieldIndex );
443 , mFieldIndex( fieldIndex )
444 , mOldName(
layer()->fields().at( fieldIndex ).name() )
445 , mNewName( newName )
455 if ( mProviderField )
457 mBuffer->mRenamedAttributes[ mFieldIndex ] = mOldName;
462 mBuffer->mAddedAttributes[mOriginIndex].setName( mOldName );
465 emit
mBuffer->attributeRenamed( mFieldIndex, mOldName );
470 if ( mProviderField )
472 mBuffer->mRenamedAttributes[ mFieldIndex ] = mNewName;
477 mBuffer->mAddedAttributes[mOriginIndex].setName( mNewName );
480 emit
mBuffer->attributeRenamed( mFieldIndex, mNewName );
@ NoGeometry
Geometry is not required. It may still be returned if e.g. required for a filter condition.
@ Provider
Field originates from the underlying data provider of the vector layer.
@ Join
Field originates from a joined layer.
Wrapper for iterator of features from vector data provider or vector layer.
bool nextFeature(QgsFeature &f)
Fetch next feature and stores in f, returns true on success.
Wraps a request for features to a vector layer (or directly its vector data provider).
QgsFeatureRequest & setFlags(Qgis::FeatureRequestFlags flags)
Sets flags that affect how features will be fetched.
QgsFeatureRequest & setSubsetOfAttributes(const QgsAttributeList &attrs)
Set a subset of attributes that will be fetched.
QgsFeatureRequest & setFilterFid(QgsFeatureId fid)
Sets the feature ID that should be fetched.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Q_INVOKABLE bool setAttribute(int field, const QVariant &attr)
Sets an attribute's value by field index.
void setId(QgsFeatureId id)
Sets the feature id for this feature.
bool hasGeometry() const
Returns true if the feature has an associated geometry.
Q_INVOKABLE QVariant attribute(const QString &name) const
Lookup attribute value by attribute name.
Encapsulate a field in an attribute table or data source.
Container of fields for a vector layer.
QgsField field(int fieldIdx) const
Returns the field at particular index (must be in range 0..N-1).
Qgis::FieldOrigin fieldOrigin(int fieldIdx) const
Returns the field's origin (value from an enumeration).
int fieldOriginIndex(int fieldIdx) const
Returns the field's origin index (its meaning is specific to each type of origin).
A geometry is the spatial representation of a feature.
Stores queued vector layer edit operations prior to committing changes to the layer's data provider.
QgsVectorLayerUndoCommandAddAttribute(QgsVectorLayerEditBuffer *buffer, const QgsField &field)
Constructor for QgsVectorLayerUndoCommandAddAttribute.
QgsVectorLayerUndoCommandAddFeature(QgsVectorLayerEditBuffer *buffer, QgsFeature &f)
Constructor for QgsVectorLayerUndoCommandAddFeature.
QgsVectorLayerUndoCommandChangeAttribute(QgsVectorLayerEditBuffer *buffer, QgsFeatureId fid, int fieldIndex, const QVariant &newValue, const QVariant &oldValue)
Constructor for QgsVectorLayerUndoCommandChangeAttribute.
QgsVectorLayerUndoCommandChangeGeometry(QgsVectorLayerEditBuffer *buffer, QgsFeatureId fid, const QgsGeometry &newGeom)
Constructor for QgsVectorLayerUndoCommandChangeGeometry.
bool mergeWith(const QUndoCommand *other) override
QgsVectorLayerUndoCommandDeleteAttribute(QgsVectorLayerEditBuffer *buffer, int fieldIndex)
Constructor for QgsVectorLayerUndoCommandDeleteAttribute.
QgsVectorLayerUndoCommandDeleteFeature(QgsVectorLayerEditBuffer *buffer, QgsFeatureId fid)
Constructor for QgsVectorLayerUndoCommandDeleteFeature.
QgsVectorLayerUndoCommandRenameAttribute(QgsVectorLayerEditBuffer *buffer, int fieldIndex, const QString &newName)
Constructor for QgsVectorLayerUndoCommandRenameAttribute.
QgsVectorLayer * layer()
Returns the layer associated with the undo command.
QgsVectorLayerUndoCommand(QgsVectorLayerEditBuffer *buffer)
Constructor for QgsVectorLayerUndoCommand.
QgsVectorLayerEditBuffer * mBuffer
Associated edit buffer.
QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const final
Queries the layer for features specified in request.
QMap< int, QVariant > QgsAttributeMap
qint64 QgsFeatureId
64 bit feature ids negative numbers are used for uncommitted/newly added features
QList< int > QgsAttributeList
#define QgsDebugMsgLevel(str, level)