Add country codes config to Nominatim Geocoder Locator filter

This commit is contained in:
Uroš Preložnik 2025-03-13 07:30:34 +01:00 committed by Nyall Dawson
parent d1e91d5482
commit f7461942ab
3 changed files with 53 additions and 0 deletions

View File

@ -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 <QDesktopServices>
#include <QPushButton>
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<QgsNominatimGeocoder *>( 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<QDialog>( 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();
}

View File

@ -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

View File

@ -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
{