From f7461942ab4028b681ba0c2e704271b48e6a05c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uro=C5=A1=20Prelo=C5=BEnik?= Date: Thu, 13 Mar 2025 07:30:34 +0100 Subject: [PATCH] Add country codes config to Nominatim Geocoder Locator filter --- src/app/locator/qgsnominatimlocatorfilter.cpp | 44 +++++++++++++++++++ src/app/locator/qgsnominatimlocatorfilter.h | 5 +++ src/core/locator/qgslocatorfilter.h | 4 ++ 3 files changed, 53 insertions(+) diff --git a/src/app/locator/qgsnominatimlocatorfilter.cpp b/src/app/locator/qgsnominatimlocatorfilter.cpp index d3dad7f4a66..8b3a80f4f5d 100644 --- a/src/app/locator/qgsnominatimlocatorfilter.cpp +++ b/src/app/locator/qgsnominatimlocatorfilter.cpp @@ -17,14 +17,19 @@ #include "qgsnominatimlocatorfilter.h" #include "moc_qgsnominatimlocatorfilter.cpp" +#include "qgsgeocoder.h" +#include "qgslocatorfilter.h" +#include "qgsnominatimgeocoder.h" #include "qgssettings.h" #include "qgsmessagebaritem.h" #include "qgsmessagebar.h" #include "qgisapp.h" +#include "qgssettingsentryimpl.h" #include #include +const QgsSettingsEntryString *QgsNominatimLocatorFilter::settingCountryCodes = new QgsSettingsEntryString( QStringLiteral( "country-codes" ), sTreeAppLocatorFilters, QString(), QStringLiteral( "Country codes" ) ); QgsNominatimLocatorFilter::QgsNominatimLocatorFilter( QgsGeocoderInterface *geocoder, QgsMapCanvas *canvas ) : QgsGeocoderLocatorFilter( QStringLiteral( "nominatimgeocoder" ), tr( "Nominatim Geocoder" ), QStringLiteral( ">" ), geocoder, canvas ) @@ -40,6 +45,16 @@ QgsNominatimLocatorFilter *QgsNominatimLocatorFilter::clone() const return filter.release(); } +void QgsNominatimLocatorFilter::fetchResults( const QString &string, const QgsLocatorContext &context, QgsFeedback *feedback ) +{ + QString countryCodes = settingCountryCodes->value( this->name() ); + + QgsNominatimGeocoder *nominatimGeocoder = dynamic_cast( geocoder() ); + nominatimGeocoder->setCountryCodes( countryCodes ); + + QgsAbstractGeocoderLocatorFilter::fetchResults( string, context, feedback ); +} + void QgsNominatimLocatorFilter::triggerResult( const QgsLocatorResult &result ) { QgsSettings settings; @@ -57,3 +72,32 @@ void QgsNominatimLocatorFilter::triggerResult( const QgsLocatorResult &result ) } QgsGeocoderLocatorFilter::triggerResult( result ); } + +void QgsNominatimLocatorFilter::openConfigWidget( QWidget *parent ) +{ + auto dlg = std::make_unique( parent ); + dlg->setWindowTitle( "Nominatim Geocoder Country Codes" ); + + QGridLayout *layout = new QGridLayout; + layout->setSizeConstraint( QLayout::SetFixedSize ); + QLabel *label = new QLabel( tr( "Two letter Country Codes (comma-separated)" ) ); + QLineEdit *countryCodesEdit = new QLineEdit( dlg.get() ); + + // Load existing settings + countryCodesEdit->setText( settingCountryCodes->value( this->name() ) ); + + layout->addWidget( label ); + layout->addWidget( countryCodesEdit ); + QDialogButtonBox *buttonbBox = new QDialogButtonBox( QDialogButtonBox::Ok | QDialogButtonBox::Cancel, dlg.get() ); + layout->addWidget( buttonbBox ); + dlg->setLayout( layout ); + + // Save settings when dialog accepted + connect( buttonbBox, &QDialogButtonBox::accepted, dlg.get(), [&]() { + settingCountryCodes->setValue( countryCodesEdit->text().trimmed(), this->name() ); + dlg->accept(); + } ); + + connect( buttonbBox, &QDialogButtonBox::rejected, dlg.get(), &QDialog::reject ); + dlg->exec(); +} diff --git a/src/app/locator/qgsnominatimlocatorfilter.h b/src/app/locator/qgsnominatimlocatorfilter.h index 1ce39ba24fb..6812c557cb2 100644 --- a/src/app/locator/qgsnominatimlocatorfilter.h +++ b/src/app/locator/qgsnominatimlocatorfilter.h @@ -27,10 +27,15 @@ class APP_EXPORT QgsNominatimLocatorFilter : public QgsGeocoderLocatorFilter Q_OBJECT public: + static const QgsSettingsEntryString *settingCountryCodes; + QgsNominatimLocatorFilter( QgsGeocoderInterface *geocoder, QgsMapCanvas *canvas ); QgsNominatimLocatorFilter *clone() const override SIP_FACTORY; + 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; }; #endif // QGSNOMINATIMLOCATORFILTERS_H diff --git a/src/core/locator/qgslocatorfilter.h b/src/core/locator/qgslocatorfilter.h index 1657d39d2e6..7df83a52042 100644 --- a/src/core/locator/qgslocatorfilter.h +++ b/src/core/locator/qgslocatorfilter.h @@ -25,6 +25,7 @@ #include "qgis_core.h" #include "qgslocatorcontext.h" #include "qgslogger.h" +#include "qgssettingstree.h" class QgsFeedback; class QgsLocatorFilter; @@ -178,6 +179,9 @@ class CORE_EXPORT QgsLocatorFilter : public QObject public: +#ifndef SIP_RUN + static inline QgsSettingsTreeNamedListNode *sTreeAppLocatorFilters = QgsSettingsTree::sTreeApp->createNamedListNode( QStringLiteral( "locator-filters" ) ); +#endif //! Filter priority. Controls the order of results in the locator. enum Priority {