Skip to content

Commit 510a228

Browse files
committed
switch freehand selection map tool to click-click
to be coherent with other map tools add-ons: possible map move/zoom while selecting, and operation canceling (right-click or ESC)
1 parent fe13c0e commit 510a228

File tree

2 files changed

+44
-43
lines changed

2 files changed

+44
-43
lines changed

src/app/qgsmaptoolselectfreehand.cpp

Lines changed: 40 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ email : jpalmer at linz dot govt dot nz
2525

2626
QgsMapToolSelectFreehand::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

5742
void 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

6651
void 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
}

src/app/qgsmaptoolselectfreehand.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,18 +34,18 @@ class APP_EXPORT QgsMapToolSelectFreehand : public QgsMapTool
3434
//! Overridden mouse move event
3535
void canvasMoveEvent( QgsMapMouseEvent *e ) override;
3636

37-
//! Overridden mouse press event
38-
void canvasPressEvent( QgsMapMouseEvent *e ) override;
39-
4037
//! Overridden mouse release event
4138
void canvasReleaseEvent( QgsMapMouseEvent *e ) override;
4239

40+
//! catch escape when active to cancel selection
41+
void keyReleaseEvent( QKeyEvent *e ) override;
42+
4343
private:
4444

4545
//! used for storing all of the maps point for the freehand sketch
4646
QgsRubberBand *mRubberBand = nullptr;
4747

48-
bool mDragging;
48+
bool mActive;
4949

5050
QColor mFillColor;
5151
QColor mStrokeColor;

0 commit comments

Comments
 (0)