39#include <QButtonGroup>
40#include <QDomDocument>
43#include <QImageReader>
44#include <QInputDialog>
47#include <QNetworkReply>
48#include <QNetworkRequest>
50#include <QRadioButton>
51#include <QRegularExpression>
55#include "moc_qgsowssourceselect.cpp"
64 connect( mNewButton, &QPushButton::clicked,
this, &QgsOWSSourceSelect::mNewButton_clicked );
65 connect( mEditButton, &QPushButton::clicked,
this, &QgsOWSSourceSelect::mEditButton_clicked );
66 connect( mDeleteButton, &QPushButton::clicked,
this, &QgsOWSSourceSelect::mDeleteButton_clicked );
67 connect( mSaveButton, &QPushButton::clicked,
this, &QgsOWSSourceSelect::mSaveButton_clicked );
68 connect( mLoadButton, &QPushButton::clicked,
this, &QgsOWSSourceSelect::mLoadButton_clicked );
69 connect( mConnectButton, &QPushButton::clicked,
this, &QgsOWSSourceSelect::mConnectButton_clicked );
70 connect( mChangeCRSButton, &QPushButton::clicked,
this, &QgsOWSSourceSelect::mChangeCRSButton_clicked );
71 connect( mLayersTreeWidget, &QTreeWidget::itemSelectionChanged,
this, &QgsOWSSourceSelect::mLayersTreeWidget_itemSelectionChanged );
72 connect( mConnectionsComboBox,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::activated ),
this, &QgsOWSSourceSelect::mConnectionsComboBox_activated );
73 connect( mAddDefaultButton, &QPushButton::clicked,
this, &QgsOWSSourceSelect::mAddDefaultButton_clicked );
74 connect( mTilesetsTableWidget, &QTableWidget::itemClicked,
this, &QgsOWSSourceSelect::mTilesetsTableWidget_itemClicked );
75 connect( mLayerUpButton, &QPushButton::clicked,
this, &QgsOWSSourceSelect::mLayerUpButton_clicked );
76 connect( mLayerDownButton, &QPushButton::clicked,
this, &QgsOWSSourceSelect::mLayerDownButton_clicked );
80 setWindowTitle( tr(
"Add Layer(s) from a %1 Server" ).arg( service ) );
84 mCacheComboBox->addItem( tr(
"Always Cache" ), QNetworkRequest::AlwaysCache );
85 mCacheComboBox->addItem( tr(
"Prefer Cache" ), QNetworkRequest::PreferCache );
86 mCacheComboBox->addItem( tr(
"Prefer Network" ), QNetworkRequest::PreferNetwork );
87 mCacheComboBox->addItem( tr(
"Always Network" ), QNetworkRequest::AlwaysNetwork );
90 mCacheComboBox->setCurrentIndex( mCacheComboBox->findData( QNetworkRequest::PreferNetwork ) );
99 mSelectedCRS = currentRefSys.
authid();
104 mTabWidget->removeTab( mTabWidget->indexOf( mLayerOrderTab ) );
105 mTabWidget->removeTab( mTabWidget->indexOf( mTilesetsTab ) );
107 mFormatWidget->hide();
109 mCacheWidget->hide();
126 mSpatialExtentBox->setOutputCrs( crs );
131 mSpatialExtentBox->setCurrentExtent( destinationCrs.
bounds(), destinationCrs );
132 mSpatialExtentBox->setOutputExtentFromCurrent();
133 mSpatialExtentBox->setMapCanvas( canvas );
143 mLayersTreeWidget->clearSelection();
148 mFormatComboBox->clear();
149 mFormatComboBox->setEnabled(
false );
160 if ( mProviderFormats.isEmpty() )
163 for (
int i = 0; i < mProviderFormats.size(); i++ )
166 mMimeLabelMap.insert( mProviderFormats[i].format, mProviderFormats[i].label );
180 QMap<QString, QString> formatsMap;
181 formatsMap.insert( QStringLiteral(
"geotiff" ), QStringLiteral(
"tiff" ) );
182 formatsMap.insert( QStringLiteral(
"gtiff" ), QStringLiteral(
"tiff" ) );
183 formatsMap.insert( QStringLiteral(
"tiff" ), QStringLiteral(
"tiff" ) );
184 formatsMap.insert( QStringLiteral(
"tif" ), QStringLiteral(
"tiff" ) );
185 formatsMap.insert( QStringLiteral(
"gif" ), QStringLiteral(
"gif" ) );
186 formatsMap.insert( QStringLiteral(
"jpeg" ), QStringLiteral(
"jpeg" ) );
187 formatsMap.insert( QStringLiteral(
"jpg" ), QStringLiteral(
"jpeg" ) );
188 formatsMap.insert( QStringLiteral(
"png" ), QStringLiteral(
"png" ) );
192 for (
int i = 0; i < layersFormats.size(); i++ )
194 const QString format = layersFormats.value( i );
196 const QString simpleFormat = format.toLower().remove( QStringLiteral(
"image/" ) ).remove( QRegularExpression(
"_.*" ) );
198 const QString mimeFormat =
"image/" + formatsMap.value( simpleFormat );
201 QString label = format;
203 if ( mMimeLabelMap.contains( mimeFormat ) )
205 if ( format != mMimeLabelMap.value( mimeFormat ) )
208 label +=
" / " + mMimeLabelMap.value( mimeFormat );
211 if ( simpleFormat.contains( QLatin1String(
"tif" ) ) )
213 if ( preferred < 0 || simpleFormat.startsWith(
'g' ) )
226 mFormatComboBox->insertItem( i, label );
230 preferred = preferred >= 0 ? preferred : 0;
231 mFormatComboBox->setCurrentIndex( preferred );
233 mFormatComboBox->setEnabled(
true );
238 mTimeComboBox->clear();
245 mTimeComboBox->clear();
246 mTimeComboBox->setEnabled(
false );
251 mConnectionsComboBox->clear();
259 if (
string.compare( QLatin1String(
"wms" ), Qt::CaseInsensitive ) == 0 )
261 else if (
string.compare( QLatin1String(
"wfs" ), Qt::CaseInsensitive ) == 0 )
263 else if (
string.compare( QLatin1String(
"wcs" ), Qt::CaseInsensitive ) == 0 )
269void QgsOWSSourceSelect::mNewButton_clicked()
283void QgsOWSSourceSelect::mEditButton_clicked()
297void QgsOWSSourceSelect::mDeleteButton_clicked()
299 const QString msg = tr(
"Are you sure you want to remove the %1 connection and all associated settings?" )
300 .arg( mConnectionsComboBox->currentText() );
301 const QMessageBox::StandardButton result = QMessageBox::question(
this, tr(
"Remove Connection" ), msg, QMessageBox::Yes | QMessageBox::No );
302 if ( result == QMessageBox::Yes )
305 mConnectionsComboBox->removeItem( mConnectionsComboBox->currentIndex() );
311void QgsOWSSourceSelect::mSaveButton_clicked()
317void QgsOWSSourceSelect::mLoadButton_clicked()
319 const QString fileName = QFileDialog::getOpenFileName(
this, tr(
"Load Connections" ), QDir::homePath(), tr(
"XML files (*.xml *.XML)" ) );
320 if ( fileName.isEmpty() )
333 const QStringList &names,
334 QMap<int, QgsTreeWidgetItem *> &items,
335 int &layerAndStyleCount,
336 const QMap<int, int> &layerParents,
337 const QMap<int, QStringList> &layerParentNames
340 QgsDebugMsgLevel( QStringLiteral(
"id = %1 layerAndStyleCount = %2 names = %3 " ).arg(
id ).arg( layerAndStyleCount ).arg( names.join(
"," ) ), 2 );
341 if ( items.contains(
id ) )
346 if ( layerParents.contains(
id ) )
349 const int parent = layerParents[id];
350 item =
new QgsTreeWidgetItem(
createItem( parent, layerParentNames[parent], items, layerAndStyleCount, layerParents, layerParentNames ) );
355 item->setText( 0, QString::number( ++layerAndStyleCount ) );
356 item->setText( 1, names[0].simplified() );
357 item->setText( 2, names[1].simplified() );
358 item->setText( 3, names[2].simplified() );
359 item->setToolTip( 3,
"<font color=black>" + names[2].simplified() +
"</font>" );
370void QgsOWSSourceSelect::mConnectButton_clicked()
372 mLayersTreeWidget->clear();
377 mConnName = mConnectionsComboBox->currentText();
382 QApplication::setOverrideCursor( Qt::WaitCursor );
387 QApplication::restoreOverrideCursor();
394void QgsOWSSourceSelect::mChangeCRSButton_clicked()
397 const auto constSelectedItems = mLayersTreeWidget->selectedItems();
398 for ( QTreeWidgetItem *item : constSelectedItems )
400 const QString layer = item->data( 0, Qt::UserRole + 0 ).toString();
401 if ( !layer.isEmpty() )
405 QgsProjectionSelectionDialog *mySelector =
new QgsProjectionSelectionDialog(
this );
411 mySelector->
setCrs( defaultCRS );
418 if ( !mySelector->exec() )
421 mSelectedCRS = mySelector->
crs().
authid();
422 mSpatialExtentBox->setOutputCrs( mySelector->
crs() );
427 for (
int i = 0; i < mLayersTreeWidget->topLevelItemCount(); i++ )
435void QgsOWSSourceSelect::mLayersTreeWidget_itemSelectionChanged()
443 mCRSLabel->setText( tr(
"Coordinate Reference System (%n available)",
"crs count", mSelectedLayersCRSs.count() ) +
':' );
445 mChangeCRSButton->setDisabled( mSelectedLayersCRSs.isEmpty() );
447 if ( !mSelectedLayersCRSs.isEmpty() )
452 QSet<QString>::const_iterator it = mSelectedLayersCRSs.constBegin();
453 for ( ; it != mSelectedLayersCRSs.constEnd(); ++it )
455 if ( it->compare( mSelectedCRS, Qt::CaseInsensitive ) == 0 )
459 if ( it == mSelectedLayersCRSs.constBegin() )
467 if ( it == mSelectedLayersCRSs.constEnd() )
469 if ( mSelectedLayersCRSs.constFind(
QgsProject::instance()->crs().authid() ) != mSelectedLayersCRSs.constEnd() )
476 mSelectedCRS = defaultCRS;
481 mChangeCRSButton->setEnabled(
true );
488 mCRSLabel->setText( tr(
"Coordinate Reference System" ) +
':' );
489 mSelectedCRS.clear();
490 mSelectedCRSLabel->clear();
491 mChangeCRSButton->setEnabled(
false );
494void QgsOWSSourceSelect::mTilesetsTableWidget_itemClicked( QTableWidgetItem *item )
498 QTableWidgetItem *rowItem = mTilesetsTableWidget->item( mTilesetsTableWidget->currentRow(), 0 );
501 mTilesetsTableWidget->blockSignals(
true );
502 mTilesetsTableWidget->clearSelection();
505 QgsDebugMsgLevel( QStringLiteral(
"selecting current row %1" ).arg( mTilesetsTableWidget->currentRow() ), 2 );
506 mTilesetsTableWidget->selectRow( mTilesetsTableWidget->currentRow() );
513 mTilesetsTableWidget->blockSignals(
false );
536 const int cache = mCacheComboBox->currentData().toInt();
537 return static_cast<QNetworkRequest::CacheLoadControl
>( cache );
547 return mTimeComboBox->currentText();
554 mConnectionsComboBox->setCurrentIndex( mConnectionsComboBox->findText( toSelect ) );
556 if ( mConnectionsComboBox->currentIndex() < 0 )
558 if ( toSelect.isNull() )
559 mConnectionsComboBox->setCurrentIndex( 0 );
561 mConnectionsComboBox->setCurrentIndex( mConnectionsComboBox->count() - 1 );
564 if ( mConnectionsComboBox->count() == 0 )
567 mConnectButton->setEnabled(
false );
568 mEditButton->setEnabled(
false );
569 mDeleteButton->setEnabled(
false );
570 mSaveButton->setEnabled(
false );
575 mConnectButton->setEnabled(
true );
576 mEditButton->setEnabled(
true );
577 mDeleteButton->setEnabled(
true );
578 mSaveButton->setEnabled(
true );
586 mStatusLabel->setText( message );
596 mv->setWindowTitle( title );
598 if ( format == QLatin1String(
"text/html" ) )
609void QgsOWSSourceSelect::mConnectionsComboBox_activated(
int )
615void QgsOWSSourceSelect::mAddDefaultButton_clicked()
632 QMap<QString, QString> exampleServers;
633 exampleServers[QStringLiteral(
"DM Solutions GMap" )] = QStringLiteral(
"http://www2.dmsolutions.ca/cgi-bin/mswms_gmap" );
634 exampleServers[QStringLiteral(
"Lizardtech server" )] = QStringLiteral(
"http://wms.lizardtech.com/lizardtech/iserv/ows" );
640 QMap<QString, QString>::const_iterator i = exampleServers.constBegin();
641 for ( ; i != exampleServers.constEnd(); ++i )
645 if ( !keys.contains( i.key() ) )
647 const QString path = i.key();
648 settings.
setValue( path +
"/url", i.value() );
654 QMessageBox::information(
this, tr(
"Add WMS Servers" ),
"<p>" + tr(
"Several WMS servers have "
655 "been added to the server list. Note that if "
656 "you access the Internet via a web proxy, you will "
657 "need to set the proxy settings in the QGIS options dialog." )
661void QgsOWSSourceSelect::mLayerUpButton_clicked()
663 QList<QTreeWidgetItem *> selectionList = mLayerOrderTreeWidget->selectedItems();
664 if ( selectionList.empty() )
668 const int selectedIndex = mLayerOrderTreeWidget->indexOfTopLevelItem( selectionList[0] );
669 if ( selectedIndex < 1 )
674 QTreeWidgetItem *selectedItem = mLayerOrderTreeWidget->takeTopLevelItem( selectedIndex );
675 mLayerOrderTreeWidget->insertTopLevelItem( selectedIndex - 1, selectedItem );
676 mLayerOrderTreeWidget->clearSelection();
677 selectedItem->setSelected(
true );
680void QgsOWSSourceSelect::mLayerDownButton_clicked()
682 QList<QTreeWidgetItem *> selectionList = mLayerOrderTreeWidget->selectedItems();
683 if ( selectionList.empty() )
687 const int selectedIndex = mLayerOrderTreeWidget->indexOfTopLevelItem( selectionList[0] );
688 if ( selectedIndex < 0 || selectedIndex > mLayerOrderTreeWidget->topLevelItemCount() - 2 )
693 QTreeWidgetItem *selectedItem = mLayerOrderTreeWidget->takeTopLevelItem( selectedIndex );
694 mLayerOrderTreeWidget->insertTopLevelItem( selectedIndex + 1, selectedItem );
695 mLayerOrderTreeWidget->clearSelection();
696 selectedItem->setSelected(
true );
701 return QList<SupportedFormat>();
706 return QStringList();
711 return QStringList();
716 return QStringList();
719void QgsOWSSourceSelect::updateButtons()
static QString geographicCrsAuthId()
Geographic coordinate system auth:id string for a default geographic CRS (EPSG:4326).
Represents a coordinate reference system (CRS).
static QgsCoordinateReferenceSystem fromOgcWmsCrs(const QString &ogcCrs)
Creates a CRS from a given OGC WMS-format Coordinate Reference System string.
bool isValid() const
Returns whether this CRS is correctly initialized and usable.
QgsRectangle bounds() const
Returns the approximate bounds for the region the CRS is usable within.
QString userFriendlyIdentifier(Qgis::CrsIdentifierType type=Qgis::CrsIdentifierType::MediumString) const
Returns a user friendly identifier for the CRS.
QString uri(bool expandAuthConfig=true) const
Returns the complete URI as a string.
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...
Map canvas is a class for displaying all GIS data types on a canvas.
const QgsMapSettings & mapSettings() const
Gets access to properties used for map rendering.
QgsCoordinateReferenceSystem destinationCrs() const
Returns the destination coordinate reference system for the map render.
A generic message view for displaying QGIS messages.
void setMessageAsPlainText(const QString &msg)
void showMessage(bool blocking=true) override
display the message to the user and deletes itself
void setMessageAsHtml(const QString &msg)
@ FlagShowHttpSettings
Display the 'http' group.
ConnectionType
Available connection types for configuring in the dialog.
@ ConnectionWms
WMS connection.
@ ConnectionWfs
WFS connection.
@ ConnectionWcs
WCS connection.
virtual QStringList selectedLayersCrses()
Server CRS supported for currently selected layer item(s).
virtual QStringList selectedLayersTimes()
List of times (temporalDomain timePosition/timePeriod for currently selected layer item(s).
QString descriptionForAuthId(const QString &authId)
Returns a textual description for the authority id.
void refresh() override
Triggered when the provider's connections need to be refreshed.
QString selectedTime()
Returns currently selected time.
void clearCrs()
Clear CRSs.
void populateCrs()
Sets supported CRSs.
virtual void enableLayersForCrs(QTreeWidgetItem *item)
QString mService
Service name.
virtual QList< QgsOWSSourceSelect::SupportedFormat > providerFormats()
List of image formats (encodings) supported by provider.
QString connectionInfo()
Connection info (uri).
void setMapCanvas(QgsMapCanvas *mapCanvas) override
Sets the dialog map canvas.
QNetworkRequest::CacheLoadControl selectedCacheLoadControl()
Returns currently selected cache load control.
void populateFormats()
Populate supported formats.
QTableWidgetItem * mCurrentTileset
QString selectedCrs()
Returns currently selected Crs.
void populateTimes()
Populate times.
QgsOWSSourceSelect(const QString &service, QWidget *parent=nullptr, Qt::WindowFlags fl=QgsGuiUtils::ModalDialogFlags, QgsProviderRegistry::WidgetMode widgetMode=QgsProviderRegistry::WidgetMode::Standalone)
Constructor.
virtual QStringList selectedLayersFormats()
List of formats supported for currently selected layer item(s).
void reset() override
Called when this source select widget is being shown in a "new and clean" dialog.
void setConnectionListPosition()
Sets the server connection combo box to that stored in the config file.
void clearTimes()
Clear times.
QgsTreeWidgetItem * createItem(int id, const QStringList &names, QMap< int, QgsTreeWidgetItem * > &items, int &layerAndStyleCount, const QMap< int, int > &layerParents, const QMap< int, QStringList > &layerParentNames)
create an item including possible parents
QString selectedFormat()
Returns currently selected format.
QString mConnName
Name for selected connection.
void showError(const QString &title, const QString &format, const QString &error)
show whatever error is exposed.
void populateConnectionList()
Populate the connection list combo box.
QString connName()
Connection name.
void addDefaultServers()
Add a few example servers to the list.
void showStatusMessage(const QString &message)
Sets status message to theMessage.
QgsDataSourceUri mUri
URI for selected connection.
QString mConnectionInfo
Connection info for selected connection.
void prepareExtent()
Prepares the spatial extent box with the general settings including original crs, destination crs and...
void clearFormats()
Clear previously set formats.
virtual void populateLayerList()
Populate the layer list.
QMap< QString, QString > mCrsNames
Connections management for OWS connections.
static QStringList connectionList(const QString &service)
Returns the list of connections for the specified service.
static void setSelectedConnection(const QString &service, const QString &name)
Marks the specified connection for the specified service as selected.
static void deleteConnection(const QString &service, const QString &name)
Deletes the connection for the specified service with the specified name.
static QString selectedConnection(const QString &service)
Retrieves the selected connection for the specified service.
static QgsProject * instance()
Returns the QgsProject singleton instance.
QgsCoordinateReferenceSystem crs
void showNoCrsForLayerMessage()
When called, the dialog will show a default "layer has no CRS set" message above the projection selec...
void setCrs(const QgsCoordinateReferenceSystem &crs)
Sets the initial crs to show within the dialog.
QgsCoordinateReferenceSystem crs() const
Returns the CRS currently selected in the widget.
void setOgcWmsCrsFilter(const QSet< QString > &crsFilter)
filters this dialog by the given CRSs
WidgetMode
Different ways a source select dialog can be used.
@ Manager
Used by data items for QgsDataItem::paramWidget().
Stores settings for use within QGIS.
QStringList childGroups(Qgis::SettingsOrigin origin=Qgis::SettingsOrigin::Any) const
Returns a list of all key top-level groups that contain keys that can be read using the QSettings obj...
void endGroup()
Resets the group to what it was before the corresponding beginGroup() call.
void beginGroup(const QString &prefix, QgsSettings::Section section=QgsSettings::NoSection)
Appends prefix to the current group.
void setValue(const QString &key, const QVariant &value, QgsSettings::Section section=QgsSettings::NoSection)
Sets the value of setting key to value.
#define QgsDebugMsgLevel(str, level)
QgsNewHttpConnection::ConnectionType connectionTypeFromServiceString(const QString &string)