Skip to content

Commit

Permalink
allow to define max number of results for some locator filters
Browse files Browse the repository at this point in the history
this allows to define:
*  maximum number of results for active layer
* global maximumum filter + per layer maximum numer of results of all layers features filter
  • Loading branch information
3nids committed Sep 7, 2020
1 parent cb51326 commit 313b824
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 5 deletions.
69 changes: 68 additions & 1 deletion src/app/locator/qgsinbuiltlocatorfilters.cpp
Expand Up @@ -17,6 +17,7 @@

#include <QClipboard>
#include <QMap>
#include <QSpinBox>
#include <QString>
#include <QToolButton>
#include <QUrl>
Expand All @@ -36,6 +37,7 @@
#include "qgsfeatureaction.h"
#include "qgsvectorlayerfeatureiterator.h"
#include "qgsexpressioncontextutils.h"
#include "qgssettings.h"


QgsLayerTreeLocatorFilter::QgsLayerTreeLocatorFilter( QObject *parent )
Expand Down Expand Up @@ -248,6 +250,9 @@ void QgsActiveLayerFeaturesLocatorFilter::prepare( const QString &string, const
if ( string.length() < 3 && !context.usingPrefix )
return;

QgsSettings settings;
mMaxTotalResults = settings.value( QStringLiteral( "locator_filters/active_layer_features/limit_global" ), 30, QgsSettings::App ).toInt();

bool allowNumeric = false;
double numericalValue = string.toDouble( &allowNumeric );

Expand Down Expand Up @@ -333,7 +338,7 @@ void QgsActiveLayerFeaturesLocatorFilter::fetchResults( const QString &string, c
emit resultFetched( result );

found++;
if ( found >= 30 )
if ( found >= mMaxTotalResults )
break;
}
}
Expand All @@ -350,6 +355,31 @@ void QgsActiveLayerFeaturesLocatorFilter::triggerResult( const QgsLocatorResult
QgisApp::instance()->mapCanvas()->zoomToFeatureIds( layer, QgsFeatureIds() << id );
}

void QgsActiveLayerFeaturesLocatorFilter::openConfigWidget( QWidget *parent )
{
QString key = "locator_filters/active_layer_features";
QgsSettings settings;
std::unique_ptr<QDialog> dlg( new QDialog( parent ) );
dlg->restoreGeometry( settings.value( QStringLiteral( "Windows/%1/geometry" ).arg( key ) ).toByteArray() );
dlg->setWindowTitle( "All layers features locator filter" );
QFormLayout *formLayout = new QFormLayout;
QSpinBox *globalLimitSpinBox = new QSpinBox( dlg.get() );
globalLimitSpinBox->setValue( settings.value( QStringLiteral( "%1/limit_global" ).arg( key ), 30, QgsSettings::App ).toInt() );
globalLimitSpinBox->setMinimum( 1 );
globalLimitSpinBox->setMaximum( 200 );
formLayout->addRow( tr( "&Maximum number of results:" ), globalLimitSpinBox );
QDialogButtonBox *buttonbBox = new QDialogButtonBox( QDialogButtonBox::Ok | QDialogButtonBox::Cancel, dlg.get() );
formLayout->addRow( buttonbBox );
dlg->setLayout( formLayout );
connect( buttonbBox, &QDialogButtonBox::accepted, [&]()
{
settings.setValue( QStringLiteral( "%1/limit_global" ).arg( key ), globalLimitSpinBox->value(), QgsSettings::App );
dlg->accept();
} );
connect( buttonbBox, &QDialogButtonBox::rejected, dlg.get(), &QDialog::reject );
dlg->exec();
}

//
// QgsAllLayersFeaturesLocatorFilter
//
Expand All @@ -371,6 +401,10 @@ void QgsAllLayersFeaturesLocatorFilter::prepare( const QString &string, const Qg
if ( string.length() < 3 && !context.usingPrefix )
return;

QgsSettings settings;
mMaxTotalResults = settings.value( "locator_filters/all_layers_features/limit_global", 15, QgsSettings::App ).toInt();
mMaxResultsPerLayer = settings.value( "locator_filters/all_layers_features/limit_per_layer", 8, QgsSettings::App ).toInt();

mPreparedLayers.clear();
const QMap<QString, QgsMapLayer *> layers = QgsProject::instance()->mapLayers();
for ( auto it = layers.constBegin(); it != layers.constEnd(); ++it )
Expand Down Expand Up @@ -526,6 +560,38 @@ void QgsAllLayersFeaturesLocatorFilter::triggerResultFromAction( const QgsLocato
}
}

void QgsAllLayersFeaturesLocatorFilter::openConfigWidget( QWidget *parent )
{
QString key = "locator_filters/all_layers_features";
QgsSettings settings;
std::unique_ptr<QDialog> dlg( new QDialog( parent ) );
dlg->restoreGeometry( settings.value( QStringLiteral( "Windows/%1/geometry" ).arg( key ) ).toByteArray() );
dlg->setWindowTitle( "All layers features locator filter" );
QFormLayout *formLayout = new QFormLayout;
QSpinBox *globalLimitSpinBox = new QSpinBox( dlg.get() );
globalLimitSpinBox->setValue( settings.value( QStringLiteral( "%1/limit_global" ).arg( key ), 15, QgsSettings::App ).toInt() );
globalLimitSpinBox->setMinimum( 1 );
globalLimitSpinBox->setMaximum( 200 );
formLayout->addRow( tr( "&Maximum number of results:" ), globalLimitSpinBox );
QSpinBox *parLayerLimitSpinBox = new QSpinBox( dlg.get() );
parLayerLimitSpinBox->setValue( settings.value( QStringLiteral( "%1/limit_per_layer" ).arg( key ), 8, QgsSettings::App ).toInt() );
parLayerLimitSpinBox->setMinimum( 1 );
parLayerLimitSpinBox->setMaximum( 200 );
formLayout->addRow( tr( "&Maximum number of results per layer:" ), parLayerLimitSpinBox );
QDialogButtonBox *buttonbBox = new QDialogButtonBox( QDialogButtonBox::Ok | QDialogButtonBox::Cancel, dlg.get() );
formLayout->addRow( buttonbBox );
dlg->setLayout( formLayout );
connect( buttonbBox, &QDialogButtonBox::accepted, [&]()
{
settings.setValue( QStringLiteral( "%1/limit_global" ).arg( key ), globalLimitSpinBox->value(), QgsSettings::App );
settings.setValue( QStringLiteral( "%1/limit_per_layer" ).arg( key ), parLayerLimitSpinBox->value(), QgsSettings::App );
dlg->accept();
} );
connect( buttonbBox, &QDialogButtonBox::rejected, dlg.get(), &QDialog::reject );
dlg->exec();
}


//
// QgsExpressionCalculatorLocatorFilter
//
Expand Down Expand Up @@ -942,3 +1008,4 @@ void QgsGotoLocatorFilter::triggerResult( const QgsLocatorResult &result )

mapCanvas->flashGeometries( QList< QgsGeometry >() << QgsGeometry::fromPointXY( point ) );
}

11 changes: 7 additions & 4 deletions src/app/locator/qgsinbuiltlocatorfilters.h
Expand Up @@ -105,6 +105,8 @@ class APP_EXPORT QgsActiveLayerFeaturesLocatorFilter : public QgsLocatorFilter
void prepare( const QString &string, const QgsLocatorContext &context ) override;
void fetchResults( const QString &string, const QgsLocatorContext &context, QgsFeedback *feedback ) override;
void triggerResult( const QgsLocatorResult &result ) override;
bool hasConfigWidget() const override {return true;}
void openConfigWidget( QWidget *parent ) override;

private:

Expand All @@ -114,6 +116,7 @@ class APP_EXPORT QgsActiveLayerFeaturesLocatorFilter : public QgsLocatorFilter
QString mLayerId;
QIcon mLayerIcon;
QStringList mAttributeAliases;
int mMaxTotalResults = 30;
};

class APP_EXPORT QgsAllLayersFeaturesLocatorFilter : public QgsLocatorFilter
Expand Down Expand Up @@ -151,13 +154,13 @@ class APP_EXPORT QgsAllLayersFeaturesLocatorFilter : public QgsLocatorFilter
void fetchResults( const QString &string, const QgsLocatorContext &context, QgsFeedback *feedback ) override;
void triggerResult( const QgsLocatorResult &result ) override;
void triggerResultFromAction( const QgsLocatorResult &result, const int actionId ) override;
bool hasConfigWidget() const override {return true;}
void openConfigWidget( QWidget *parent ) override;

private:
int mMaxResultsPerLayer = 6;
int mMaxTotalResults = 12;
int mMaxResultsPerLayer = 8;
int mMaxTotalResults = 15;
QList<std::shared_ptr<PreparedLayer>> mPreparedLayers;


};

class APP_EXPORT QgsExpressionCalculatorLocatorFilter : public QgsLocatorFilter
Expand Down

0 comments on commit 313b824

Please sign in to comment.