@@ -75,7 +75,7 @@ void QgsMapToolFeatureAction::canvasReleaseEvent( QgsMapMouseEvent *e )
75
75
return ;
76
76
}
77
77
78
- if ( !doAction ( vlayer, e->x (), e->y () ) )
78
+ if ( !doAction ( vlayer, e->x (), e->y (), e-> pixelPoint () ) )
79
79
QgisApp::instance ()->statusBarIface ()->showMessage ( tr ( " No features at this position found." ) );
80
80
}
81
81
@@ -89,7 +89,7 @@ void QgsMapToolFeatureAction::deactivate()
89
89
QgsMapTool::deactivate ();
90
90
}
91
91
92
- bool QgsMapToolFeatureAction::doAction ( QgsVectorLayer *layer, int x, int y )
92
+ bool QgsMapToolFeatureAction::doAction ( QgsVectorLayer *layer, int x, int y, QPoint pixelpos )
93
93
{
94
94
if ( !layer )
95
95
return false ;
@@ -120,23 +120,33 @@ bool QgsMapToolFeatureAction::doAction( QgsVectorLayer *layer, int x, int y )
120
120
QgsDebugMsg ( QStringLiteral ( " Caught CRS exception %1" ).arg ( cse.what () ) );
121
121
}
122
122
123
- QMenu *featureMenu = new QMenu ();
123
+ QgsFeature f;
124
+ QgsFeatureList features;
124
125
QgsFeatureIterator fit = layer->getFeatures ( QgsFeatureRequest ().setFilterRect ( r ).setFlags ( QgsFeatureRequest::ExactIntersect ) );
125
- QgsFeature feat;
126
-
127
- int numberOfFeatures = 0 ;
128
- while ( fit.nextFeature ( feat ) )
126
+ while ( fit.nextFeature ( f ) )
129
127
{
130
- QAction *featureAction = featureMenu->addAction ( FID_TO_STRING ( feat.id () ) );
131
- connect ( featureAction, &QAction::triggered, this , [ = ] { doActionForFeature ( layer, feat, point );} );
132
- numberOfFeatures++;
128
+ features.append ( f );
133
129
}
134
130
135
- if ( numberOfFeatures == 0 )
136
- return false ;
137
- else
138
- featureMenu->exec ( point.toQPointF ().toPoint () );
139
- return true ;
131
+ if ( !features.isEmpty () )
132
+ {
133
+ if ( features.count () == 1 )
134
+ {
135
+ doActionForFeature ( layer, features.first (), point );
136
+ }
137
+ else
138
+ {
139
+ QMenu *featureMenu = new QMenu ();
140
+ for ( int i = 0 ; i < features.count (); i++ )
141
+ {
142
+ QAction *featureAction = featureMenu->addAction ( FID_TO_STRING ( features.at ( i ).id () ) );
143
+ connect ( featureAction, &QAction::triggered, this , [ = ] { doActionForFeature ( layer, features.at ( i ), point );} );
144
+ }
145
+ featureMenu->exec ( pixelpos );
146
+ }
147
+ return true ;
148
+ }
149
+ return false ;
140
150
}
141
151
142
152
void QgsMapToolFeatureAction::doActionForFeature ( QgsVectorLayer *layer, QgsFeature feat, QgsPointXY point )
0 commit comments