|
25 | 25 | #include "qgsmaplayermodel.h"
|
26 | 26 | #include "qgscomposition.h"
|
27 | 27 | #include "qgslayoutmanager.h"
|
| 28 | +#include "qgsmapcanvas.h" |
28 | 29 | #include <QToolButton>
|
29 | 30 |
|
30 | 31 | QgsLayerTreeLocatorFilter::QgsLayerTreeLocatorFilter( QObject *parent )
|
@@ -163,3 +164,80 @@ void QgsActionLocatorFilter::searchActions( const QString &string, QWidget *pare
|
163 | 164 | }
|
164 | 165 | }
|
165 | 166 | }
|
| 167 | + |
| 168 | +QgsActiveLayerFeaturesLocatorFilter::QgsActiveLayerFeaturesLocatorFilter( QObject *parent ) |
| 169 | + : QgsLocatorFilter( parent ) |
| 170 | +{ |
| 171 | + setUseWithoutPrefix( false ); |
| 172 | +} |
| 173 | + |
| 174 | +void QgsActiveLayerFeaturesLocatorFilter::fetchResults( const QString &string, const QgsLocatorContext &, QgsFeedback *feedback ) |
| 175 | +{ |
| 176 | + if ( string.length() < 3 ) |
| 177 | + return; |
| 178 | + |
| 179 | + QgsVectorLayer *layer = qobject_cast< QgsVectorLayer *>( QgisApp::instance()->activeLayer() ); |
| 180 | + if ( !layer ) |
| 181 | + return; |
| 182 | + |
| 183 | + int i = 0; |
| 184 | + int found = 0; |
| 185 | + QgsExpression dispExpression( layer->displayExpression() ); |
| 186 | + QgsExpressionContext context; |
| 187 | + context.appendScopes( QgsExpressionContextUtils::globalProjectLayerScopes( layer ) ); |
| 188 | + dispExpression.prepare( &context ); |
| 189 | + |
| 190 | + Q_FOREACH ( const QgsField &field, layer->fields() ) |
| 191 | + { |
| 192 | + if ( feedback->isCanceled() ) |
| 193 | + return; |
| 194 | + |
| 195 | + QString exp = QStringLiteral( "%1 ILIKE '%%2%'" ).arg( QgsExpression::quotedColumnRef( field.name() ), |
| 196 | + string ); |
| 197 | + QgsFeatureRequest req; |
| 198 | + req.setFlags( QgsFeatureRequest::NoGeometry ); |
| 199 | + QStringList attrs; |
| 200 | + attrs << field.name(); |
| 201 | + attrs.append( dispExpression.referencedColumns().toList() ); |
| 202 | + req.setSubsetOfAttributes( attrs, layer->fields() ); |
| 203 | + req.setFilterExpression( exp ); |
| 204 | + req.setLimit( 30 ); |
| 205 | + QgsFeature f; |
| 206 | + QgsFeatureIterator it = layer->getFeatures( req ); |
| 207 | + while ( it.nextFeature( f ) ) |
| 208 | + { |
| 209 | + if ( feedback->isCanceled() ) |
| 210 | + return; |
| 211 | + |
| 212 | + QgsLocatorResult result; |
| 213 | + result.filter = this; |
| 214 | + |
| 215 | + context.setFeature( f ); |
| 216 | + result.displayString = dispExpression.evaluate( &context ).toString(); |
| 217 | + if ( result.displayString.isEmpty() ) |
| 218 | + result.displayString = f.attribute( i ).toString(); |
| 219 | + else |
| 220 | + result.description = f.attribute( i ).toString(); |
| 221 | + |
| 222 | + result.userData = f.id(); |
| 223 | + result.icon = QgsMapLayerModel::iconForLayer( layer ); |
| 224 | + result.score = static_cast< double >( string.length() ) / f.attribute( i ).toString().size(); |
| 225 | + emit resultFetched( result ); |
| 226 | + |
| 227 | + found++; |
| 228 | + if ( found >= 30 ) |
| 229 | + return; |
| 230 | + } |
| 231 | + i++; |
| 232 | + } |
| 233 | +} |
| 234 | + |
| 235 | +void QgsActiveLayerFeaturesLocatorFilter::triggerResult( const QgsLocatorResult &result ) |
| 236 | +{ |
| 237 | + QgsFeatureId id = result.userData.toLongLong(); |
| 238 | + QgsVectorLayer *layer = qobject_cast< QgsVectorLayer *>( QgisApp::instance()->activeLayer() ); |
| 239 | + if ( !layer ) |
| 240 | + return; |
| 241 | + |
| 242 | + QgisApp::instance()->mapCanvas()->zoomToFeatureIds( layer, QgsFeatureIds() << id ); |
| 243 | +} |
0 commit comments