|
@@ -25,7 +25,7 @@ email : jpalmer at linz dot govt dot nz |
|
|
|
|
|
QgsMapToolSelectFreehand::QgsMapToolSelectFreehand( QgsMapCanvas *canvas ) |
|
|
: QgsMapTool( canvas ) |
|
|
, mDragging( false ) |
|
|
, mActive( false ) |
|
|
{ |
|
|
mRubberBand = nullptr; |
|
|
mCursor = Qt::ArrowCursor; |
|
@@ -38,25 +38,10 @@ QgsMapToolSelectFreehand::~QgsMapToolSelectFreehand() |
|
|
delete mRubberBand; |
|
|
} |
|
|
|
|
|
void QgsMapToolSelectFreehand::canvasPressEvent( QgsMapMouseEvent *e ) |
|
|
{ |
|
|
if ( e->button() != Qt::LeftButton ) |
|
|
return; |
|
|
|
|
|
if ( !mRubberBand ) |
|
|
{ |
|
|
mRubberBand = new QgsRubberBand( mCanvas, QgsWkbTypes::PolygonGeometry ); |
|
|
mRubberBand->setFillColor( mFillColor ); |
|
|
mRubberBand->setStrokeColor( mStrokeColor ); |
|
|
} |
|
|
mRubberBand->addPoint( toMapCoordinates( e->pos() ) ); |
|
|
mDragging = true; |
|
|
} |
|
|
|
|
|
|
|
|
void QgsMapToolSelectFreehand::canvasMoveEvent( QgsMapMouseEvent *e ) |
|
|
{ |
|
|
if ( !mDragging || !mRubberBand ) |
|
|
if ( !mActive || !mRubberBand ) |
|
|
return; |
|
|
|
|
|
mRubberBand->addPoint( toMapCoordinates( e->pos() ) ); |
|
@@ -65,34 +50,50 @@ void QgsMapToolSelectFreehand::canvasMoveEvent( QgsMapMouseEvent *e ) |
|
|
|
|
|
void QgsMapToolSelectFreehand::canvasReleaseEvent( QgsMapMouseEvent *e ) |
|
|
{ |
|
|
if ( !mRubberBand ) |
|
|
return; |
|
|
if ( !mActive ) |
|
|
{ |
|
|
if ( e->button() != Qt::LeftButton ) |
|
|
return; |
|
|
|
|
|
bool singleSelect = false; |
|
|
if ( mRubberBand->numberOfVertices() > 0 && mRubberBand->numberOfVertices() <= 2 ) |
|
|
if ( !mRubberBand ) |
|
|
{ |
|
|
mRubberBand = new QgsRubberBand( mCanvas, QgsWkbTypes::PolygonGeometry ); |
|
|
mRubberBand->setFillColor( mFillColor ); |
|
|
mRubberBand->setStrokeColor( mStrokeColor ); |
|
|
} |
|
|
else |
|
|
{ |
|
|
mRubberBand->reset( QgsWkbTypes::PolygonGeometry ); |
|
|
} |
|
|
mRubberBand->addPoint( toMapCoordinates( e->pos() ) ); |
|
|
mActive = true; |
|
|
} |
|
|
else |
|
|
{ |
|
|
// single click, not drag - create a rectangle around clicked point |
|
|
QgsVectorLayer *vlayer = QgsMapToolSelectUtils::getCurrentVectorLayer( mCanvas ); |
|
|
if ( vlayer ) |
|
|
if ( e->button() == Qt::LeftButton ) |
|
|
{ |
|
|
QRect selectRect; |
|
|
QgsMapToolSelectUtils::expandSelectRectangle( selectRect, vlayer, e->pos() ); |
|
|
QgsMapToolSelectUtils::setRubberBand( mCanvas, selectRect, mRubberBand ); |
|
|
singleSelect = true; |
|
|
if ( mRubberBand && mRubberBand->numberOfVertices() > 2 ) |
|
|
{ |
|
|
QgsGeometry shapeGeom = mRubberBand->asGeometry(); |
|
|
QgsMapToolSelectUtils::selectMultipleFeatures( mCanvas, shapeGeom, e->modifiers() ); |
|
|
} |
|
|
} |
|
|
|
|
|
mRubberBand->reset( QgsWkbTypes::PolygonGeometry ); |
|
|
delete mRubberBand; |
|
|
mRubberBand = nullptr; |
|
|
mActive = false; |
|
|
} |
|
|
} |
|
|
|
|
|
if ( mRubberBand->numberOfVertices() > 2 ) |
|
|
void QgsMapToolSelectFreehand::keyReleaseEvent( QKeyEvent *e ) |
|
|
{ |
|
|
if ( mActive && e->key() == Qt::Key_Escape ) |
|
|
{ |
|
|
QgsGeometry shapeGeom = mRubberBand->asGeometry(); |
|
|
if ( singleSelect ) |
|
|
QgsMapToolSelectUtils::selectSingleFeature( mCanvas, shapeGeom, e->modifiers() ); |
|
|
else |
|
|
QgsMapToolSelectUtils::selectMultipleFeatures( mCanvas, shapeGeom, e->modifiers() ); |
|
|
delete mRubberBand; |
|
|
mRubberBand = nullptr; |
|
|
mActive = false; |
|
|
return; |
|
|
} |
|
|
|
|
|
mRubberBand->reset( QgsWkbTypes::PolygonGeometry ); |
|
|
delete mRubberBand; |
|
|
mRubberBand = nullptr; |
|
|
mDragging = false; |
|
|
QgsMapTool::keyReleaseEvent( e ); |
|
|
} |