Skip to content

Commit

Permalink
#9181: fix crash trying to resume node editing
Browse files Browse the repository at this point in the history
Clears temporal objects to avoid crash trying to resume node editing and
disconnects signals to avoid repetitive connects
  • Loading branch information
ahuarte47 committed Dec 18, 2013
1 parent 75df3f4 commit 889f65f
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 10 deletions.
37 changes: 27 additions & 10 deletions src/app/nodetool/qgsmaptoolnodetool.cpp
Expand Up @@ -44,7 +44,7 @@ QgsMapToolNodeTool::QgsMapToolNodeTool( QgsMapCanvas* canvas )

QgsMapToolNodeTool::~QgsMapToolNodeTool()
{
removeRubberBands();
cleanTool();
}

void QgsMapToolNodeTool::createMovingRubberBands()
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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 )
Expand Down Expand Up @@ -605,10 +608,7 @@ void QgsMapToolNodeTool::canvasReleaseEvent( QMouseEvent * e )

void QgsMapToolNodeTool::deactivate()
{
removeRubberBands();

delete mSelectedFeature;
mSelectedFeature = 0;
cleanTool();

mSelectionRubberBand = 0;
mSelectAnother = false;
Expand Down Expand Up @@ -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 )
{
Expand Down
10 changes: 10 additions & 0 deletions src/app/nodetool/qgsmaptoolnodetool.h
Expand Up @@ -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
Expand Down

0 comments on commit 889f65f

Please sign in to comment.