17 changes: 17 additions & 0 deletions src/app/nodetool/qgsselectedfeature.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,9 @@ void QgsSelectedFeature::setSelectedFeature( QgsFeatureId featureId, QgsVectorLa
// feature was deleted
connect( mVlayer, SIGNAL( featureDeleted( QgsFeatureId ) ), this, SLOT( featureDeleted( QgsFeatureId ) ) );

// rolling back
connect( mVlayer, SIGNAL( beforeRollBack() ), this, SLOT( beforeRollBack() ) );

// projection or extents changed
connect( canvas->mapRenderer(), SIGNAL( destinationSrsChanged() ), this, SLOT( updateVertexMarkersPosition() ) );
connect( canvas, SIGNAL( extentsChanged() ), this, SLOT( updateVertexMarkersPosition() ) );
Expand All @@ -122,6 +125,13 @@ void QgsSelectedFeature::setSelectedFeature( QgsFeatureId featureId, QgsVectorLa
replaceVertexMap();
}

void QgsSelectedFeature::beforeRollBack()
{
QgsDebugCall;
disconnect( mVlayer, SIGNAL( geometryChanged( QgsFeatureId, QgsGeometry & ) ), this, SLOT( geometryChanged( QgsFeatureId, QgsGeometry & ) ) );
deleteVertexMap();
}

void QgsSelectedFeature::beginGeometryChange()
{
Q_ASSERT( !mChangingGeometry );
Expand Down Expand Up @@ -163,6 +173,7 @@ void QgsSelectedFeature::geometryChanged( QgsFeatureId fid, QgsGeometry &geom )

void QgsSelectedFeature::validateGeometry( QgsGeometry *g )
{
QgsDebugCall;
QSettings settings;
if ( settings.value( "/qgis/digitizing/validate_geometries", 1 ).toInt() == 0 )
return;
Expand Down Expand Up @@ -293,6 +304,9 @@ void QgsSelectedFeature::deleteSelectedVertexes()
}
}

if ( nSelected > 0 )
endGeometryChange();

if ( count > 0 )
{
mVlayer->endEditCommand();
Expand Down Expand Up @@ -356,6 +370,9 @@ void QgsSelectedFeature::moveSelectedVertexes( const QgsVector &v )
}
}

if ( nUpdates > 0 )
endGeometryChange();

mVlayer->endEditCommand();
}

Expand Down
5 changes: 5 additions & 0 deletions src/app/nodetool/qgsselectedfeature.h
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,11 @@ class QgsSelectedFeature: public QObject
*/
void canvasLayersChanged();

/*
* the changes are rolling back - stop monitoring the geometry
*/
void beforeRollBack();

private:
/**
* Deletes whole vertex map.
Expand Down
2 changes: 2 additions & 0 deletions src/core/qgsvectorlayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2609,6 +2609,8 @@ bool QgsVectorLayer::rollBack( bool deleteBuffer )
return false;
}

emit beforeRollBack();

mEditBuffer->rollBack();

if ( isModified() )
Expand Down
5 changes: 5 additions & 0 deletions src/core/qgsvectorlayer.h
Original file line number Diff line number Diff line change
Expand Up @@ -1101,6 +1101,7 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer

/** return string representing 'true' for a checkbox (added in 1.4)
* @note not available in python bindings
* FIXME: need SIP binding for QPair<QString, QString>
*/
QPair<QString, QString> checkedState( int idx );

Expand Down Expand Up @@ -1304,6 +1305,7 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer

QString metadata();

/** @note not available in python bindings */
inline QgsGeometryCache* cache() { return mCache; }

/**
Expand Down Expand Up @@ -1338,6 +1340,9 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer
/** Is emitted, before changes are commited to the data provider */
void beforeCommitChanges();

/** Is emitted, before changes are rolled back*/
void beforeRollBack();

/**
* Will be emitted, when a new attribute has been added to this vector layer.
* Applies only to types {@link QgsFields::OriginEdit} and {@link QgsFields::OriginProvider}
Expand Down
59 changes: 33 additions & 26 deletions src/core/qgsvectorlayerundocommand.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,6 @@
#include "qgslogger.h"





QgsVectorLayerUndoCommandAddFeature::QgsVectorLayerUndoCommandAddFeature( QgsVectorLayerEditBuffer* buffer, QgsFeature& f )
: QgsVectorLayerUndoCommand( buffer )
{
Expand Down Expand Up @@ -115,10 +112,9 @@ void QgsVectorLayerUndoCommandDeleteFeature::redo()


QgsVectorLayerUndoCommandChangeGeometry::QgsVectorLayerUndoCommandChangeGeometry( QgsVectorLayerEditBuffer* buffer, QgsFeatureId fid, QgsGeometry* newGeom )
: QgsVectorLayerUndoCommand( buffer ),
mFid( fid )
: QgsVectorLayerUndoCommand( buffer )
, mFid( fid )
{

if ( FID_IS_NEW( mFid ) )
{
QgsFeatureMap::const_iterator it = mBuffer->mAddedFeatures.find( mFid );
Expand All @@ -136,6 +132,28 @@ QgsVectorLayerUndoCommandChangeGeometry::QgsVectorLayerUndoCommandChangeGeometry
mNewGeom = new QgsGeometry( *newGeom );
}

int QgsVectorLayerUndoCommandChangeGeometry::id() const
{
return 1;
}

bool QgsVectorLayerUndoCommandChangeGeometry::mergeWith( const QUndoCommand *other )
{
if ( other->id() != id() )
return false;

const QgsVectorLayerUndoCommandChangeGeometry *merge = dynamic_cast<const QgsVectorLayerUndoCommandChangeGeometry *>( other );
if ( !merge )
return false;

delete mNewGeom;
mNewGeom = merge->mNewGeom;
merge->mNewGeom = 0;

QgsDebugMsg( "geometry changes merged" );
return true;
}

QgsVectorLayerUndoCommandChangeGeometry::~QgsVectorLayerUndoCommandChangeGeometry()
{
delete mOldGeom;
Expand Down Expand Up @@ -197,17 +215,13 @@ void QgsVectorLayerUndoCommandChangeGeometry::redo()
}





QgsVectorLayerUndoCommandChangeAttribute::QgsVectorLayerUndoCommandChangeAttribute( QgsVectorLayerEditBuffer* buffer, QgsFeatureId fid, int fieldIndex, const QVariant& newValue )
: QgsVectorLayerUndoCommand( buffer ),
mFid( fid ),
mFieldIndex( fieldIndex ),
mNewValue( newValue ),
mFirstChange( true )
: QgsVectorLayerUndoCommand( buffer )
, mFid( fid )
, mFieldIndex( fieldIndex )
, mNewValue( newValue )
, mFirstChange( true )
{

if ( FID_IS_NEW( mFid ) )
{
// work with added feature
Expand Down Expand Up @@ -293,13 +307,9 @@ void QgsVectorLayerUndoCommandChangeAttribute::redo()
}






QgsVectorLayerUndoCommandAddAttribute::QgsVectorLayerUndoCommandAddAttribute( QgsVectorLayerEditBuffer* buffer, const QgsField& field )
: QgsVectorLayerUndoCommand( buffer ),
mField( field )
: QgsVectorLayerUndoCommand( buffer )
, mField( field )
{
mFieldIndex = layer()->pendingFields().count();
}
Expand All @@ -325,12 +335,9 @@ void QgsVectorLayerUndoCommandAddAttribute::redo()
}





QgsVectorLayerUndoCommandDeleteAttribute::QgsVectorLayerUndoCommandDeleteAttribute( QgsVectorLayerEditBuffer* buffer, int fieldIndex )
: QgsVectorLayerUndoCommand( buffer ),
mFieldIndex( fieldIndex )
: QgsVectorLayerUndoCommand( buffer )
, mFieldIndex( fieldIndex )
{
const QgsFields& fields = layer()->pendingFields();
QgsFields::FieldOrigin origin = fields.fieldOrigin( mFieldIndex );
Expand Down
17 changes: 13 additions & 4 deletions src/core/qgsvectorlayerundocommand.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@

#include "qgsfield.h"
#include "qgsfeature.h"
#include "qgslogger.h"

class QgsGeometry;
class QgsGeometryCache;
Expand All @@ -35,9 +36,15 @@ class QgsGeometryCache;
class QgsVectorLayerUndoCommand : public QUndoCommand
{
public:
QgsVectorLayerUndoCommand( QgsVectorLayerEditBuffer* buffer ) : mBuffer( buffer ) {}
inline QgsVectorLayer* layer() { return mBuffer->L; }
inline QgsGeometryCache* cache() { return mBuffer->L->cache(); }
QgsVectorLayerUndoCommand( QgsVectorLayerEditBuffer *buffer )
: QUndoCommand()
, mBuffer( buffer )
{}
inline QgsVectorLayer *layer() { return mBuffer->L; }
inline QgsGeometryCache *cache() { return mBuffer->L->cache(); }

virtual int id() const { return -1; }
virtual bool mergeWith( QUndoCommand * ) { return -1; }

protected:
QgsVectorLayerEditBuffer* mBuffer;
Expand Down Expand Up @@ -79,11 +86,13 @@ class QgsVectorLayerUndoCommandChangeGeometry : public QgsVectorLayerUndoCommand

virtual void undo();
virtual void redo();
virtual int id() const;
virtual bool mergeWith( const QUndoCommand * );

private:
QgsFeatureId mFid;
QgsGeometry* mOldGeom;
QgsGeometry* mNewGeom;
mutable QgsGeometry* mNewGeom;
};


Expand Down