diff --git a/python/core/qgsvectorlayer.sip b/python/core/qgsvectorlayer.sip index 7402014bb0f..8f10f692e97 100644 --- a/python/core/qgsvectorlayer.sip +++ b/python/core/qgsvectorlayer.sip @@ -316,6 +316,10 @@ public: /** Make layer editable */ bool startEditing(); + /** change feature's geometry + @note added in version 1.2 */ + bool changeGeometry(int fid, QgsGeometry* geom); + /** changed an attribute value (but does not commit it */ bool changeAttributeValue(int fid, int field, QVariant value, bool emitSignal = true); diff --git a/src/app/qgsmaptooldeletehole.cpp b/src/app/qgsmaptooldeletehole.cpp index 0cbbece7549..a7c4cf1881b 100644 --- a/src/app/qgsmaptooldeletehole.cpp +++ b/src/app/qgsmaptooldeletehole.cpp @@ -111,8 +111,7 @@ void QgsMapToolDeleteHole::deleteHole( int fId, int beforeVertexNr, QgsVectorLay if (g->deleteHole( ringNum, partNum )) { - vlayer->deleteFeature( fId ); - vlayer->addFeature(f); + vlayer->changeGeometry( fId, g ); mCanvas->refresh(); } diff --git a/src/app/qgsmaptooldeletepart.cpp b/src/app/qgsmaptooldeletepart.cpp index 0f6b1378bb1..6ae763516e3 100644 --- a/src/app/qgsmaptooldeletepart.cpp +++ b/src/app/qgsmaptooldeletepart.cpp @@ -106,8 +106,7 @@ void QgsMapToolDeletePart::deletePart( int fId, int beforeVertexNr, QgsVectorLay if (g->deletePart( partNum )) { - vlayer->deleteFeature( fId ); - vlayer->addFeature(f); + vlayer->changeGeometry( fId, g ); mCanvas->refresh(); } else diff --git a/src/app/qgsmaptoolsimplify.cpp b/src/app/qgsmaptoolsimplify.cpp index ed20be04767..0cf26b9fd79 100644 --- a/src/app/qgsmaptoolsimplify.cpp +++ b/src/app/qgsmaptoolsimplify.cpp @@ -90,9 +90,8 @@ void QgsMapToolSimplify::storeSimplified() { QgsVectorLayer * vlayer = currentVectorLayer(); QgsSimplifyFeature::simplifyLine(mSelectedFeature, mTolerance); - // TODO(md): change geometry of feature instead of delete+add - vlayer->deleteFeature( mSelectedFeature.id() ); - vlayer->addFeature(mSelectedFeature); + + vlayer->changeGeometry( mSelectedFeature.id(), mSelectedFeature.geometry() ); mCanvas->refresh(); } diff --git a/src/core/qgsvectorlayer.cpp b/src/core/qgsvectorlayer.cpp index dbeb5ff3518..33d40fb273f 100644 --- a/src/core/qgsvectorlayer.cpp +++ b/src/core/qgsvectorlayer.cpp @@ -2553,6 +2553,20 @@ bool QgsVectorLayer::writeSymbology( QDomNode& node, QDomDocument& doc, QString& return true; } + +bool QgsVectorLayer::changeGeometry(int fid, QgsGeometry* geom) +{ + if ( !mEditable || !mDataProvider ) + { + return false; + } + + mChangedGeometries[ fid ] = *geom; + setModified( true, true ); + return true; +} + + bool QgsVectorLayer::changeAttributeValue( int fid, int field, QVariant value, bool emitSignal ) { if ( !isEditable() ) diff --git a/src/core/qgsvectorlayer.h b/src/core/qgsvectorlayer.h index b801aa7072f..efd8bb2ba66 100644 --- a/src/core/qgsvectorlayer.h +++ b/src/core/qgsvectorlayer.h @@ -378,6 +378,10 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer /** Make layer editable */ bool startEditing(); + /** change feature's geometry + @note added in version 1.2 */ + bool changeGeometry(int fid, QgsGeometry* geom); + /** changed an attribute value (but does not commit it) */ bool changeAttributeValue( int fid, int field, QVariant value, bool emitSignal = true );