@@ -85,19 +85,80 @@ void QgsMapToolSelectUtils::expandSelectRectangle( QRect& selectRect,
85
85
selectRect.setBottom ( point.y () + boxSize );
86
86
}
87
87
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 )
93
89
{
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 ();
95
114
return ;
115
+ }
116
+
117
+ QgsVectorLayer::SelectBehaviour behaviour = QgsVectorLayer::SetSelection;
96
118
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
+ {
97
138
QgsVectorLayer* vlayer = QgsMapToolSelectUtils::getCurrentVectorLayer ( canvas );
98
139
if ( !vlayer )
99
140
return ;
100
141
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
+
101
162
// toLayerCoordinates will throw an exception for any 'invalid' points in
102
163
// the rubber band.
103
164
// For example, if you project a world map onto a globe using EPSG 2163
@@ -121,16 +182,13 @@ void QgsMapToolSelectUtils::setSelectFeatures( QgsMapCanvas* canvas,
121
182
QObject::tr ( " Selection extends beyond layer's coordinate system" ),
122
183
QgsMessageBar::WARNING,
123
184
QgisApp::instance ()->messageTimeout () );
124
- return ;
185
+ return newSelectedFeatures ;
125
186
}
126
187
}
127
188
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 );
134
192
135
193
QgsRenderContext context = QgsRenderContext::fromMapSettings ( canvas->mapSettings () );
136
194
context.expressionContext () << QgsExpressionContextUtils::layerScope ( vlayer );
@@ -148,7 +206,6 @@ void QgsMapToolSelectUtils::setSelectFeatures( QgsMapCanvas* canvas,
148
206
149
207
QgsFeatureIterator fit = vlayer->getFeatures ( request );
150
208
151
- QgsFeatureIds newSelectedFeatures;
152
209
QgsFeature f;
153
210
QgsFeatureId closestFeatureId = 0 ;
154
211
bool foundSingleFeature = false ;
@@ -196,40 +253,7 @@ void QgsMapToolSelectUtils::setSelectFeatures( QgsMapCanvas* canvas,
196
253
197
254
QgsDebugMsg ( " Number of new selected features: " + QString::number ( newSelectedFeatures.size () ) );
198
255
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;
228
257
}
229
258
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