From d96d18d27f544c823a430caab0834c13773043f5 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Wed, 24 Jan 2024 18:55:47 +0100 Subject: [PATCH] QgsMapToolMoveFeature::cadCanvasMoveEvent(): fix crash when currentVectorLayer() returns NULL (fixes #55492) --- src/app/qgsmaptoolmovefeature.cpp | 49 ++++++++++++++++--------------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/src/app/qgsmaptoolmovefeature.cpp b/src/app/qgsmaptoolmovefeature.cpp index f19d53313e07..315a331f8694 100644 --- a/src/app/qgsmaptoolmovefeature.cpp +++ b/src/app/qgsmaptoolmovefeature.cpp @@ -49,35 +49,36 @@ void QgsMapToolMoveFeature::cadCanvasMoveEvent( QgsMapMouseEvent *e ) { if ( mRubberBand ) { - QgsVectorLayer *vlayer = currentVectorLayer(); - - // When MapCanvas crs == layer crs, fast rubberband translation - if ( vlayer->crs() == canvas()->mapSettings().destinationCrs() ) - { - const QgsPointXY pointCanvasCoords = e->mapPoint(); - const double offsetX = pointCanvasCoords.x() - mStartPointMapCoords.x(); - const double offsetY = pointCanvasCoords.y() - mStartPointMapCoords.y(); - mRubberBand->setTranslationOffset( offsetX, offsetY ); - } - - // Else, recreate the rubber band from the translated geometries - else + if ( QgsVectorLayer *vlayer = currentVectorLayer() ) { - const QgsPointXY startPointLayerCoords = toLayerCoordinates( ( QgsMapLayer * )vlayer, mStartPointMapCoords ); - const QgsPointXY stopPointLayerCoords = toLayerCoordinates( ( QgsMapLayer * )vlayer, e->mapPoint() ); - - const double dx = stopPointLayerCoords.x() - startPointLayerCoords.x(); - const double dy = stopPointLayerCoords.y() - startPointLayerCoords.y(); - - QgsGeometry geom = mGeom; - - if ( geom.translate( dx, dy ) == Qgis::GeometryOperationResult::Success ) + // When MapCanvas crs == layer crs, fast rubberband translation + if ( vlayer->crs() == canvas()->mapSettings().destinationCrs() ) { - mRubberBand->setToGeometry( geom, vlayer ); + const QgsPointXY pointCanvasCoords = e->mapPoint(); + const double offsetX = pointCanvasCoords.x() - mStartPointMapCoords.x(); + const double offsetY = pointCanvasCoords.y() - mStartPointMapCoords.y(); + mRubberBand->setTranslationOffset( offsetX, offsetY ); } + + // Else, recreate the rubber band from the translated geometries else { - mRubberBand->reset( vlayer->geometryType() ); + const QgsPointXY startPointLayerCoords = toLayerCoordinates( ( QgsMapLayer * )vlayer, mStartPointMapCoords ); + const QgsPointXY stopPointLayerCoords = toLayerCoordinates( ( QgsMapLayer * )vlayer, e->mapPoint() ); + + const double dx = stopPointLayerCoords.x() - startPointLayerCoords.x(); + const double dy = stopPointLayerCoords.y() - startPointLayerCoords.y(); + + QgsGeometry geom = mGeom; + + if ( geom.translate( dx, dy ) == Qgis::GeometryOperationResult::Success ) + { + mRubberBand->setToGeometry( geom, vlayer ); + } + else + { + mRubberBand->reset( vlayer->geometryType() ); + } } } }