@@ -44,7 +44,7 @@ QgsMapToolNodeTool::QgsMapToolNodeTool( QgsMapCanvas* canvas )
4444
4545QgsMapToolNodeTool::~QgsMapToolNodeTool ()
4646{
47- removeRubberBands ();
47+ cleanTool ();
4848}
4949
5050void QgsMapToolNodeTool::createMovingRubberBands ()
@@ -369,6 +369,7 @@ void QgsMapToolNodeTool::canvasPressEvent( QMouseEvent * e )
369369 mSelectedFeature = new QgsSelectedFeature ( snapResults[0 ].snappedAtGeometry , vlayer, mCanvas );
370370 connect ( QgisApp::instance ()->legend (), SIGNAL ( currentLayerChanged ( QgsMapLayer* ) ), this , SLOT ( currentLayerChanged ( QgsMapLayer* ) ) );
371371 connect ( mSelectedFeature , SIGNAL ( destroyed () ), this , SLOT ( selectedFeatureDestroyed () ) );
372+ connect ( vlayer, SIGNAL ( editingStopped () ), this , SLOT ( editingToggled () ) );
372373 mIsPoint = vlayer->geometryType () == QGis::Point;
373374 }
374375 else
@@ -485,20 +486,22 @@ void QgsMapToolNodeTool::canvasPressEvent( QMouseEvent * e )
485486void QgsMapToolNodeTool::selectedFeatureDestroyed ()
486487{
487488 QgsDebugCall;
488- mSelectedFeature = 0 ;
489+ cleanTool ( false ) ;
489490}
490491
491492void QgsMapToolNodeTool::currentLayerChanged ( QgsMapLayer *layer )
492493{
493494 if ( mSelectedFeature && layer != mSelectedFeature ->vlayer () )
494495 {
495- delete mSelectedFeature ;
496- mSelectedFeature = 0 ;
497-
498- removeRubberBands ();
496+ cleanTool ();
499497 }
500498}
501499
500+ void QgsMapToolNodeTool::editingToggled ()
501+ {
502+ cleanTool ();
503+ }
504+
502505void QgsMapToolNodeTool::canvasReleaseEvent ( QMouseEvent * e )
503506{
504507 if ( !mSelectedFeature )
@@ -605,10 +608,7 @@ void QgsMapToolNodeTool::canvasReleaseEvent( QMouseEvent * e )
605608
606609void QgsMapToolNodeTool::deactivate ()
607610{
608- removeRubberBands ();
609-
610- delete mSelectedFeature ;
611- mSelectedFeature = 0 ;
611+ cleanTool ();
612612
613613 mSelectionRubberBand = 0 ;
614614 mSelectAnother = false ;
@@ -642,6 +642,23 @@ void QgsMapToolNodeTool::removeRubberBands()
642642 mSelectedFeature ->cleanRubberBandsData ();
643643}
644644
645+ void QgsMapToolNodeTool::cleanTool ( bool deleteSelectedFeature )
646+ {
647+ removeRubberBands ();
648+
649+ if ( mSelectedFeature )
650+ {
651+ QgsVectorLayer *vlayer = mSelectedFeature ->vlayer ();
652+ Q_ASSERT ( vlayer );
653+
654+ disconnect ( QgisApp::instance ()->legend (), SIGNAL ( currentLayerChanged ( QgsMapLayer* ) ), this , SLOT ( currentLayerChanged ( QgsMapLayer* ) ) );
655+ disconnect ( mSelectedFeature , SIGNAL ( destroyed () ), this , SLOT ( selectedFeatureDestroyed () ) );
656+ disconnect ( vlayer, SIGNAL ( editingStopped () ), this , SLOT ( editingToggled () ) );
657+
658+ if ( deleteSelectedFeature ) delete mSelectedFeature ;
659+ mSelectedFeature = 0 ;
660+ }
661+ }
645662
646663void QgsMapToolNodeTool::canvasDoubleClickEvent ( QMouseEvent * e )
647664{
0 commit comments