Skip to content

Commit

Permalink
Get rid of last snapToBackgroundLayers() calls
Browse files Browse the repository at this point in the history
  • Loading branch information
wonder-sk committed Jan 20, 2015
1 parent 30684c7 commit 208b5e3
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 70 deletions.
58 changes: 35 additions & 23 deletions src/app/nodetool/qgsmaptoolnodetool.cpp
Expand Up @@ -24,11 +24,21 @@
#include "qgsmapcanvas.h"
#include "qgsproject.h"
#include "qgsrubberband.h"
#include "qgssnappingutils.h"
#include "qgsvectorlayer.h"

#include <QMouseEvent>
#include <QRubberBand>

//! Match filter that does not accept only one particular point
struct QgsExcludePointFilter : public QgsPointLocator::MatchFilter
{
QgsExcludePointFilter( const QgsPoint& exclPoint ) : mExclPoint( exclPoint ) {}
bool acceptMatch( const QgsPointLocator::Match& match ) { return match.point() != mExclPoint; }
QgsPoint mExclPoint;
};


QgsMapToolNodeTool::QgsMapToolNodeTool( QgsMapCanvas* canvas )
: QgsMapToolVertexEdit( canvas )
, mSelectedFeature( 0 )
Expand Down Expand Up @@ -256,26 +266,22 @@ void QgsMapToolNodeTool::canvasMoveEvent( QMouseEvent * e )
}
createMovingRubberBands();

QList<QgsSnappingResult> snapResults;
QgsPoint posMapCoord = snapPointFromResults( snapResults, e->pos() );
mPosMapCoordBackup = posMapCoord;
mPosMapCoordBackup = toMapCoordinates( e->pos() );
}
else
{
// move rubberband
QList<QgsSnappingResult> snapResults;
mSnapper.snapToBackgroundLayers( e->pos(), snapResults, QList<QgsPoint>() << mClosestMapVertex );

// get correct coordinates to move to
QgsPoint posMapCoord = snapPointFromResults( snapResults, e->pos() );

QgsPoint pressMapCoords;
if ( snapResults.size() > 0 )
QgsPoint posMapCoord, pressMapCoords;
QgsExcludePointFilter excludePointFilter( mClosestMapVertex );
QgsPointLocator::Match match = mCanvas->snappingUtils()->snapToMap( e->pos(), &excludePointFilter );
if ( match.isValid() )
{
posMapCoord = match.point();
pressMapCoords = mClosestMapVertex;
}
else
{
posMapCoord = toMapCoordinates( e->pos() );
pressMapCoords = toMapCoordinates( mPressCoordinates );
}

Expand Down Expand Up @@ -544,27 +550,33 @@ void QgsMapToolNodeTool::canvasReleaseEvent( QMouseEvent * e )
if ( mMoving )
{
mMoving = false;
QgsPoint releaseMapCoords, pressMapCoords;

QList<QgsSnappingResult> snapResults;
mSnapper.snapToBackgroundLayers( e->pos(), snapResults, QList<QgsPoint>() << mClosestMapVertex );

QgsPoint releaseLayerCoords = toLayerCoordinates( vlayer, snapPointFromResults( snapResults, e->pos() ) );
QgsExcludePointFilter excludePointFilter( mClosestMapVertex );
QgsPointLocator::Match match = mCanvas->snappingUtils()->snapToMap( e->pos(), &excludePointFilter );

QgsPoint pressLayerCoords;
if ( snapResults.size() > 0 )
if ( match.isValid() )
{
releaseMapCoords = match.point();
pressMapCoords = mClosestMapVertex;
}
else
{
pressLayerCoords = toLayerCoordinates( vlayer, mClosestMapVertex );
releaseMapCoords = toMapCoordinates( e->pos() );
pressMapCoords = toMapCoordinates( mPressCoordinates );
}

QgsPoint releaseLayerCoords = toLayerCoordinates( vlayer, releaseMapCoords );
QgsPoint pressLayerCoords = toLayerCoordinates( vlayer, pressMapCoords );

if ( match.isValid() )
{
int topologicalEditing = QgsProject::instance()->readNumEntry( "Digitizing", "/TopologicalEditing", 0 );
if ( topologicalEditing )
{
insertSegmentVerticesForSnap( snapResults, vlayer );
addTopologicalPoints( QList<QgsPoint>() << releaseMapCoords );
}
}
else
{
pressLayerCoords = toLayerCoordinates( vlayer, mPressCoordinates );
}

mSelectedFeature->moveSelectedVertexes( releaseLayerCoords - pressLayerCoords );
mCanvas->refresh();
Expand Down
32 changes: 0 additions & 32 deletions src/app/qgsmaptooledit.cpp
Expand Up @@ -32,38 +32,6 @@ QgsMapToolEdit::~QgsMapToolEdit()
{
}

int QgsMapToolEdit::insertSegmentVerticesForSnap( const QList<QgsSnappingResult>& snapResults, QgsVectorLayer* editedLayer )
{
QgsPoint layerPoint;

if ( !editedLayer || !editedLayer->isEditable() )
{
return 1;
}

//transform snaping coordinates to layer crs first
QList<QgsSnappingResult> transformedSnapResults = snapResults;
QList<QgsSnappingResult>::iterator it = transformedSnapResults.begin();
for ( ; it != transformedSnapResults.constEnd(); ++it )
{
QgsPoint layerPoint = toLayerCoordinates( editedLayer, it->snappedVertex );
it->snappedVertex = layerPoint;
}

return editedLayer->insertSegmentVerticesForSnap( transformedSnapResults );
}

QgsPoint QgsMapToolEdit::snapPointFromResults( const QList<QgsSnappingResult>& snapResults, const QPoint& screenCoords )
{
if ( snapResults.size() < 1 )
{
return toMapCoordinates( screenCoords );
}
else
{
return snapResults.constBegin()->snappedVertex;
}
}

QgsRubberBand* QgsMapToolEdit::createRubberBand( QGis::GeometryType geometryType, bool alternativeBand )
{
Expand Down
15 changes: 0 additions & 15 deletions src/app/qgsmaptooledit.h
Expand Up @@ -31,21 +31,6 @@ class APP_EXPORT QgsMapToolEdit: public QgsMapToolAdvancedDigitizing
virtual bool isEditTool() override { return true; }

protected:
/**Inserts vertices to the snapped segments of the editing layer.
This is useful for topological editing if snap to segment is enabled.
@param snapResults results collected from the snapping operation
@param editedLayer pointer to the editing layer
@return 0 in case of success*/
int insertSegmentVerticesForSnap( const QList<QgsSnappingResult>& snapResults, QgsVectorLayer* editedLayer );

/**Extracts a single snapping point from a set of snapping results.
This is useful for snapping operations that just require a position to snap to and not all the
snapping results. If the list is empty, the screen coordinates are transformed into map coordinates and returned
@param snapResults results collected from the snapping operation.
@return the snapped point in map coordinates
CADTODO to be removed
*/
QgsPoint snapPointFromResults( const QList<QgsSnappingResult>& snapResults, const QPoint& screenCoords );

/** Creates a rubber band with the color/line width from
* the QGIS settings. The caller takes ownership of the
Expand Down

0 comments on commit 208b5e3

Please sign in to comment.