From e5da8eb58062ab41198e682ce02c1b380d5e8771 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uro=C5=A1=20Prelo=C5=BEnik?= Date: Fri, 21 Feb 2025 14:27:01 +0100 Subject: [PATCH 1/7] Add country codes config to Nominatim Geocoder Locator filter --- src/app/locator/qgsnominatimlocatorfilter.cpp | 29 +++++++++++++++++++ src/app/locator/qgsnominatimlocatorfilter.h | 2 ++ .../qgsabstractgeocoderlocatorfilter.cpp | 19 ++++++++++++ 3 files changed, 50 insertions(+) diff --git a/src/app/locator/qgsnominatimlocatorfilter.cpp b/src/app/locator/qgsnominatimlocatorfilter.cpp index 90d2243fa539..0bddb28d620b 100644 --- a/src/app/locator/qgsnominatimlocatorfilter.cpp +++ b/src/app/locator/qgsnominatimlocatorfilter.cpp @@ -17,6 +17,8 @@ #include "qgsnominatimlocatorfilter.h" #include "moc_qgsnominatimlocatorfilter.cpp" +#include "qgsgeocoder.h" +#include "qgslocatorfilter.h" #include "qgssettings.h" #include "qgsmessagebaritem.h" #include "qgsmessagebar.h" @@ -50,3 +52,30 @@ 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" ); + + QFormLayout *formLayout = new QFormLayout; + QLineEdit *countryCodesEdit = new QLineEdit( dlg.get() ); + + // Load existing settings + QgsSettings settings; + countryCodesEdit->setText( settings.value( "locator_filters/nominatim_geocoder/country_codes", "", QgsSettings::App ).toString() ); + + formLayout->addRow( tr( "Two letter Country Codes (comma-separated):" ), countryCodesEdit ); + QDialogButtonBox *buttonbBox = new QDialogButtonBox( QDialogButtonBox::Ok | QDialogButtonBox::Cancel, dlg.get() ); + formLayout->addRow( buttonbBox ); + dlg->setLayout( formLayout ); + + // Save settings when dialog accepted + connect( buttonbBox, &QDialogButtonBox::accepted, dlg.get(), [&]() { + settings.setValue( "locator_filters/nominatim_geocoder/country_codes", countryCodesEdit->text().trimmed(), QgsSettings::App ); + 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 5e226a120592..04451272241c 100644 --- a/src/app/locator/qgsnominatimlocatorfilter.h +++ b/src/app/locator/qgsnominatimlocatorfilter.h @@ -30,6 +30,8 @@ class APP_EXPORT QgsNominatimLocatorFilter : public QgsGeocoderLocatorFilter QgsNominatimLocatorFilter( QgsGeocoderInterface *geocoder, QgsMapCanvas *canvas ); 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/geocoding/qgsabstractgeocoderlocatorfilter.cpp b/src/core/geocoding/qgsabstractgeocoderlocatorfilter.cpp index 8237882f2d01..e9fb6f441d51 100644 --- a/src/core/geocoding/qgsabstractgeocoderlocatorfilter.cpp +++ b/src/core/geocoding/qgsabstractgeocoderlocatorfilter.cpp @@ -17,6 +17,8 @@ #include "moc_qgsabstractgeocoderlocatorfilter.cpp" #include "qgsgeocoder.h" #include "qgsgeocodercontext.h" +#include "qgsnominatimgeocoder.h" +#include "qgssettings.h" QgsAbstractGeocoderLocatorFilter::QgsAbstractGeocoderLocatorFilter( const QString &name, const QString &displayName, const QString &prefix, QgsGeocoderInterface *geocoder, const QgsRectangle &boundingBox ) : mName( name ) @@ -45,10 +47,27 @@ QString QgsAbstractGeocoderLocatorFilter::prefix() const void QgsAbstractGeocoderLocatorFilter::fetchResults( const QString &string, const QgsLocatorContext &context, QgsFeedback *feedback ) { + if ( !mGeocoder ) + { + return; + } + QgsGeocoderContext geocodeContext( context.transformContext ); geocodeContext.setAreaOfInterest( QgsGeometry::fromRect( context.targetExtent ) ); geocodeContext.setAreaOfInterestCrs( context.targetExtentCrs ); + // Check if we have QgsNominatimLocatorFilter instance + QgsNominatimGeocoder *nominatimGeocoder = dynamic_cast( mGeocoder ); + if ( nominatimGeocoder ) + { + // Read countryCodes from settings + QgsSettings settings; + QString countryCodes = settings.value( "locator_filters/nominatim_geocoder/country_codes", "", QgsSettings::App ).toString().trimmed(); + + nominatimGeocoder->setCountryCodes( countryCodes ); + qDebug() << "Updated country codes for Nominatim:" << countryCodes; + } + const QList< QgsGeocoderResult > results = mGeocoder->geocodeString( string, geocodeContext, feedback ); for ( const QgsGeocoderResult &result : results ) { From af0235822dc031ad40ba93277d6c70b5740a8554 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uro=C5=A1=20Prelo=C5=BEnik?= Date: Fri, 21 Feb 2025 14:32:13 +0100 Subject: [PATCH 2/7] Remove debug line --- src/core/geocoding/qgsabstractgeocoderlocatorfilter.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/core/geocoding/qgsabstractgeocoderlocatorfilter.cpp b/src/core/geocoding/qgsabstractgeocoderlocatorfilter.cpp index e9fb6f441d51..9c1caf7a4114 100644 --- a/src/core/geocoding/qgsabstractgeocoderlocatorfilter.cpp +++ b/src/core/geocoding/qgsabstractgeocoderlocatorfilter.cpp @@ -65,7 +65,6 @@ void QgsAbstractGeocoderLocatorFilter::fetchResults( const QString &string, cons QString countryCodes = settings.value( "locator_filters/nominatim_geocoder/country_codes", "", QgsSettings::App ).toString().trimmed(); nominatimGeocoder->setCountryCodes( countryCodes ); - qDebug() << "Updated country codes for Nominatim:" << countryCodes; } const QList< QgsGeocoderResult > results = mGeocoder->geocodeString( string, geocodeContext, feedback ); From ac17f47da1cb661576815ead6babe97a21143655 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uro=C5=A1=20Prelo=C5=BEnik?= Date: Tue, 25 Feb 2025 10:00:55 +0100 Subject: [PATCH 3/7] Update src/app/locator/qgsnominatimlocatorfilter.cpp Co-authored-by: Nyall Dawson --- src/app/locator/qgsnominatimlocatorfilter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/locator/qgsnominatimlocatorfilter.cpp b/src/app/locator/qgsnominatimlocatorfilter.cpp index 0bddb28d620b..6cdb7b7b1fa6 100644 --- a/src/app/locator/qgsnominatimlocatorfilter.cpp +++ b/src/app/locator/qgsnominatimlocatorfilter.cpp @@ -58,7 +58,7 @@ void QgsNominatimLocatorFilter::openConfigWidget( QWidget *parent ) auto dlg = std::make_unique( parent ); dlg->setWindowTitle( "Nominatim Geocoder Country Codes" ); - QFormLayout *formLayout = new QFormLayout; + QGridLayout *formLayout = new QGridLayout; QLineEdit *countryCodesEdit = new QLineEdit( dlg.get() ); // Load existing settings From 61082a8ef9d38ad89defb05902e6b44a8167b567 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uro=C5=A1=20Prelo=C5=BEnik?= Date: Tue, 25 Feb 2025 10:01:24 +0100 Subject: [PATCH 4/7] Update src/app/locator/qgsnominatimlocatorfilter.cpp Co-authored-by: Nyall Dawson --- src/app/locator/qgsnominatimlocatorfilter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/locator/qgsnominatimlocatorfilter.cpp b/src/app/locator/qgsnominatimlocatorfilter.cpp index 6cdb7b7b1fa6..2661279b8600 100644 --- a/src/app/locator/qgsnominatimlocatorfilter.cpp +++ b/src/app/locator/qgsnominatimlocatorfilter.cpp @@ -65,7 +65,7 @@ void QgsNominatimLocatorFilter::openConfigWidget( QWidget *parent ) QgsSettings settings; countryCodesEdit->setText( settings.value( "locator_filters/nominatim_geocoder/country_codes", "", QgsSettings::App ).toString() ); - formLayout->addRow( tr( "Two letter Country Codes (comma-separated):" ), countryCodesEdit ); + formLayout->addRow( tr( "Two letter Country Codes (comma-separated)" ), countryCodesEdit ); QDialogButtonBox *buttonbBox = new QDialogButtonBox( QDialogButtonBox::Ok | QDialogButtonBox::Cancel, dlg.get() ); formLayout->addRow( buttonbBox ); dlg->setLayout( formLayout ); From 518bd8d6718332ca611a05712df4f817a737743c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uro=C5=A1=20Prelo=C5=BEnik?= Date: Tue, 25 Feb 2025 10:18:52 +0100 Subject: [PATCH 5/7] revert qgsabstractgeocoderlocatorfilter.cpp from master --- .../qgsabstractgeocoderlocatorfilter.cpp | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/src/core/geocoding/qgsabstractgeocoderlocatorfilter.cpp b/src/core/geocoding/qgsabstractgeocoderlocatorfilter.cpp index 9c1caf7a4114..8237882f2d01 100644 --- a/src/core/geocoding/qgsabstractgeocoderlocatorfilter.cpp +++ b/src/core/geocoding/qgsabstractgeocoderlocatorfilter.cpp @@ -17,8 +17,6 @@ #include "moc_qgsabstractgeocoderlocatorfilter.cpp" #include "qgsgeocoder.h" #include "qgsgeocodercontext.h" -#include "qgsnominatimgeocoder.h" -#include "qgssettings.h" QgsAbstractGeocoderLocatorFilter::QgsAbstractGeocoderLocatorFilter( const QString &name, const QString &displayName, const QString &prefix, QgsGeocoderInterface *geocoder, const QgsRectangle &boundingBox ) : mName( name ) @@ -47,26 +45,10 @@ QString QgsAbstractGeocoderLocatorFilter::prefix() const void QgsAbstractGeocoderLocatorFilter::fetchResults( const QString &string, const QgsLocatorContext &context, QgsFeedback *feedback ) { - if ( !mGeocoder ) - { - return; - } - QgsGeocoderContext geocodeContext( context.transformContext ); geocodeContext.setAreaOfInterest( QgsGeometry::fromRect( context.targetExtent ) ); geocodeContext.setAreaOfInterestCrs( context.targetExtentCrs ); - // Check if we have QgsNominatimLocatorFilter instance - QgsNominatimGeocoder *nominatimGeocoder = dynamic_cast( mGeocoder ); - if ( nominatimGeocoder ) - { - // Read countryCodes from settings - QgsSettings settings; - QString countryCodes = settings.value( "locator_filters/nominatim_geocoder/country_codes", "", QgsSettings::App ).toString().trimmed(); - - nominatimGeocoder->setCountryCodes( countryCodes ); - } - const QList< QgsGeocoderResult > results = mGeocoder->geocodeString( string, geocodeContext, feedback ); for ( const QgsGeocoderResult &result : results ) { From c03a52451af69d13ff4fc038718d726e157a47cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uro=C5=A1=20Prelo=C5=BEnik?= Date: Tue, 25 Feb 2025 18:42:57 +0100 Subject: [PATCH 6/7] - Fix formLayout to gridLayout - override fetchResults but doesn't get called. Help needed! --- src/app/locator/qgsnominatimlocatorfilter.cpp | 23 +++++++++++++++---- src/app/locator/qgsnominatimlocatorfilter.h | 1 + 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/app/locator/qgsnominatimlocatorfilter.cpp b/src/app/locator/qgsnominatimlocatorfilter.cpp index 2661279b8600..15289b8761de 100644 --- a/src/app/locator/qgsnominatimlocatorfilter.cpp +++ b/src/app/locator/qgsnominatimlocatorfilter.cpp @@ -19,6 +19,7 @@ #include "moc_qgsnominatimlocatorfilter.cpp" #include "qgsgeocoder.h" #include "qgslocatorfilter.h" +#include "qgsnominatimgeocoder.h" #include "qgssettings.h" #include "qgsmessagebaritem.h" #include "qgsmessagebar.h" @@ -35,6 +36,17 @@ QgsNominatimLocatorFilter::QgsNominatimLocatorFilter( QgsGeocoderInterface *geoc setUseWithoutPrefix( false ); } +void QgsNominatimLocatorFilter::fetchResults(const QString &string, const QgsLocatorContext &context, QgsFeedback *feedback) +{ + QgsSettings settings; + QString countryCodes = settings.value( "locator_filters/nominatim_geocoder/country_codes", "", QgsSettings::App ).toString().trimmed(); + + QgsNominatimGeocoder *nominatimGeocoder = dynamic_cast( geocoder() ); + nominatimGeocoder->setCountryCodes( countryCodes ); + + QgsAbstractGeocoderLocatorFilter::fetchResults( string, context, feedback); +} + void QgsNominatimLocatorFilter::triggerResult( const QgsLocatorResult &result ) { QgsSettings settings; @@ -58,17 +70,20 @@ void QgsNominatimLocatorFilter::openConfigWidget( QWidget *parent ) auto dlg = std::make_unique( parent ); dlg->setWindowTitle( "Nominatim Geocoder Country Codes" ); - QGridLayout *formLayout = new QGridLayout; + 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 QgsSettings settings; countryCodesEdit->setText( settings.value( "locator_filters/nominatim_geocoder/country_codes", "", QgsSettings::App ).toString() ); - formLayout->addRow( tr( "Two letter Country Codes (comma-separated)" ), countryCodesEdit ); + layout->addWidget( label ); + layout->addWidget( countryCodesEdit ); QDialogButtonBox *buttonbBox = new QDialogButtonBox( QDialogButtonBox::Ok | QDialogButtonBox::Cancel, dlg.get() ); - formLayout->addRow( buttonbBox ); - dlg->setLayout( formLayout ); + layout->addWidget( buttonbBox ); + dlg->setLayout( layout ); // Save settings when dialog accepted connect( buttonbBox, &QDialogButtonBox::accepted, dlg.get(), [&]() { diff --git a/src/app/locator/qgsnominatimlocatorfilter.h b/src/app/locator/qgsnominatimlocatorfilter.h index 04451272241c..8d9fda63d3bc 100644 --- a/src/app/locator/qgsnominatimlocatorfilter.h +++ b/src/app/locator/qgsnominatimlocatorfilter.h @@ -29,6 +29,7 @@ class APP_EXPORT QgsNominatimLocatorFilter : public QgsGeocoderLocatorFilter public: QgsNominatimLocatorFilter( QgsGeocoderInterface *geocoder, QgsMapCanvas *canvas ); + 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; From 5ed878c36d7ee8daf03130bffcfb9bc6251004ce Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 25 Feb 2025 17:47:32 +0000 Subject: [PATCH 7/7] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/app/locator/qgsnominatimlocatorfilter.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/app/locator/qgsnominatimlocatorfilter.cpp b/src/app/locator/qgsnominatimlocatorfilter.cpp index 15289b8761de..fb62e0052625 100644 --- a/src/app/locator/qgsnominatimlocatorfilter.cpp +++ b/src/app/locator/qgsnominatimlocatorfilter.cpp @@ -36,7 +36,7 @@ QgsNominatimLocatorFilter::QgsNominatimLocatorFilter( QgsGeocoderInterface *geoc setUseWithoutPrefix( false ); } -void QgsNominatimLocatorFilter::fetchResults(const QString &string, const QgsLocatorContext &context, QgsFeedback *feedback) +void QgsNominatimLocatorFilter::fetchResults( const QString &string, const QgsLocatorContext &context, QgsFeedback *feedback ) { QgsSettings settings; QString countryCodes = settings.value( "locator_filters/nominatim_geocoder/country_codes", "", QgsSettings::App ).toString().trimmed(); @@ -44,7 +44,7 @@ void QgsNominatimLocatorFilter::fetchResults(const QString &string, const QgsLoc QgsNominatimGeocoder *nominatimGeocoder = dynamic_cast( geocoder() ); nominatimGeocoder->setCountryCodes( countryCodes ); - QgsAbstractGeocoderLocatorFilter::fetchResults( string, context, feedback); + QgsAbstractGeocoderLocatorFilter::fetchResults( string, context, feedback ); } void QgsNominatimLocatorFilter::triggerResult( const QgsLocatorResult &result ) @@ -71,7 +71,7 @@ void QgsNominatimLocatorFilter::openConfigWidget( QWidget *parent ) dlg->setWindowTitle( "Nominatim Geocoder Country Codes" ); QGridLayout *layout = new QGridLayout; - layout->setSizeConstraint(QLayout::SetFixedSize); + layout->setSizeConstraint( QLayout::SetFixedSize ); QLabel *label = new QLabel( tr( "Two letter Country Codes (comma-separated)" ) ); QLineEdit *countryCodesEdit = new QLineEdit( dlg.get() );