diff --git a/src/app/qgsadvanceddigitizingcanvasitem.cpp b/src/app/qgsadvanceddigitizingcanvasitem.cpp index b4c306ef69d..ab125d9d350 100644 --- a/src/app/qgsadvanceddigitizingcanvasitem.cpp +++ b/src/app/qgsadvanceddigitizingcanvasitem.cpp @@ -48,7 +48,7 @@ void QgsAdvancedDigitizingCanvasItem::paint( QPainter* painter ) const QgsPoint curPoint = mAdvancedDigitizingDockWidget->currentPoint( ); const QgsPoint prevPoint = mAdvancedDigitizingDockWidget->previousPoint( &previousPointExist ); const QgsPoint penulPoint = mAdvancedDigitizingDockWidget->penultimatePoint( &penulPointExist ); - const bool pointSnapped = mAdvancedDigitizingDockWidget->pointSnapped(); + const bool snappedToVertex = mAdvancedDigitizingDockWidget->snappedToVertex(); const QList snappedSegment = mAdvancedDigitizingDockWidget->snappedSegment(); const bool hasSnappedSegment = snappedSegment.count() == 2; @@ -81,14 +81,14 @@ void QgsAdvancedDigitizingCanvasItem::paint( QPainter* painter ) painter->setRenderHints( QPainter::Antialiasing ); // Draw point snap - if ( curPointExist && pointSnapped ) + if ( curPointExist && snappedToVertex ) { painter->setPen( mSnapPen ); painter->drawEllipse( curPointPix, 10, 10 ); } // Draw segment snap - if ( hasSnappedSegment && !pointSnapped ) + if ( hasSnappedSegment && !snappedToVertex ) { painter->setPen( mSnapPen ); painter->drawLine( snapSegmentPix1.x(), diff --git a/src/app/qgsadvanceddigitizingdockwidget.cpp b/src/app/qgsadvanceddigitizingdockwidget.cpp index d5e9cb64723..5497bac3433 100644 --- a/src/app/qgsadvanceddigitizingdockwidget.cpp +++ b/src/app/qgsadvanceddigitizingdockwidget.cpp @@ -90,7 +90,7 @@ QgsAdvancedDigitizingDockWidget::QgsAdvancedDigitizingDockWidget( QgsMapCanvas* , mSnappingMode(( QgsMapMouseEvent::SnappingMode ) QSettings().value( "/Cad/SnappingMode", ( int )QgsMapMouseEvent::SnapProjectConfig ).toInt() ) , mCommonAngleConstraint( QSettings().value( "/Cad/CommonAngle", 90 ).toInt() ) , mCadPointList( QList() ) - , mPointSnapped( false ) + , mSnappedToVertex( false ) , mSnappedSegment( QList() ) { setupUi( this ); @@ -520,7 +520,8 @@ bool QgsAdvancedDigitizingDockWidget::applyConstraints( QgsMapMouseEvent* e ) QgsDebugMsg( QString( "X: %1 %2 %3" ).arg( mXConstraint->isLocked() ).arg( mXConstraint->relative() ).arg( mXConstraint->value() ) ); QgsDebugMsg( QString( "Y: %1 %2 %3" ).arg( mYConstraint->isLocked() ).arg( mYConstraint->relative() ).arg( mYConstraint->value() ) ); - QgsPoint point = e->mapPoint( &mPointSnapped ); + QgsPoint point = e->mapPoint(); + mSnappedToVertex = e->isSnappedToVertex(); mSnappedSegment = e->snapSegment(); bool previousPointExist, penulPointExist; @@ -1136,7 +1137,7 @@ QgsPoint QgsAdvancedDigitizingDockWidget::currentPoint( bool* exist ) const { if ( exist ) *exist = pointsCount() > 0; - if ( pointsCount() > 1 ) + if ( pointsCount() > 0 ) return mCadPointList.at( 0 ); else return QgsPoint(); @@ -1190,7 +1191,7 @@ void QgsAdvancedDigitizingDockWidget::clearPoints() { mCadPointList.clear(); mSnappedSegment.clear(); - mPointSnapped = false; + mSnappedToVertex = false; updateCapacity(); } diff --git a/src/app/qgsadvanceddigitizingdockwidget.h b/src/app/qgsadvanceddigitizingdockwidget.h index 90b55a2efb1..595aba50de5 100644 --- a/src/app/qgsadvanceddigitizingdockwidget.h +++ b/src/app/qgsadvanceddigitizingdockwidget.h @@ -155,7 +155,7 @@ class APP_EXPORT QgsAdvancedDigitizingDockWidget : public QDockWidget, private U QgsPoint previousPoint( bool *exist = 0 ) const; QgsPoint penultimatePoint( bool *exist = 0 ) const; int pointsCount() const {return mCadPointList.count();} - bool pointSnapped() const {return mPointSnapped;} + bool snappedToVertex() const {return mSnappedToVertex;} const QList& snappedSegment() const {return mSnappedSegment;} //! return the action used to enable/disable the tools @@ -252,7 +252,7 @@ class APP_EXPORT QgsAdvancedDigitizingDockWidget : public QDockWidget, private U // point list and current snap point / segment QList mCadPointList; - bool mPointSnapped; + bool mSnappedToVertex; QList mSnappedSegment; // error message diff --git a/src/app/qgsmapmouseevent.cpp b/src/app/qgsmapmouseevent.cpp index 76540dfbaac..37b284f546b 100644 --- a/src/app/qgsmapmouseevent.cpp +++ b/src/app/qgsmapmouseevent.cpp @@ -72,7 +72,7 @@ void QgsMapMouseEvent::snapPoint() QgsTolerance::UnitType unit; snappingUtils->defaultSettings( type, tolerance, unit ); snappingUtils->setSnapToMapMode( QgsSnappingUtils::SnapAllLayers ); - snappingUtils->setDefaultSettings( QgsPointLocator::Vertex, tolerance, unit ); + snappingUtils->setDefaultSettings( QgsPointLocator::Vertex | QgsPointLocator::Edge, tolerance, unit ); mSnapMatch = snappingUtils->snapToMap( mMapPoint ); snappingUtils->setSnapToMapMode( canvasMode ); snappingUtils->setDefaultSettings( type, tolerance, unit ); @@ -94,15 +94,6 @@ QPoint QgsMapMouseEvent::mapToPixelCoordinates( QgsMapCanvas* canvas, const QgsP return QPoint( qRound( x ), qRound( y ) ); } -QgsPoint QgsMapMouseEvent::mapPoint( bool* snappedPoint ) const -{ - if ( snappedPoint ) - { - *snappedPoint = mSnapMatch.isValid(); - } - return mMapPoint; -} - QList QgsMapMouseEvent::snapSegment( bool* snapped, bool allLayers ) const { QList segment = QList(); @@ -117,12 +108,11 @@ QList QgsMapMouseEvent::snapSegment( bool* snapped, bool allLayers ) c else if ( mSnappingMode != NoSnapping ) { QgsPointLocator::Match match; - QgsPoint point; if ( mSnappingMode == SnapProjectConfig && !allLayers ) { // run snapToMap with only segments EdgesOnlyFilter filter; - match = mMapTool->canvas()->snappingUtils()->snapToMap( point, &filter ); + match = mMapTool->canvas()->snappingUtils()->snapToMap( mOriginalPoint, &filter ); } else if ( mSnappingMode == SnapAllLayers || allLayers ) { @@ -135,7 +125,7 @@ QList QgsMapMouseEvent::snapSegment( bool* snapped, bool allLayers ) c snappingUtils->defaultSettings( type, tolerance, unit ); snappingUtils->setSnapToMapMode( QgsSnappingUtils::SnapAllLayers ); snappingUtils->setDefaultSettings( QgsPointLocator::Edge, tolerance, unit ); - match = snappingUtils->snapToMap( point ); + match = snappingUtils->snapToMap( mOriginalPoint ); snappingUtils->setSnapToMapMode( canvasMode ); snappingUtils->setDefaultSettings( type, tolerance, unit ); } diff --git a/src/app/qgsmapmouseevent.h b/src/app/qgsmapmouseevent.h index 2e98bf39268..2e1f1c2d178 100644 --- a/src/app/qgsmapmouseevent.h +++ b/src/app/qgsmapmouseevent.h @@ -47,17 +47,23 @@ class APP_EXPORT QgsMapMouseEvent : public QMouseEvent //! modify the point in map coordinates without changing values in pixel coordinates void setPoint( const QgsPoint& point ); - //! returns the first snapped segment + //! returns the first snapped segment. If the snapped match is a segment, it will simply return it. + //! Otherwise it will try to snap a segment according to the event's snapping mode //! @param snapped if given, determines if a segment has been snapped //! @param allLayers if true, override snapping mode QList snapSegment( bool* snapped = 0, bool allLayers = false ) const; /** * @brief mapPoint returns the point in coordinates - * @param snappedPoint determines if the result is a snapped point or not. If snapped to a segment, will be set to false. * @return the point in map coordinates, after snapping if requested in the event. */ - QgsPoint mapPoint( bool* snappedPoint = 0 ) const; + QgsPoint mapPoint() const { return mMapPoint; } + + //! determines if the returned mapPoint() is snapped (to a vertex or to a segment) + bool isSnapped() const { return mSnapMatch.isValid(); } + + //! determines if the returned mapPoint() is snapped to a vertex. If snapped to a segment (or not snapped at all), will be set to false. + bool isSnappedToVertex() const { return mSnapMatch.hasVertex(); } private: /** diff --git a/src/app/qgsmaptoolcapture.cpp b/src/app/qgsmaptoolcapture.cpp index e2fa2e844ca..b6d589ab164 100644 --- a/src/app/qgsmaptoolcapture.cpp +++ b/src/app/qgsmaptoolcapture.cpp @@ -112,8 +112,8 @@ void QgsMapToolCapture::currentLayerChanged( QgsMapLayer *layer ) void QgsMapToolCapture::canvasMapMoveEvent( QgsMapMouseEvent * e ) { - bool snapped; - QgsPoint point = e->mapPoint( &snapped ); + bool snapped = e->isSnapped(); + QgsPoint point = e->mapPoint(); if ( !snapped ) {