35#include "moc_qgsowssourceselect.cpp"
39#include <QButtonGroup>
41#include <QRadioButton>
42#include <QDomDocument>
44#include <QImageReader>
45#include <QInputDialog>
51#include <QNetworkRequest>
52#include <QNetworkReply>
53#include <QRegularExpression>
62 connect( mNewButton, &QPushButton::clicked,
this, &QgsOWSSourceSelect::mNewButton_clicked );
63 connect( mEditButton, &QPushButton::clicked,
this, &QgsOWSSourceSelect::mEditButton_clicked );
64 connect( mDeleteButton, &QPushButton::clicked,
this, &QgsOWSSourceSelect::mDeleteButton_clicked );
65 connect( mSaveButton, &QPushButton::clicked,
this, &QgsOWSSourceSelect::mSaveButton_clicked );
66 connect( mLoadButton, &QPushButton::clicked,
this, &QgsOWSSourceSelect::mLoadButton_clicked );
67 connect( mConnectButton, &QPushButton::clicked,
this, &QgsOWSSourceSelect::mConnectButton_clicked );
68 connect( mChangeCRSButton, &QPushButton::clicked,
this, &QgsOWSSourceSelect::mChangeCRSButton_clicked );
69 connect( mLayersTreeWidget, &QTreeWidget::itemSelectionChanged,
this, &QgsOWSSourceSelect::mLayersTreeWidget_itemSelectionChanged );
70 connect( mConnectionsComboBox,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::activated ),
this, &QgsOWSSourceSelect::mConnectionsComboBox_activated );
71 connect( mAddDefaultButton, &QPushButton::clicked,
this, &QgsOWSSourceSelect::mAddDefaultButton_clicked );
72 connect( mTilesetsTableWidget, &QTableWidget::itemClicked,
this, &QgsOWSSourceSelect::mTilesetsTableWidget_itemClicked );
73 connect( mLayerUpButton, &QPushButton::clicked,
this, &QgsOWSSourceSelect::mLayerUpButton_clicked );
74 connect( mLayerDownButton, &QPushButton::clicked,
this, &QgsOWSSourceSelect::mLayerDownButton_clicked );
78 setWindowTitle( tr(
"Add Layer(s) from a %1 Server" ).arg( service ) );
82 mCacheComboBox->addItem( tr(
"Always Cache" ), QNetworkRequest::AlwaysCache );
83 mCacheComboBox->addItem( tr(
"Prefer Cache" ), QNetworkRequest::PreferCache );
84 mCacheComboBox->addItem( tr(
"Prefer Network" ), QNetworkRequest::PreferNetwork );
85 mCacheComboBox->addItem( tr(
"Always Network" ), QNetworkRequest::AlwaysNetwork );
88 mCacheComboBox->setCurrentIndex( mCacheComboBox->findData( QNetworkRequest::PreferNetwork ) );
97 mSelectedCRS = currentRefSys.
authid();
102 mTabWidget->removeTab( mTabWidget->indexOf( mLayerOrderTab ) );
103 mTabWidget->removeTab( mTabWidget->indexOf( mTilesetsTab ) );
105 mFormatWidget->hide();
107 mCacheWidget->hide();
124 mSpatialExtentBox->setOutputCrs(
crs );
129 mSpatialExtentBox->setCurrentExtent( destinationCrs.
bounds(), destinationCrs );
130 mSpatialExtentBox->setOutputExtentFromCurrent();
131 mSpatialExtentBox->setMapCanvas( canvas );
141 mLayersTreeWidget->clearSelection();
146 mFormatComboBox->clear();
147 mFormatComboBox->setEnabled(
false );
158 if ( mProviderFormats.isEmpty() )
161 for (
int i = 0; i < mProviderFormats.size(); i++ )
164 mMimeLabelMap.insert( mProviderFormats[i].format, mProviderFormats[i].label );
178 QMap<QString, QString> formatsMap;
179 formatsMap.insert( QStringLiteral(
"geotiff" ), QStringLiteral(
"tiff" ) );
180 formatsMap.insert( QStringLiteral(
"gtiff" ), QStringLiteral(
"tiff" ) );
181 formatsMap.insert( QStringLiteral(
"tiff" ), QStringLiteral(
"tiff" ) );
182 formatsMap.insert( QStringLiteral(
"tif" ), QStringLiteral(
"tiff" ) );
183 formatsMap.insert( QStringLiteral(
"gif" ), QStringLiteral(
"gif" ) );
184 formatsMap.insert( QStringLiteral(
"jpeg" ), QStringLiteral(
"jpeg" ) );
185 formatsMap.insert( QStringLiteral(
"jpg" ), QStringLiteral(
"jpeg" ) );
186 formatsMap.insert( QStringLiteral(
"png" ), QStringLiteral(
"png" ) );
190 for (
int i = 0; i < layersFormats.size(); i++ )
192 const QString format = layersFormats.value( i );
194 const QString simpleFormat = format.toLower().remove( QStringLiteral(
"image/" ) ).remove( QRegularExpression(
"_.*" ) );
196 const QString mimeFormat =
"image/" + formatsMap.value( simpleFormat );
199 QString label = format;
201 if ( mMimeLabelMap.contains( mimeFormat ) )
203 if ( format != mMimeLabelMap.value( mimeFormat ) )
206 label +=
" / " + mMimeLabelMap.value( mimeFormat );
209 if ( simpleFormat.contains( QLatin1String(
"tif" ) ) )
211 if ( preferred < 0 || simpleFormat.startsWith(
'g' ) )
224 mFormatComboBox->insertItem( i, label );
228 preferred = preferred >= 0 ? preferred : 0;
229 mFormatComboBox->setCurrentIndex( preferred );
231 mFormatComboBox->setEnabled(
true );
236 mTimeComboBox->clear();
243 mTimeComboBox->clear();
244 mTimeComboBox->setEnabled(
false );
249 mConnectionsComboBox->clear();
257 if (
string.compare( QLatin1String(
"wms" ), Qt::CaseInsensitive ) == 0 )
259 else if (
string.compare( QLatin1String(
"wfs" ), Qt::CaseInsensitive ) == 0 )
261 else if (
string.compare( QLatin1String(
"wcs" ), Qt::CaseInsensitive ) == 0 )
267void QgsOWSSourceSelect::mNewButton_clicked()
281void QgsOWSSourceSelect::mEditButton_clicked()
295void QgsOWSSourceSelect::mDeleteButton_clicked()
297 const QString msg = tr(
"Are you sure you want to remove the %1 connection and all associated settings?" )
298 .arg( mConnectionsComboBox->currentText() );
299 const QMessageBox::StandardButton result = QMessageBox::question(
this, tr(
"Remove Connection" ), msg, QMessageBox::Yes | QMessageBox::No );
300 if ( result == QMessageBox::Yes )
303 mConnectionsComboBox->removeItem( mConnectionsComboBox->currentIndex() );
309void QgsOWSSourceSelect::mSaveButton_clicked()
315void QgsOWSSourceSelect::mLoadButton_clicked()
317 const QString fileName = QFileDialog::getOpenFileName(
this, tr(
"Load Connections" ), QDir::homePath(), tr(
"XML files (*.xml *.XML)" ) );
318 if ( fileName.isEmpty() )
331 const QStringList &names,
332 QMap<int, QgsTreeWidgetItem *> &items,
333 int &layerAndStyleCount,
334 const QMap<int, int> &layerParents,
335 const QMap<int, QStringList> &layerParentNames
338 QgsDebugMsgLevel( QStringLiteral(
"id = %1 layerAndStyleCount = %2 names = %3 " ).arg(
id ).arg( layerAndStyleCount ).arg( names.join(
"," ) ), 2 );
339 if ( items.contains(
id ) )
344 if ( layerParents.contains(
id ) )
347 const int parent = layerParents[id];
348 item =
new QgsTreeWidgetItem(
createItem( parent, layerParentNames[parent], items, layerAndStyleCount, layerParents, layerParentNames ) );
353 item->setText( 0, QString::number( ++layerAndStyleCount ) );
354 item->setText( 1, names[0].simplified() );
355 item->setText( 2, names[1].simplified() );
356 item->setText( 3, names[2].simplified() );
357 item->setToolTip( 3,
"<font color=black>" + names[2].simplified() +
"</font>" );
368void QgsOWSSourceSelect::mConnectButton_clicked()
370 mLayersTreeWidget->clear();
375 mConnName = mConnectionsComboBox->currentText();
380 QApplication::setOverrideCursor( Qt::WaitCursor );
385 QApplication::restoreOverrideCursor();
392void QgsOWSSourceSelect::mChangeCRSButton_clicked()
395 const auto constSelectedItems = mLayersTreeWidget->selectedItems();
396 for ( QTreeWidgetItem *item : constSelectedItems )
398 const QString layer = item->data( 0, Qt::UserRole + 0 ).toString();
399 if ( !layer.isEmpty() )
409 mySelector->
setCrs( defaultCRS );
416 if ( !mySelector->exec() )
419 mSelectedCRS = mySelector->
crs().
authid();
420 mSpatialExtentBox->setOutputCrs( mySelector->
crs() );
425 for (
int i = 0; i < mLayersTreeWidget->topLevelItemCount(); i++ )
433void QgsOWSSourceSelect::mLayersTreeWidget_itemSelectionChanged()
441 mCRSLabel->setText( tr(
"Coordinate Reference System (%n available)",
"crs count", mSelectedLayersCRSs.count() ) +
':' );
443 mChangeCRSButton->setDisabled( mSelectedLayersCRSs.isEmpty() );
445 if ( !mSelectedLayersCRSs.isEmpty() )
450 QSet<QString>::const_iterator it = mSelectedLayersCRSs.constBegin();
451 for ( ; it != mSelectedLayersCRSs.constEnd(); ++it )
453 if ( it->compare( mSelectedCRS, Qt::CaseInsensitive ) == 0 )
457 if ( it == mSelectedLayersCRSs.constBegin() )
465 if ( it == mSelectedLayersCRSs.constEnd() )
474 mSelectedCRS = defaultCRS;
479 mChangeCRSButton->setEnabled(
true );
486 mCRSLabel->setText( tr(
"Coordinate Reference System" ) +
':' );
487 mSelectedCRS.clear();
488 mSelectedCRSLabel->clear();
489 mChangeCRSButton->setEnabled(
false );
492void QgsOWSSourceSelect::mTilesetsTableWidget_itemClicked( QTableWidgetItem *item )
496 QTableWidgetItem *rowItem = mTilesetsTableWidget->item( mTilesetsTableWidget->currentRow(), 0 );
499 mTilesetsTableWidget->blockSignals(
true );
500 mTilesetsTableWidget->clearSelection();
503 QgsDebugMsgLevel( QStringLiteral(
"selecting current row %1" ).arg( mTilesetsTableWidget->currentRow() ), 2 );
504 mTilesetsTableWidget->selectRow( mTilesetsTableWidget->currentRow() );
511 mTilesetsTableWidget->blockSignals(
false );
534 const int cache = mCacheComboBox->currentData().toInt();
535 return static_cast<QNetworkRequest::CacheLoadControl
>( cache );
545 return mTimeComboBox->currentText();
552 mConnectionsComboBox->setCurrentIndex( mConnectionsComboBox->findText( toSelect ) );
554 if ( mConnectionsComboBox->currentIndex() < 0 )
556 if ( toSelect.isNull() )
557 mConnectionsComboBox->setCurrentIndex( 0 );
559 mConnectionsComboBox->setCurrentIndex( mConnectionsComboBox->count() - 1 );
562 if ( mConnectionsComboBox->count() == 0 )
565 mConnectButton->setEnabled(
false );
566 mEditButton->setEnabled(
false );
567 mDeleteButton->setEnabled(
false );
568 mSaveButton->setEnabled(
false );
573 mConnectButton->setEnabled(
true );
574 mEditButton->setEnabled(
true );
575 mDeleteButton->setEnabled(
true );
576 mSaveButton->setEnabled(
true );
584 mStatusLabel->setText( message );
594 mv->setWindowTitle( title );
596 if ( format == QLatin1String(
"text/html" ) )
607void QgsOWSSourceSelect::mConnectionsComboBox_activated(
int )
613void QgsOWSSourceSelect::mAddDefaultButton_clicked()
630 QMap<QString, QString> exampleServers;
631 exampleServers[QStringLiteral(
"DM Solutions GMap" )] = QStringLiteral(
"http://www2.dmsolutions.ca/cgi-bin/mswms_gmap" );
632 exampleServers[QStringLiteral(
"Lizardtech server" )] = QStringLiteral(
"http://wms.lizardtech.com/lizardtech/iserv/ows" );
638 QMap<QString, QString>::const_iterator i = exampleServers.constBegin();
639 for ( ; i != exampleServers.constEnd(); ++i )
643 if ( !keys.contains( i.key() ) )
645 const QString path = i.key();
646 settings.
setValue( path +
"/url", i.value() );
652 QMessageBox::information(
this, tr(
"Add WMS Servers" ),
"<p>" + tr(
"Several WMS servers have "
653 "been added to the server list. Note that if "
654 "you access the Internet via a web proxy, you will "
655 "need to set the proxy settings in the QGIS options dialog." )
659void QgsOWSSourceSelect::mLayerUpButton_clicked()
661 QList<QTreeWidgetItem *> selectionList = mLayerOrderTreeWidget->selectedItems();
662 if ( selectionList.empty() )
666 const int selectedIndex = mLayerOrderTreeWidget->indexOfTopLevelItem( selectionList[0] );
667 if ( selectedIndex < 1 )
672 QTreeWidgetItem *selectedItem = mLayerOrderTreeWidget->takeTopLevelItem( selectedIndex );
673 mLayerOrderTreeWidget->insertTopLevelItem( selectedIndex - 1, selectedItem );
674 mLayerOrderTreeWidget->clearSelection();
675 selectedItem->setSelected(
true );
678void QgsOWSSourceSelect::mLayerDownButton_clicked()
680 QList<QTreeWidgetItem *> selectionList = mLayerOrderTreeWidget->selectedItems();
681 if ( selectionList.empty() )
685 const int selectedIndex = mLayerOrderTreeWidget->indexOfTopLevelItem( selectionList[0] );
686 if ( selectedIndex < 0 || selectedIndex > mLayerOrderTreeWidget->topLevelItemCount() - 2 )
691 QTreeWidgetItem *selectedItem = mLayerOrderTreeWidget->takeTopLevelItem( selectedIndex );
692 mLayerOrderTreeWidget->insertTopLevelItem( selectedIndex + 1, selectedItem );
693 mLayerOrderTreeWidget->clearSelection();
694 selectedItem->setSelected(
true );
699 return QList<SupportedFormat>();
704 return QStringList();
709 return QStringList();
714 return QStringList();
717void QgsOWSSourceSelect::updateButtons()
This class 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)
Dialog to allow the user to configure and save connection information for an HTTP Server for WMS,...
@ 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
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
A generic dialog to prompt the user for a Coordinate Reference System.
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().
This class is a composition of two QSettings instances:
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.
CONSTLATIN1STRING geoEpsgCrsAuthId()
Geographic coord sys from EPSG authority.
#define QgsDebugMsgLevel(str, level)
QgsNewHttpConnection::ConnectionType connectionTypeFromServiceString(const QString &string)
const QgsCoordinateReferenceSystem & crs