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 )
204 const QgsFeatureMap::const_iterator it =
mBuffer->mAddedFeatures.constFind( mFid );
205 if ( it !=
mBuffer->mAddedFeatures.constEnd() )
207 if ( it.value().attribute( mFieldIndex ).isValid() )
209 mOldValue = it.value().attribute( mFieldIndex );
210 mFirstChange =
false;
221 const QgsChangedAttributesMap::const_iterator it =
mBuffer->mChangedAttributeValues.constFind( mFid );
222 if ( it !=
mBuffer->mChangedAttributeValues.constEnd() )
224 if ( it->contains( mFieldIndex ) )
226 mOldValue =
mBuffer->mChangedAttributeValues[mFid][mFieldIndex];
227 mFirstChange =
false;
240 QVariant original = mOldValue;
245 const QgsFeatureMap::iterator it =
mBuffer->mAddedFeatures.find( mFid );
246 if ( it ==
mBuffer->mAddedFeatures.end() )
254 it.value().setAttribute( mFieldIndex, mOldValue );
257 else if ( mFirstChange )
260 mBuffer->mChangedAttributeValues[mFid].remove( mFieldIndex );
261 if (
mBuffer->mChangedAttributeValues[mFid].isEmpty() )
262 mBuffer->mChangedAttributeValues.remove( mFid );
264 if ( !mOldValue.isValid() )
279 mBuffer->mChangedAttributeValues[mFid][mFieldIndex] = mOldValue;
282 emit
mBuffer->attributeValueChanged( mFid, mFieldIndex, original );
290 const QgsFeatureMap::iterator it =
mBuffer->mAddedFeatures.find( mFid );
291 Q_ASSERT( it !=
mBuffer->mAddedFeatures.end() );
292 it.value().setAttribute( mFieldIndex, mNewValue );
297 if ( !
mBuffer->mChangedAttributeValues.contains( mFid ) )
302 mBuffer->mChangedAttributeValues[mFid].insert( mFieldIndex, mNewValue );
305 emit
mBuffer->attributeValueChanged( mFid, mFieldIndex, mNewValue );
324 mBuffer->mAddedAttributes.removeAt( index );
325 mBuffer->handleAttributeDeleted( mFieldIndex );
328 emit
mBuffer->attributeDeleted( mFieldIndex );
333 mBuffer->mAddedAttributes.append( mField );
334 mBuffer->handleAttributeAdded( mFieldIndex, mField );
337 emit
mBuffer->attributeAdded( mFieldIndex );
343 , mFieldIndex( fieldIndex )
349 mFieldName = fields.
field( mFieldIndex ).
name();
351 if ( !mProviderField )
354 mOldField =
mBuffer->mAddedAttributes[mOriginIndex];
357 if (
mBuffer->mRenamedAttributes.contains( fieldIndex ) )
359 mOldName =
mBuffer->mRenamedAttributes.value( fieldIndex );
363 for ( QgsFeatureMap::const_iterator it =
mBuffer->mAddedFeatures.constBegin(); it !=
mBuffer->mAddedFeatures.constEnd(); ++it )
366 mDeletedValues.insert( f.
id(), f.
attribute( mFieldIndex ) );
370 for ( QgsChangedAttributesMap::const_iterator it =
mBuffer->mChangedAttributeValues.constBegin(); it !=
mBuffer->mChangedAttributeValues.constEnd(); ++it )
373 if ( attrs.contains( mFieldIndex ) )
374 mDeletedValues.insert( it.key(), attrs[mFieldIndex] );
380 if ( mProviderField )
382 mBuffer->mDeletedAttributeIds.removeOne( mOriginIndex );
387 mBuffer->mAddedAttributes.insert( mOriginIndex, mOldField );
391 mBuffer->handleAttributeAdded( mFieldIndex, mOldField );
393 if ( !mOldName.isEmpty() )
395 mBuffer->mRenamedAttributes[ mFieldIndex ] = mOldName;
400 for ( QgsFeatureMap::iterator it =
mBuffer->mAddedFeatures.begin(); it !=
mBuffer->mAddedFeatures.end(); ++it )
406 for ( QMap<QgsFeatureId, QVariant>::const_iterator it = mDeletedValues.constBegin(); it != mDeletedValues.constEnd(); ++it )
411 attrs.insert( mFieldIndex, it.value() );
416 mBuffer->L->setEditFormConfig( formConfig );
418 emit
mBuffer->attributeAdded( mFieldIndex );
423 if ( mProviderField )
425 mBuffer->mDeletedAttributeIds.append( mOriginIndex );
426 std::sort(
mBuffer->mDeletedAttributeIds.begin(),
mBuffer->mDeletedAttributeIds.end() );
431 mBuffer->mAddedAttributes.removeAt( mOriginIndex );
434 mBuffer->handleAttributeDeleted( mFieldIndex );
436 emit
mBuffer->attributeDeleted( mFieldIndex );
442 , mFieldIndex( fieldIndex )
443 , mOldName(
layer()->fields().at( fieldIndex ).name() )
444 , mNewName( newName )
454 if ( mProviderField )
456 mBuffer->mRenamedAttributes[ mFieldIndex ] = mOldName;
461 mBuffer->mAddedAttributes[mOriginIndex].setName( mOldName );
464 emit
mBuffer->attributeRenamed( mFieldIndex, mOldName );
469 if ( mProviderField )
471 mBuffer->mRenamedAttributes[ mFieldIndex ] = mNewName;
476 mBuffer->mAddedAttributes[mOriginIndex].setName( mNewName );
479 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)