30#include <QRegularExpression>
31#include <QRegularExpressionValidator>
35 : QDialog( parent, fl )
37 , mServiceName( serviceName )
38 , mOriginalConnName( connectionName )
43 if ( mServiceName.startsWith( QLatin1String(
"qgis/" ) ) )
50 mServiceName = mServiceName.split(
'-' ).last().toUpper();
58 connect( buttonBox, &QDialogButtonBox::helpRequested,
this, &QgsNewHttpConnection::showHelp );
60 QString connectionType = mServiceName;
61 if ( mServiceName == QLatin1String(
"WMS" ) )
63 connectionType = QStringLiteral(
"WMS/WMTS" );
65 setWindowTitle( tr(
"Create a New %1 Connection" ).arg( connectionType ) );
67 txtName->setValidator(
new QRegularExpressionValidator( QRegularExpression(
"[^\\/]+" ), txtName ) );
76 cmbTilePixelRatio->clear();
82 cmbVersion->addItem( tr(
"Maximum" ) );
83 cmbVersion->addItem( tr(
"1.0" ) );
84 cmbVersion->addItem( tr(
"1.1" ) );
85 cmbVersion->addItem( tr(
"2.0" ) );
86 cmbVersion->addItem( tr(
"OGC API - Features" ) );
88 static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
89 this, &QgsNewHttpConnection::wfsVersionCurrentIndexChanged );
91 connect( cbxWfsFeaturePaging, &QCheckBox::stateChanged,
92 this, &QgsNewHttpConnection::wfsFeaturePagingStateChanged );
94 if ( !connectionName.isEmpty() )
99 txtName->setText( connectionName );
110 mWfsVersionDetectButton->setDisabled( txtUrl->text().isEmpty() );
114 mWmsOptionsGroupBox->setVisible(
false );
115 mGroupBox->layout()->removeWidget( mWmsOptionsGroupBox );
119 mWfsOptionsGroupBox->setVisible(
false );
120 mGroupBox->layout()->removeWidget( mWfsOptionsGroupBox );
124 txtUrl->setToolTip( tr(
"HTTP address of the WFS service, or landing page of a OGC API service<br>(an ending slash might be needed for some OGC API servers)" ) );
129 cbxIgnoreGetMapURI->setText( tr(
"Ignore GetCoverage URI reported in capabilities" ) );
130 cbxWmsIgnoreAxisOrientation->setText( tr(
"Ignore axis orientation" ) );
133 mWmsOptionsGroupBox->setTitle( tr(
"WCS Options" ) );
135 cbxIgnoreGetFeatureInfoURI->setVisible(
false );
136 mGroupBox->layout()->removeWidget( cbxIgnoreGetFeatureInfoURI );
138 cmbDpiMode->setVisible(
false );
139 mGroupBox->layout()->removeWidget( cmbDpiMode );
140 lblDpiMode->setVisible(
false );
141 mGroupBox->layout()->removeWidget( lblDpiMode );
142 cmbTilePixelRatio->setVisible(
false );
143 mGroupBox->layout()->removeWidget( cmbTilePixelRatio );
144 lblTilePixelRatio->setVisible(
false );
145 mGroupBox->layout()->removeWidget( lblTilePixelRatio );
151 mTestConnectionButton->hide();
152 mGroupBox->layout()->removeWidget( mTestConnectionButton );
157 mAuthGroupBox->hide();
158 mGroupBox->layout()->removeWidget( mAuthGroupBox );
161 const int w = width();
163 resize( w, height() );
165 connect( txtName, &QLineEdit::textChanged,
this, &QgsNewHttpConnection::nameChanged );
166 connect( txtUrl, &QLineEdit::textChanged,
this, &QgsNewHttpConnection::urlChanged );
168 buttonBox->button( QDialogButtonBox::Ok )->setDisabled(
true );
169 connect( txtName, &QLineEdit::textChanged,
this, &QgsNewHttpConnection::updateOkButtonState );
170 connect( txtUrl, &QLineEdit::textChanged,
this, &QgsNewHttpConnection::updateOkButtonState );
172 nameChanged( connectionName );
175void QgsNewHttpConnection::wfsVersionCurrentIndexChanged(
int index )
186void QgsNewHttpConnection::wfsFeaturePagingStateChanged(
int state )
188 lblPageSize->setEnabled( state == Qt::Checked );
189 txtPageSize->setEnabled( state == Qt::Checked );
194 return txtName->text();
199 return txtUrl->text();
202void QgsNewHttpConnection::nameChanged(
const QString &text )
205 buttonBox->button( QDialogButtonBox::Ok )->setDisabled( txtName->text().isEmpty() || txtUrl->text().isEmpty() );
208void QgsNewHttpConnection::urlChanged(
const QString &text )
211 buttonBox->button( QDialogButtonBox::Ok )->setDisabled( txtName->text().isEmpty() || txtUrl->text().isEmpty() );
212 mWfsVersionDetectButton->setDisabled( txtUrl->text().isEmpty() );
215void QgsNewHttpConnection::updateOkButtonState()
217 const bool enabled = !txtName->text().isEmpty() && !txtUrl->text().isEmpty();
218 buttonBox->button( QDialogButtonBox::Ok )->setEnabled( enabled );
223 const QString newConnectionName = txtName->text();
228 if ( ( mOriginalConnName.isNull() || mOriginalConnName.compare( newConnectionName, Qt::CaseInsensitive ) != 0 ) &&
230 QMessageBox::question(
this,
231 tr(
"Save Connection" ),
232 tr(
"Should the existing connection %1 be overwritten?" ).arg( txtName->text() ),
233 QMessageBox::Ok | QMessageBox::Cancel ) == QMessageBox::Cancel )
238 if ( ! mAuthSettings->password().isEmpty() &&
239 QMessageBox::question(
this,
240 tr(
"Saving Passwords" ),
241 tr(
"WARNING: You have entered a password. It will be stored in unsecured plain text in your project files and your home directory (Unix-like OS) or user profile (Windows). If you want to avoid this, press Cancel and either:\n\na) Don't provide a password in the connection settings — it will be requested interactively when needed;\nb) Use the Configuration tab to add your credentials in an HTTP Basic Authentication method and store them in an encrypted database." ),
242 QMessageBox::Ok | QMessageBox::Cancel ) == QMessageBox::Cancel )
252 return mTestConnectionButton;
257 return mAuthSettings;
262 return mWfsVersionDetectButton;
272 return cbxWfsFeaturePaging;
277 return cbxWfsUseGml2EncodingForTransactions;
287 return base + connectionName;
292 return base + connectionName;
297 QStringList detailsParameters = { mServiceName.toLower(), mOriginalConnName };
311 cmbDpiMode->setCurrentIndex( cmbDpiMode->findData(
static_cast<int>( dpiMode ) ) );
313 cmbTilePixelRatio->setCurrentIndex( cmbTilePixelRatio->findData(
static_cast<int>( tilePixelRatio ) ) );
317 if ( version == QLatin1String(
"1.0.0" ) )
319 else if ( version == QLatin1String(
"1.1.0" ) )
321 else if ( version == QLatin1String(
"2.0.0" ) )
323 else if ( version == QLatin1String(
"OGC_API_FEATURES" ) )
325 cmbVersion->setCurrentIndex( versionIdx );
328 wfsVersionCurrentIndexChanged( versionIdx );
337 cbxWfsFeaturePaging->setChecked( pagingEnabled );
342 QUrl
url( txtUrl->text().trimmed() );
343 QUrlQuery query(
url );
344 const QList<QPair<QString, QString> > items = query.queryItems( QUrl::FullyEncoded );
345 QHash< QString, QPair<QString, QString> > params;
346 for (
const QPair<QString, QString> &it : items )
348 params.insert( it.first.toUpper(), it );
351 if ( params[QStringLiteral(
"SERVICE" )].second.toUpper() ==
"WMS" ||
352 params[QStringLiteral(
"SERVICE" )].second.toUpper() ==
"WFS" ||
353 params[QStringLiteral(
"SERVICE" )].second.toUpper() ==
"WCS" )
355 query.removeQueryItem( params.value( QStringLiteral(
"SERVICE" ) ).first );
356 query.removeQueryItem( params.value( QStringLiteral(
"REQUEST" ) ).first );
357 query.removeQueryItem( params.value( QStringLiteral(
"FORMAT" ) ).first );
360 url.setQuery( query );
362 if (
url.path( QUrl::FullyEncoded ).isEmpty() )
371 const QString newConnectionName = txtName->text();
379 if ( !mOriginalConnName.isNull() && mOriginalConnName != newConnectionName )
385 QStringList detailsParameters = {mServiceName.toLower(), newConnectionName};
418 QString version = QStringLiteral(
"auto" );
419 switch ( cmbVersion->currentIndex() )
422 version = QStringLiteral(
"auto" );
425 version = QStringLiteral(
"1.0.0" );
428 version = QStringLiteral(
"1.1.0" );
431 version = QStringLiteral(
"2.0.0" );
434 version = QStringLiteral(
"OGC_API_FEATURES" );
443 QStringList credentialsParameters = {mServiceName, newConnectionName};
448 if ( mHttpHeaders->isVisible() )
456void QgsNewHttpConnection::showHelp()
TilePixelRatio
DpiMode enum.
@ Undefined
Undefined (not scale)
@ StandardDpi
Standard (96 DPI)
static void enableAutoGeometryRestore(QWidget *widget, const QString &key=QString())
Register the widget to allow its position to be automatically saved and restored when open and closed...
static void openHelp(const QString &key)
Opens help topic for the given help key using default system web browser.
QPushButton * testConnectButton()
Returns the "test connection" button.
QgsAuthSettingsWidget * authSettingsWidget()
Returns the current authentication settings widget.
QCheckBox * wfsPagingEnabledCheckBox()
Returns the "WFS paging enabled" checkbox.
virtual bool validate()
Returns true if dialog settings are valid, or false if current settings are not valid and the dialog ...
QString name() const
Returns the current connection name.
@ FlagShowHttpSettings
Display the 'http' group.
@ FlagHideAuthenticationGroup
Hide the Authentication group.
@ FlagShowTestConnection
Display the 'test connection' button.
QCheckBox * wfsUseGml2EncodingForTransactions()
Returns the "Use GML2 encoding for transactions" checkbox.
QComboBox * wfsVersionComboBox()
Returns the "WFS version" combobox.
virtual QString wmsSettingsKey(const QString &base, const QString &connectionName) const
Returns the QSettings key for WMS related settings for the connection.
virtual QString wfsSettingsKey(const QString &base, const QString &connectionName) const
Returns the QSettings key for WFS related settings for the connection.
QString url() const
Returns the current connection url.
QPushButton * wfsVersionDetectButton()
Returns the "WFS version detect" button.
@ WFS_VERSION_API_FEATURES_1_0
QUrl urlTrimmed() const
Returns the url.
QgsNewHttpConnection(QWidget *parent=nullptr, QgsNewHttpConnection::ConnectionTypes types=ConnectionWms, const QString &serviceName SIP_PYARGRENAME(settingsKey)="WMS", const QString &connectionName=QString(), QgsNewHttpConnection::Flags flags=QgsNewHttpConnection::Flags(), Qt::WindowFlags fl=QgsGuiUtils::ModalDialogFlags)
Constructor for QgsNewHttpConnection.
QLineEdit * wfsPageSizeLineEdit()
Returns the "WFS page size" edit.
void updateServiceSpecificSettings()
Triggers a resync of the GUI widgets for the service specific settings (i.e.
@ ConnectionWms
WMS connection.
@ ConnectionWfs
WFS connection.
@ ConnectionWcs
WCS connection.
static const QgsSettingsEntryBool * settingsPreferCoordinatesForWfsT11
static const QgsSettingsEntryBool * settingsPagingEnabled
static const QgsSettingsEntryString * settingsMaxNumFeatures
static QgsSettingsTreeNamedListNode * sTreeOwsConnections
static const QgsSettingsEntryBool * settingsIgnoreGetFeatureInfoURI
static const QgsSettingsEntryString * settingsPassword
static const QgsSettingsEntryBool * settingsReportedLayerExtents
static const QgsSettingsEntryEnumFlag< Qgis::DpiMode > * settingsDpiMode
static const QgsSettingsEntryBool * settingsIgnoreAxisOrientation
static const QgsSettingsEntryBool * settingsInvertAxisOrientation
static const QgsSettingsEntryString * settingsVersion
static const QgsSettingsEntryString * settingsPagesize
static const QgsSettingsEntryString * settingsAuthCfg
static const QgsSettingsEntryEnumFlag< Qgis::TilePixelRatio > * settingsTilePixelRatio
static const QgsSettingsEntryVariantMap * settingsHeaders
static const QgsSettingsEntryString * settingsUsername
static const QgsSettingsEntryBool * settingsSmoothPixmapTransform
static const QgsSettingsEntryString * settingsUrl
static const QgsSettingsEntryBool * settingsIgnoreGetMapURI
bool exists(const QString &dynamicKeyPart=QString()) const
Returns true if the settings is contained in the underlying QSettings.
bool setValue(const T &value, const QString &dynamicKeyPart=QString()) const
Set settings value.
T value(const QString &dynamicKeyPart=QString()) const
Returns settings value.
T valueWithDefaultOverride(T defaultValueOverride, const QString &dynamicKeyPart=QString()) const
Returns the settings value with a defaultValueOverride and with an optional dynamicKeyPart.
bool setValue(T value, const QString &dynamicKeyPart=QString()) const
Set settings value.
T value(const QString &dynamicKeyPart=QString()) const
Returns settings value.
void deleteItem(const QString &item, const QStringList &parentsNamedItems=QStringList()) SIP_THROW(QgsSettingsException)
Deletes a named item from the named list node.
void setSelectedItem(const QString &item, const QStringList &parentsNamedItems=QStringList()) SIP_THROW(QgsSettingsException)
Sets the selected named item from the named list node.
This class is a composition of two QSettings instances:
void sync()
Writes any unsaved changes to permanent storage, and reloads any settings that have been changed in t...
QString fromEncodedComponent_helper(const QByteArray &ba)