@@ -25,7 +25,7 @@ email : jpalmer at linz dot govt dot nz
2525
2626QgsMapToolSelectFreehand::QgsMapToolSelectFreehand ( QgsMapCanvas *canvas )
2727 : QgsMapTool( canvas )
28- , mDragging ( false )
28+ , mActive ( false )
2929{
3030 mRubberBand = nullptr ;
3131 mCursor = Qt::ArrowCursor;
@@ -38,25 +38,10 @@ QgsMapToolSelectFreehand::~QgsMapToolSelectFreehand()
3838 delete mRubberBand ;
3939}
4040
41- void QgsMapToolSelectFreehand::canvasPressEvent ( QgsMapMouseEvent *e )
42- {
43- if ( e->button () != Qt::LeftButton )
44- return ;
45-
46- if ( !mRubberBand )
47- {
48- mRubberBand = new QgsRubberBand ( mCanvas , QgsWkbTypes::PolygonGeometry );
49- mRubberBand ->setFillColor ( mFillColor );
50- mRubberBand ->setStrokeColor ( mStrokeColor );
51- }
52- mRubberBand ->addPoint ( toMapCoordinates ( e->pos () ) );
53- mDragging = true ;
54- }
55-
5641
5742void QgsMapToolSelectFreehand::canvasMoveEvent ( QgsMapMouseEvent *e )
5843{
59- if ( !mDragging || !mRubberBand )
44+ if ( !mActive || !mRubberBand )
6045 return ;
6146
6247 mRubberBand ->addPoint ( toMapCoordinates ( e->pos () ) );
@@ -65,34 +50,50 @@ void QgsMapToolSelectFreehand::canvasMoveEvent( QgsMapMouseEvent *e )
6550
6651void QgsMapToolSelectFreehand::canvasReleaseEvent ( QgsMapMouseEvent *e )
6752{
68- if ( !mRubberBand )
69- return ;
53+ if ( !mActive )
54+ {
55+ if ( e->button () != Qt::LeftButton )
56+ return ;
7057
71- bool singleSelect = false ;
72- if ( mRubberBand ->numberOfVertices () > 0 && mRubberBand ->numberOfVertices () <= 2 )
58+ if ( !mRubberBand )
59+ {
60+ mRubberBand = new QgsRubberBand ( mCanvas , QgsWkbTypes::PolygonGeometry );
61+ mRubberBand ->setFillColor ( mFillColor );
62+ mRubberBand ->setStrokeColor ( mStrokeColor );
63+ }
64+ else
65+ {
66+ mRubberBand ->reset ( QgsWkbTypes::PolygonGeometry );
67+ }
68+ mRubberBand ->addPoint ( toMapCoordinates ( e->pos () ) );
69+ mActive = true ;
70+ }
71+ else
7372 {
74- // single click, not drag - create a rectangle around clicked point
75- QgsVectorLayer *vlayer = QgsMapToolSelectUtils::getCurrentVectorLayer ( mCanvas );
76- if ( vlayer )
73+ if ( e->button () == Qt::LeftButton )
7774 {
78- QRect selectRect;
79- QgsMapToolSelectUtils::expandSelectRectangle ( selectRect, vlayer, e->pos () );
80- QgsMapToolSelectUtils::setRubberBand ( mCanvas , selectRect, mRubberBand );
81- singleSelect = true ;
75+ if ( mRubberBand && mRubberBand ->numberOfVertices () > 2 )
76+ {
77+ QgsGeometry shapeGeom = mRubberBand ->asGeometry ();
78+ QgsMapToolSelectUtils::selectMultipleFeatures ( mCanvas , shapeGeom, e->modifiers () );
79+ }
8280 }
81+
82+ mRubberBand ->reset ( QgsWkbTypes::PolygonGeometry );
83+ delete mRubberBand ;
84+ mRubberBand = nullptr ;
85+ mActive = false ;
8386 }
87+ }
8488
85- if ( mRubberBand ->numberOfVertices () > 2 )
89+ void QgsMapToolSelectFreehand::keyReleaseEvent ( QKeyEvent *e )
90+ {
91+ if ( mActive && e->key () == Qt::Key_Escape )
8692 {
87- QgsGeometry shapeGeom = mRubberBand ->asGeometry ();
88- if ( singleSelect )
89- QgsMapToolSelectUtils::selectSingleFeature ( mCanvas , shapeGeom, e->modifiers () );
90- else
91- QgsMapToolSelectUtils::selectMultipleFeatures ( mCanvas , shapeGeom, e->modifiers () );
93+ delete mRubberBand ;
94+ mRubberBand = nullptr ;
95+ mActive = false ;
96+ return ;
9297 }
93-
94- mRubberBand ->reset ( QgsWkbTypes::PolygonGeometry );
95- delete mRubberBand ;
96- mRubberBand = nullptr ;
97- mDragging = false ;
98+ QgsMapTool::keyReleaseEvent ( e );
9899}
0 commit comments