Skip to content

Commit 889f65f

Browse files
committed
#9181: fix crash trying to resume node editing
Clears temporal objects to avoid crash trying to resume node editing and disconnects signals to avoid repetitive connects
1 parent 75df3f4 commit 889f65f

File tree

2 files changed

+37
-10
lines changed

2 files changed

+37
-10
lines changed

src/app/nodetool/qgsmaptoolnodetool.cpp

+27-10
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ QgsMapToolNodeTool::QgsMapToolNodeTool( QgsMapCanvas* canvas )
4444

4545
QgsMapToolNodeTool::~QgsMapToolNodeTool()
4646
{
47-
removeRubberBands();
47+
cleanTool();
4848
}
4949

5050
void 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 )
485486
void QgsMapToolNodeTool::selectedFeatureDestroyed()
486487
{
487488
QgsDebugCall;
488-
mSelectedFeature = 0;
489+
cleanTool( false );
489490
}
490491

491492
void 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+
502505
void QgsMapToolNodeTool::canvasReleaseEvent( QMouseEvent * e )
503506
{
504507
if ( !mSelectedFeature )
@@ -605,10 +608,7 @@ void QgsMapToolNodeTool::canvasReleaseEvent( QMouseEvent * e )
605608

606609
void 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

646663
void QgsMapToolNodeTool::canvasDoubleClickEvent( QMouseEvent * e )
647664
{

src/app/nodetool/qgsmaptoolnodetool.h

+10
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,22 @@ class QgsMapToolNodeTool: public QgsMapToolVertexEdit
6060
*/
6161
void currentLayerChanged( QgsMapLayer *layer );
6262

63+
/*
64+
* the current edition state changed
65+
*/
66+
void editingToggled();
67+
6368
private:
6469
/**
6570
* Deletes the rubber band pointers and clears mRubberBands
6671
*/
6772
void removeRubberBands();
6873

74+
/**
75+
* Disconnects signals and clears objects
76+
*/
77+
void cleanTool( bool deleteSelectedFeature = true );
78+
6979
/**
7080
* Creating rubber band marker for movin of point
7181
* @param center coordinates of point to be moved

0 commit comments

Comments
 (0)