Skip to content

Commit ad86ffe

Browse files
committed
Fix #12088 - selection tool - do not consider invisible features
This avoids dangerous situations where the user inadvertently selects features that are not rendered and does further actions (like to delete them)
1 parent 7f2fac1 commit ad86ffe

File tree

1 file changed

+22
-1
lines changed

1 file changed

+22
-1
lines changed

src/app/qgsmaptoolselectutils.cpp

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ email : jpalmer at linz dot govt dot nz
2222
#include "qgsvectorlayer.h"
2323
#include "qgsfeature.h"
2424
#include "qgsgeometry.h"
25+
#include "qgsrendererv2.h"
2526
#include "qgsrubberband.h"
2627
#include "qgscsexception.h"
2728
#include "qgslogger.h"
@@ -135,7 +136,20 @@ void QgsMapToolSelectUtils::setSelectFeatures( QgsMapCanvas* canvas,
135136
QgsDebugMsg( "doContains: " + QString( doContains ? "T" : "F" ) );
136137
QgsDebugMsg( "doDifference: " + QString( doDifference ? "T" : "F" ) );
137138

138-
QgsFeatureIterator fit = vlayer->getFeatures( QgsFeatureRequest().setFilterRect( selectGeomTrans.boundingBox() ).setFlags( QgsFeatureRequest::ExactIntersect ).setSubsetOfAttributes( QgsAttributeList() ) );
139+
QgsRenderContext context = QgsRenderContext::fromMapSettings( canvas->mapSettings() );
140+
QgsFeatureRendererV2* r = vlayer->rendererV2();
141+
if ( r )
142+
r->startRender( context, vlayer->pendingFields() );
143+
144+
QgsFeatureRequest request;
145+
request.setFilterRect( selectGeomTrans.boundingBox() );
146+
request.setFlags( QgsFeatureRequest::ExactIntersect );
147+
if ( r )
148+
request.setSubsetOfAttributes( r->usedAttributes(), vlayer->pendingFields() );
149+
else
150+
request.setSubsetOfAttributes( QgsAttributeList() );
151+
152+
QgsFeatureIterator fit = vlayer->getFeatures( request );
139153

140154
QgsFeatureIds newSelectedFeatures;
141155
QgsFeature f;
@@ -144,6 +158,10 @@ void QgsMapToolSelectUtils::setSelectFeatures( QgsMapCanvas* canvas,
144158
double closestFeatureDist = std::numeric_limits<double>::max();
145159
while ( fit.nextFeature( f ) )
146160
{
161+
// make sure to only use features that are visible
162+
if ( r && !r->willRenderFeature( f ) )
163+
continue;
164+
147165
QgsGeometry* g = f.geometry();
148166
if ( doContains )
149167
{
@@ -175,6 +193,9 @@ void QgsMapToolSelectUtils::setSelectFeatures( QgsMapCanvas* canvas,
175193
newSelectedFeatures.insert( closestFeatureId );
176194
}
177195

196+
if ( r )
197+
r->stopRender( context );
198+
178199
QgsDebugMsg( "Number of new selected features: " + QString::number( newSelectedFeatures.size() ) );
179200

180201
if ( doDifference )

0 commit comments

Comments
 (0)