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() );
69 const QgsFeatureMap::const_iterator it =
mBuffer->mAddedFeatures.constFind( mFid );
70 Q_ASSERT( it !=
mBuffer->mAddedFeatures.constEnd() );
71 mOldAddedFeature = it.value();
79 mBuffer->mAddedFeatures.insert( mOldAddedFeature.id(), mOldAddedFeature );
83 mBuffer->mDeletedFeatureIds.remove( mFid );
86 emit
mBuffer->featureAdded( mFid );
93 mBuffer->mAddedFeatures.remove( mFid );
97 mBuffer->mDeletedFeatureIds.insert( mFid );
100 emit
mBuffer->featureDeleted( mFid );
107 , mNewGeom( newGeom )
111 const QgsFeatureMap::const_iterator it =
mBuffer->mAddedFeatures.constFind( mFid );
112 Q_ASSERT( it !=
mBuffer->mAddedFeatures.constEnd() );
113 mOldGeom = ( it.value().geometry() );
124 if ( other->id() !=
id() )
131 if ( merge->mFid != mFid )
134 mNewGeom = merge->mNewGeom;
145 const QgsFeatureMap::iterator it =
mBuffer->mAddedFeatures.find( mFid );
146 Q_ASSERT( it !=
mBuffer->mAddedFeatures.end() );
147 it.value().setGeometry( mOldGeom );
149 emit
mBuffer->geometryChanged( mFid, mOldGeom );
155 if ( mOldGeom.isNull() )
157 mBuffer->mChangedGeometries.remove( mFid );
167 mBuffer->mChangedGeometries[mFid] = mOldGeom;
168 emit
mBuffer->geometryChanged( mFid, mOldGeom );
178 const QgsFeatureMap::iterator it =
mBuffer->mAddedFeatures.find( mFid );
179 Q_ASSERT( it !=
mBuffer->mAddedFeatures.end() );
180 it.value().setGeometry( mNewGeom );
184 mBuffer->mChangedGeometries[mFid] = mNewGeom;
186 emit
mBuffer->geometryChanged( mFid, mNewGeom );
193 , mFieldIndex( fieldIndex )
194 , mOldValue( oldValue )
195 , mNewValue( newValue )
200 const QgsFeatureMap::const_iterator it =
mBuffer->mAddedFeatures.constFind( mFid );
201 if ( it !=
mBuffer->mAddedFeatures.constEnd() )
203 if ( it.value().attribute( mFieldIndex ).isValid() )
205 mOldValue = it.value().attribute( mFieldIndex );
206 mFirstChange =
false;
217 const QgsChangedAttributesMap::const_iterator it =
mBuffer->mChangedAttributeValues.constFind( mFid );
218 if ( it !=
mBuffer->mChangedAttributeValues.constEnd() )
220 if ( it->contains( mFieldIndex ) )
222 mOldValue =
mBuffer->mChangedAttributeValues[mFid][mFieldIndex];
223 mFirstChange =
false;
235 QVariant original = mOldValue;
240 const QgsFeatureMap::iterator it =
mBuffer->mAddedFeatures.find( mFid );
241 if ( it ==
mBuffer->mAddedFeatures.end() )
249 it.value().setAttribute( mFieldIndex, mOldValue );
252 else if ( mFirstChange )
255 mBuffer->mChangedAttributeValues[mFid].remove( mFieldIndex );
256 if (
mBuffer->mChangedAttributeValues[mFid].isEmpty() )
257 mBuffer->mChangedAttributeValues.remove( mFid );
259 if ( !mOldValue.isValid() )
274 mBuffer->mChangedAttributeValues[mFid][mFieldIndex] = mOldValue;
277 emit
mBuffer->attributeValueChanged( mFid, mFieldIndex, original );
285 const QgsFeatureMap::iterator it =
mBuffer->mAddedFeatures.find( mFid );
286 Q_ASSERT( it !=
mBuffer->mAddedFeatures.end() );
287 it.value().setAttribute( mFieldIndex, mNewValue );
292 if ( !
mBuffer->mChangedAttributeValues.contains( mFid ) )
297 mBuffer->mChangedAttributeValues[mFid].insert( mFieldIndex, mNewValue );
300 emit
mBuffer->attributeValueChanged( mFid, mFieldIndex, mNewValue );
319 mBuffer->mAddedAttributes.removeAt( index );
320 mBuffer->handleAttributeDeleted( mFieldIndex );
323 emit
mBuffer->attributeDeleted( mFieldIndex );
328 mBuffer->mAddedAttributes.append( mField );
329 mBuffer->handleAttributeAdded( mFieldIndex, mField );
332 emit
mBuffer->attributeAdded( mFieldIndex );
338 , mFieldIndex( fieldIndex )
344 mFieldName = fields.
field( mFieldIndex ).
name();
346 if ( !mProviderField )
349 mOldField =
mBuffer->mAddedAttributes[mOriginIndex];
352 if (
mBuffer->mRenamedAttributes.contains( fieldIndex ) )
354 mOldName =
mBuffer->mRenamedAttributes.value( fieldIndex );
358 for ( QgsFeatureMap::const_iterator it =
mBuffer->mAddedFeatures.constBegin(); it !=
mBuffer->mAddedFeatures.constEnd(); ++it )
361 mDeletedValues.insert( f.
id(), f.
attribute( mFieldIndex ) );
365 for ( QgsChangedAttributesMap::const_iterator it =
mBuffer->mChangedAttributeValues.constBegin(); it !=
mBuffer->mChangedAttributeValues.constEnd(); ++it )
368 if ( attrs.contains( mFieldIndex ) )
369 mDeletedValues.insert( it.key(), attrs[mFieldIndex] );
375 if ( mProviderField )
377 mBuffer->mDeletedAttributeIds.removeOne( mOriginIndex );
382 mBuffer->mAddedAttributes.insert( mOriginIndex, mOldField );
386 mBuffer->handleAttributeAdded( mFieldIndex, mOldField );
388 if ( !mOldName.isEmpty() )
390 mBuffer->mRenamedAttributes[mFieldIndex] = mOldName;
395 for ( QgsFeatureMap::iterator it =
mBuffer->mAddedFeatures.begin(); it !=
mBuffer->mAddedFeatures.end(); ++it )
401 for ( QMap<QgsFeatureId, QVariant>::const_iterator it = mDeletedValues.constBegin(); it != mDeletedValues.constEnd(); ++it )
406 attrs.insert( mFieldIndex, it.value() );
411 mBuffer->L->setEditFormConfig( formConfig );
413 emit
mBuffer->attributeAdded( mFieldIndex );
418 if ( mProviderField )
420 mBuffer->mDeletedAttributeIds.append( mOriginIndex );
421 std::sort(
mBuffer->mDeletedAttributeIds.begin(),
mBuffer->mDeletedAttributeIds.end() );
426 mBuffer->mAddedAttributes.removeAt( mOriginIndex );
429 mBuffer->handleAttributeDeleted( mFieldIndex );
431 emit
mBuffer->attributeDeleted( mFieldIndex );
437 , mFieldIndex( fieldIndex )
438 , mOldName(
layer()->fields().at( fieldIndex ).name() )
439 , mNewName( newName )
449 if ( mProviderField )
451 mBuffer->mRenamedAttributes[mFieldIndex] = mOldName;
456 mBuffer->mAddedAttributes[mOriginIndex].setName( mOldName );
459 emit
mBuffer->attributeRenamed( mFieldIndex, mOldName );
464 if ( mProviderField )
466 mBuffer->mRenamedAttributes[mFieldIndex] = mNewName;
471 mBuffer->mAddedAttributes[mOriginIndex].setName( mNewName );
474 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)