diff --git a/src/app/nodetool/qgsmaptoolnodetool.cpp b/src/app/nodetool/qgsmaptoolnodetool.cpp index 6df0de7bf6a5..0b0eb5176285 100644 --- a/src/app/nodetool/qgsmaptoolnodetool.cpp +++ b/src/app/nodetool/qgsmaptoolnodetool.cpp @@ -44,7 +44,7 @@ QgsMapToolNodeTool::QgsMapToolNodeTool( QgsMapCanvas* canvas ) QgsMapToolNodeTool::~QgsMapToolNodeTool() { - removeRubberBands(); + cleanTool(); } void QgsMapToolNodeTool::createMovingRubberBands() @@ -369,6 +369,7 @@ void QgsMapToolNodeTool::canvasPressEvent( QMouseEvent * e ) mSelectedFeature = new QgsSelectedFeature( snapResults[0].snappedAtGeometry, vlayer, mCanvas ); connect( QgisApp::instance()->legend(), SIGNAL( currentLayerChanged( QgsMapLayer* ) ), this, SLOT( currentLayerChanged( QgsMapLayer* ) ) ); connect( mSelectedFeature, SIGNAL( destroyed() ), this, SLOT( selectedFeatureDestroyed() ) ); + connect( vlayer, SIGNAL( editingStopped() ), this, SLOT( editingToggled() ) ); mIsPoint = vlayer->geometryType() == QGis::Point; } else @@ -485,20 +486,22 @@ void QgsMapToolNodeTool::canvasPressEvent( QMouseEvent * e ) void QgsMapToolNodeTool::selectedFeatureDestroyed() { QgsDebugCall; - mSelectedFeature = 0; + cleanTool( false ); } void QgsMapToolNodeTool::currentLayerChanged( QgsMapLayer *layer ) { if ( mSelectedFeature && layer != mSelectedFeature->vlayer() ) { - delete mSelectedFeature; - mSelectedFeature = 0; - - removeRubberBands(); + cleanTool(); } } +void QgsMapToolNodeTool::editingToggled() +{ + cleanTool(); +} + void QgsMapToolNodeTool::canvasReleaseEvent( QMouseEvent * e ) { if ( !mSelectedFeature ) @@ -605,10 +608,7 @@ void QgsMapToolNodeTool::canvasReleaseEvent( QMouseEvent * e ) void QgsMapToolNodeTool::deactivate() { - removeRubberBands(); - - delete mSelectedFeature; - mSelectedFeature = 0; + cleanTool(); mSelectionRubberBand = 0; mSelectAnother = false; @@ -642,6 +642,23 @@ void QgsMapToolNodeTool::removeRubberBands() mSelectedFeature->cleanRubberBandsData(); } +void QgsMapToolNodeTool::cleanTool( bool deleteSelectedFeature ) +{ + removeRubberBands(); + + if ( mSelectedFeature ) + { + QgsVectorLayer *vlayer = mSelectedFeature->vlayer(); + Q_ASSERT( vlayer ); + + disconnect( QgisApp::instance()->legend(), SIGNAL( currentLayerChanged( QgsMapLayer* ) ), this, SLOT( currentLayerChanged( QgsMapLayer* ) ) ); + disconnect( mSelectedFeature, SIGNAL( destroyed() ), this, SLOT( selectedFeatureDestroyed() ) ); + disconnect( vlayer, SIGNAL( editingStopped() ), this, SLOT( editingToggled() ) ); + + if ( deleteSelectedFeature ) delete mSelectedFeature; + mSelectedFeature = 0; + } +} void QgsMapToolNodeTool::canvasDoubleClickEvent( QMouseEvent * e ) { diff --git a/src/app/nodetool/qgsmaptoolnodetool.h b/src/app/nodetool/qgsmaptoolnodetool.h index a857bce8039c..1173deaa51f9 100644 --- a/src/app/nodetool/qgsmaptoolnodetool.h +++ b/src/app/nodetool/qgsmaptoolnodetool.h @@ -60,12 +60,22 @@ class QgsMapToolNodeTool: public QgsMapToolVertexEdit */ void currentLayerChanged( QgsMapLayer *layer ); + /* + * the current edition state changed + */ + void editingToggled(); + private: /** * Deletes the rubber band pointers and clears mRubberBands */ void removeRubberBands(); + /** + * Disconnects signals and clears objects + */ + void cleanTool( bool deleteSelectedFeature = true ); + /** * Creating rubber band marker for movin of point * @param center coordinates of point to be moved