@@ -85,19 +85,80 @@ void QgsMapToolSelectUtils::expandSelectRectangle( QRect& selectRect,
8585 selectRect.setBottom ( point.y () + boxSize );
8686}
8787
88- void QgsMapToolSelectUtils::setSelectFeatures ( QgsMapCanvas* canvas,
89- QgsGeometry* selectGeometry,
90- bool doContains,
91- bool doDifference,
92- bool singleSelect )
88+ void QgsMapToolSelectUtils::selectMultipleFeatures ( QgsMapCanvas* canvas, QgsGeometry* selectGeometry, QMouseEvent* e )
9389{
94- if ( selectGeometry->type () != QGis::Polygon )
90+ QgsVectorLayer::SelectBehaviour behaviour = QgsVectorLayer::SetSelection;
91+ if ( e->modifiers () & Qt::ShiftModifier && e->modifiers () & Qt::ControlModifier )
92+ behaviour = QgsVectorLayer::IntersectSelection;
93+ else if ( e->modifiers () & Qt::ShiftModifier )
94+ behaviour = QgsVectorLayer::AddToSelection;
95+ else if ( e->modifiers () & Qt::ControlModifier )
96+ behaviour = QgsVectorLayer::RemoveFromSelection;
97+
98+ bool doContains = e->modifiers () & Qt::AltModifier;
99+ setSelectedFeatures ( canvas, selectGeometry, behaviour, doContains );
100+ }
101+
102+ void QgsMapToolSelectUtils::selectSingleFeature ( QgsMapCanvas* canvas, QgsGeometry* selectGeometry, QMouseEvent* e )
103+ {
104+ QgsVectorLayer* vlayer = QgsMapToolSelectUtils::getCurrentVectorLayer ( canvas );
105+ if ( !vlayer )
106+ return ;
107+
108+ QApplication::setOverrideCursor ( Qt::WaitCursor );
109+
110+ QgsFeatureIds selectedFeatures = getMatchingFeatures ( canvas, selectGeometry, false , true );
111+ if ( selectedFeatures.isEmpty () )
112+ {
113+ QApplication::restoreOverrideCursor ();
95114 return ;
115+ }
116+
117+ QgsVectorLayer::SelectBehaviour behaviour = QgsVectorLayer::SetSelection;
96118
119+ // either shift or control modifier switches to "toggle" selection mode
120+ if ( e->modifiers () & Qt::ShiftModifier || e->modifiers () & Qt::ControlModifier )
121+ {
122+ QgsFeatureId selectId = *selectedFeatures.constBegin ();
123+ QgsFeatureIds layerSelectedFeatures = vlayer->selectedFeaturesIds ();
124+ if ( layerSelectedFeatures.contains ( selectId ) )
125+ behaviour = QgsVectorLayer::RemoveFromSelection;
126+ else
127+ behaviour = QgsVectorLayer::AddToSelection;
128+ }
129+
130+ vlayer->selectByIds ( selectedFeatures, behaviour );
131+
132+ QApplication::restoreOverrideCursor ();
133+ }
134+
135+ void QgsMapToolSelectUtils::setSelectedFeatures ( QgsMapCanvas* canvas, QgsGeometry* selectGeometry,
136+ QgsVectorLayer::SelectBehaviour selectBehaviour, bool doContains, bool singleSelect )
137+ {
97138 QgsVectorLayer* vlayer = QgsMapToolSelectUtils::getCurrentVectorLayer ( canvas );
98139 if ( !vlayer )
99140 return ;
100141
142+ QApplication::setOverrideCursor ( Qt::WaitCursor );
143+
144+ QgsFeatureIds selectedFeatures = getMatchingFeatures ( canvas, selectGeometry, doContains, singleSelect );
145+ vlayer->selectByIds ( selectedFeatures, selectBehaviour );
146+
147+ QApplication::restoreOverrideCursor ();
148+ }
149+
150+
151+ QgsFeatureIds QgsMapToolSelectUtils::getMatchingFeatures ( QgsMapCanvas* canvas, QgsGeometry* selectGeometry, bool doContains, bool singleSelect )
152+ {
153+ QgsFeatureIds newSelectedFeatures;
154+
155+ if ( selectGeometry->type () != QGis::Polygon )
156+ return newSelectedFeatures;
157+
158+ QgsVectorLayer* vlayer = QgsMapToolSelectUtils::getCurrentVectorLayer ( canvas );
159+ if ( !vlayer )
160+ return newSelectedFeatures;
161+
101162 // toLayerCoordinates will throw an exception for any 'invalid' points in
102163 // the rubber band.
103164 // For example, if you project a world map onto a globe using EPSG 2163
@@ -121,16 +182,13 @@ void QgsMapToolSelectUtils::setSelectFeatures( QgsMapCanvas* canvas,
121182 QObject::tr ( " Selection extends beyond layer's coordinate system" ),
122183 QgsMessageBar::WARNING,
123184 QgisApp::instance ()->messageTimeout () );
124- return ;
185+ return newSelectedFeatures ;
125186 }
126187 }
127188
128- QApplication::setOverrideCursor ( Qt::WaitCursor );
129-
130- QgsDebugMsg ( " Selection layer: " + vlayer->name () );
131- QgsDebugMsg ( " Selection polygon: " + selectGeomTrans.exportToWkt () );
132- QgsDebugMsg ( " doContains: " + QString ( doContains ? " T" : " F" ) );
133- QgsDebugMsg ( " doDifference: " + QString ( doDifference ? " T" : " F" ) );
189+ QgsDebugMsgLevel ( " Selection layer: " + vlayer->name (), 3 );
190+ QgsDebugMsgLevel ( " Selection polygon: " + selectGeomTrans.exportToWkt (), 3 );
191+ QgsDebugMsgLevel ( " doContains: " + QString ( doContains ? " T" : " F" ), 3 );
134192
135193 QgsRenderContext context = QgsRenderContext::fromMapSettings ( canvas->mapSettings () );
136194 context.expressionContext () << QgsExpressionContextUtils::layerScope ( vlayer );
@@ -148,7 +206,6 @@ void QgsMapToolSelectUtils::setSelectFeatures( QgsMapCanvas* canvas,
148206
149207 QgsFeatureIterator fit = vlayer->getFeatures ( request );
150208
151- QgsFeatureIds newSelectedFeatures;
152209 QgsFeature f;
153210 QgsFeatureId closestFeatureId = 0 ;
154211 bool foundSingleFeature = false ;
@@ -196,40 +253,7 @@ void QgsMapToolSelectUtils::setSelectFeatures( QgsMapCanvas* canvas,
196253
197254 QgsDebugMsg ( " Number of new selected features: " + QString::number ( newSelectedFeatures.size () ) );
198255
199- if ( doDifference )
200- {
201- QgsFeatureIds layerSelectedFeatures = vlayer->selectedFeaturesIds ();
202-
203- QgsFeatureIds selectedFeatures;
204- QgsFeatureIds deselectedFeatures;
205-
206- QgsFeatureIds::const_iterator i = newSelectedFeatures.constEnd ();
207- while ( i != newSelectedFeatures.constBegin () )
208- {
209- --i;
210- if ( layerSelectedFeatures.contains ( *i ) )
211- {
212- deselectedFeatures.insert ( *i );
213- }
214- else
215- {
216- selectedFeatures.insert ( *i );
217- }
218- }
219-
220- vlayer->modifySelection ( selectedFeatures, deselectedFeatures );
221- }
222- else
223- {
224- vlayer->selectByIds ( newSelectedFeatures );
225- }
226-
227- QApplication::restoreOverrideCursor ();
256+ return newSelectedFeatures;
228257}
229258
230- void QgsMapToolSelectUtils::setSelectFeatures ( QgsMapCanvas* canvas, QgsGeometry* selectGeometry, QMouseEvent * e )
231- {
232- bool doContains = e->modifiers () & Qt::ShiftModifier;
233- bool doDifference = e->modifiers () & Qt::ControlModifier;
234- setSelectFeatures ( canvas, selectGeometry, doContains, doDifference );
235- }
259+
0 commit comments