42 #include <QButtonGroup>
43 #include <QFileDialog>
44 #include <QRadioButton>
45 #include <QDomDocument>
46 #include <QHeaderView>
47 #include <QImageReader>
48 #include <QInputDialog>
50 #include <QMessageBox>
54 #include <QNetworkRequest>
55 #include <QNetworkReply>
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 mTileWidthLineEdit->setValidator(
new QIntValidator( 0, 9999,
this ) );
85 mTileHeightLineEdit->setValidator(
new QIntValidator( 0, 9999,
this ) );
86 mFeatureCountLineEdit->setValidator(
new QIntValidator( 0, 9999,
this ) );
88 mCacheComboBox->addItem( tr(
"Always Cache" ), QNetworkRequest::AlwaysCache );
89 mCacheComboBox->addItem( tr(
"Prefer Cache" ), QNetworkRequest::PreferCache );
90 mCacheComboBox->addItem( tr(
"Prefer Network" ), QNetworkRequest::PreferNetwork );
91 mCacheComboBox->addItem( tr(
"Always Network" ), QNetworkRequest::AlwaysNetwork );
94 mCacheComboBox->setCurrentIndex( mCacheComboBox->findData( QNetworkRequest::PreferNetwork ) );
96 if (
widgetMode() != QgsProviderRegistry::WidgetMode::Manager )
103 mSelectedCRS = currentRefSys.
authid();
108 mTabWidget->removeTab( mTabWidget->indexOf( mLayerOrderTab ) );
109 mTabWidget->removeTab( mTabWidget->indexOf( mTilesetsTab ) );
111 mFormatWidget->hide();
113 mCacheWidget->hide();
127 mLayersTreeWidget->clearSelection();
132 mFormatComboBox->clear();
133 mFormatComboBox->setEnabled(
false );
145 if ( mProviderFormats.isEmpty() )
148 for (
int i = 0; i < mProviderFormats.size(); i++ )
151 mMimeLabelMap.insert( mProviderFormats[i].format, mProviderFormats[i].label );
165 QMap<QString, QString> formatsMap;
166 formatsMap.insert( QStringLiteral(
"geotiff" ), QStringLiteral(
"tiff" ) );
167 formatsMap.insert( QStringLiteral(
"gtiff" ), QStringLiteral(
"tiff" ) );
168 formatsMap.insert( QStringLiteral(
"tiff" ), QStringLiteral(
"tiff" ) );
169 formatsMap.insert( QStringLiteral(
"tif" ), QStringLiteral(
"tiff" ) );
170 formatsMap.insert( QStringLiteral(
"gif" ), QStringLiteral(
"gif" ) );
171 formatsMap.insert( QStringLiteral(
"jpeg" ), QStringLiteral(
"jpeg" ) );
172 formatsMap.insert( QStringLiteral(
"jpg" ), QStringLiteral(
"jpeg" ) );
173 formatsMap.insert( QStringLiteral(
"png" ), QStringLiteral(
"png" ) );
177 for (
int i = 0; i < layersFormats.size(); i++ )
179 QString format = layersFormats.value( i );
181 QString simpleFormat = format.toLower().remove( QStringLiteral(
"image/" ) ).remove( QRegExp(
"_.*" ) );
182 QgsDebugMsg(
"server simpleFormat = " + simpleFormat );
183 QString mimeFormat =
"image/" + formatsMap.value( simpleFormat );
184 QgsDebugMsg(
"server mimeFormat = " + mimeFormat );
186 QString label = format;
188 if ( mMimeLabelMap.contains( mimeFormat ) )
190 if ( format != mMimeLabelMap.value( mimeFormat ) )
193 label +=
" / " + mMimeLabelMap.value( mimeFormat );
196 if ( simpleFormat.contains( QLatin1String(
"tif" ) ) )
198 if ( preferred < 0 || simpleFormat.startsWith(
'g' ) )
208 QgsDebugMsg( QStringLiteral(
"format %1 unknown" ).arg( format ) );
211 mFormatComboBox->insertItem( i, label );
215 preferred = preferred >= 0 ? preferred : 0;
216 mFormatComboBox->setCurrentIndex( preferred );
218 mFormatComboBox->setEnabled(
true );
223 mTimeComboBox->clear();
230 mTimeComboBox->clear();
231 mTimeComboBox->setEnabled(
false );
236 mConnectionsComboBox->clear();
244 if (
string.compare( QLatin1String(
"wms" ), Qt::CaseInsensitive ) == 0 )
246 else if (
string.compare( QLatin1String(
"wfs" ), Qt::CaseInsensitive ) == 0 )
248 else if (
string.compare( QLatin1String(
"wcs" ), Qt::CaseInsensitive ) == 0 )
254 void QgsOWSSourceSelect::mNewButton_clicked()
268 void QgsOWSSourceSelect::mEditButton_clicked()
282 void QgsOWSSourceSelect::mDeleteButton_clicked()
284 QString msg = tr(
"Are you sure you want to remove the %1 connection and all associated settings?" )
285 .arg( mConnectionsComboBox->currentText() );
286 QMessageBox::StandardButton result = QMessageBox::question(
this, tr(
"Delete Connection" ), msg, QMessageBox::Yes | QMessageBox::No );
287 if ( result == QMessageBox::Yes )
290 mConnectionsComboBox->removeItem( mConnectionsComboBox->currentIndex() );
296 void QgsOWSSourceSelect::mSaveButton_clicked()
302 void QgsOWSSourceSelect::mLoadButton_clicked()
304 QString fileName = QFileDialog::getOpenFileName(
this, tr(
"Load Connections" ), QDir::homePath(),
305 tr(
"XML files (*.xml *.XML)" ) );
306 if ( fileName.isEmpty() )
319 const QStringList &names,
320 QMap<int, QgsTreeWidgetItem *> &items,
321 int &layerAndStyleCount,
322 const QMap<int, int> &layerParents,
323 const QMap<int, QStringList> &layerParentNames )
325 QgsDebugMsg( QStringLiteral(
"id = %1 layerAndStyleCount = %2 names = %3 " ).arg(
id ).arg( layerAndStyleCount ).arg( names.join(
"," ) ) );
326 if ( items.contains(
id ) )
331 if ( layerParents.contains(
id ) )
334 int parent = layerParents[ id ];
335 item =
new QgsTreeWidgetItem(
createItem( parent, layerParentNames[ parent ], items, layerAndStyleCount, layerParents, layerParentNames ) );
340 item->setText( 0, QString::number( ++layerAndStyleCount ) );
341 item->setText( 1, names[0].simplified() );
342 item->setText( 2, names[1].simplified() );
343 item->setText( 3, names[2].simplified() );
344 item->setToolTip( 3,
"<font color=black>" + names[2].simplified() +
"</font>" );
355 void QgsOWSSourceSelect::mConnectButton_clicked()
358 mLayersTreeWidget->clear();
363 mConnName = mConnectionsComboBox->currentText();
368 QApplication::setOverrideCursor( Qt::WaitCursor );
370 QgsDebugMsg( QStringLiteral(
"call populateLayerList" ) );
373 QApplication::restoreOverrideCursor();
380 void QgsOWSSourceSelect::mChangeCRSButton_clicked()
383 const auto constSelectedItems = mLayersTreeWidget->selectedItems();
384 for ( QTreeWidgetItem *item : constSelectedItems )
386 QString layer = item->data( 0, Qt::UserRole + 0 ).toString();
387 if ( !layer.isEmpty() )
397 mySelector->
setCrs( defaultCRS );
404 if ( !mySelector->exec() )
407 mSelectedCRS = mySelector->
crs().
authid();
412 for (
int i = 0; i < mLayersTreeWidget->topLevelItemCount(); i++ )
420 void QgsOWSSourceSelect::mLayersTreeWidget_itemSelectionChanged()
428 mCRSLabel->setText( tr(
"Coordinate Reference System (%n available)",
"crs count", mSelectedLayersCRSs.count() ) +
':' );
430 mChangeCRSButton->setDisabled( mSelectedLayersCRSs.isEmpty() );
432 if ( !mSelectedLayersCRSs.isEmpty() )
437 QSet<QString>::const_iterator it = mSelectedLayersCRSs.constBegin();
438 for ( ; it != mSelectedLayersCRSs.constEnd(); ++it )
440 if ( it->compare( mSelectedCRS, Qt::CaseInsensitive ) == 0 )
444 if ( it == mSelectedLayersCRSs.constBegin() )
452 if ( it == mSelectedLayersCRSs.constEnd() )
455 mSelectedCRS = defaultCRS;
458 mChangeCRSButton->setEnabled(
true );
465 mCRSLabel->setText( tr(
"Coordinate Reference System" ) +
':' );
466 mSelectedCRS.clear();
467 mSelectedCRSLabel->clear();
468 mChangeCRSButton->setEnabled(
false );
471 void QgsOWSSourceSelect::mTilesetsTableWidget_itemClicked( QTableWidgetItem *item )
475 QTableWidgetItem *rowItem = mTilesetsTableWidget->item( mTilesetsTableWidget->currentRow(), 0 );
478 mTilesetsTableWidget->blockSignals(
true );
479 mTilesetsTableWidget->clearSelection();
482 QgsDebugMsg( QStringLiteral(
"selecting current row %1" ).arg( mTilesetsTableWidget->currentRow() ) );
483 mTilesetsTableWidget->selectRow( mTilesetsTableWidget->currentRow() );
490 mTilesetsTableWidget->blockSignals(
false );
514 int cache = mCacheComboBox->currentData().toInt();
515 return static_cast<QNetworkRequest::CacheLoadControl
>( cache );
525 return mTimeComboBox->currentText();
532 mConnectionsComboBox->setCurrentIndex( mConnectionsComboBox->findText( toSelect ) );
534 if ( mConnectionsComboBox->currentIndex() < 0 )
536 if ( toSelect.isNull() )
537 mConnectionsComboBox->setCurrentIndex( 0 );
539 mConnectionsComboBox->setCurrentIndex( mConnectionsComboBox->count() - 1 );
542 if ( mConnectionsComboBox->count() == 0 )
545 mConnectButton->setEnabled(
false );
546 mEditButton->setEnabled(
false );
547 mDeleteButton->setEnabled(
false );
548 mSaveButton->setEnabled(
false );
553 mConnectButton->setEnabled(
true );
554 mEditButton->setEnabled(
true );
555 mDeleteButton->setEnabled(
true );
556 mSaveButton->setEnabled(
true );
564 mStatusLabel->setText( message );
574 mv->setWindowTitle( title );
576 if ( format == QLatin1String(
"text/html" ) )
587 void QgsOWSSourceSelect::mConnectionsComboBox_activated(
int )
593 void QgsOWSSourceSelect::mAddDefaultButton_clicked()
610 QMap<QString, QString> exampleServers;
611 exampleServers[QStringLiteral(
"DM Solutions GMap" )] = QStringLiteral(
"http://www2.dmsolutions.ca/cgi-bin/mswms_gmap" );
612 exampleServers[QStringLiteral(
"Lizardtech server" )] = QStringLiteral(
"http://wms.lizardtech.com/lizardtech/iserv/ows" );
618 QMap<QString, QString>::const_iterator i = exampleServers.constBegin();
619 for ( ; i != exampleServers.constEnd(); ++i )
623 if ( !keys.contains( i.key() ) )
625 QString path = i.key();
626 settings.
setValue( path +
"/url", i.value() );
632 QMessageBox::information(
this, tr(
"Add WMS Servers" ),
"<p>" + tr(
"Several WMS servers have "
633 "been added to the server list. Note that if "
634 "you access the Internet via a web proxy, you will "
635 "need to set the proxy settings in the QGIS options dialog." ) +
"</p>" );
638 void QgsOWSSourceSelect::mLayerUpButton_clicked()
640 QList<QTreeWidgetItem *> selectionList = mLayerOrderTreeWidget->selectedItems();
641 if ( selectionList.empty() )
645 int selectedIndex = mLayerOrderTreeWidget->indexOfTopLevelItem( selectionList[0] );
646 if ( selectedIndex < 1 )
651 QTreeWidgetItem *selectedItem = mLayerOrderTreeWidget->takeTopLevelItem( selectedIndex );
652 mLayerOrderTreeWidget->insertTopLevelItem( selectedIndex - 1, selectedItem );
653 mLayerOrderTreeWidget->clearSelection();
654 selectedItem->setSelected(
true );
657 void QgsOWSSourceSelect::mLayerDownButton_clicked()
659 QList<QTreeWidgetItem *> selectionList = mLayerOrderTreeWidget->selectedItems();
660 if ( selectionList.empty() )
664 int selectedIndex = mLayerOrderTreeWidget->indexOfTopLevelItem( selectionList[0] );
665 if ( selectedIndex < 0 || selectedIndex > mLayerOrderTreeWidget->topLevelItemCount() - 2 )
670 QTreeWidgetItem *selectedItem = mLayerOrderTreeWidget->takeTopLevelItem( selectedIndex );
671 mLayerOrderTreeWidget->insertTopLevelItem( selectedIndex + 1, selectedItem );
672 mLayerOrderTreeWidget->clearSelection();
673 selectedItem->setSelected(
true );
678 return QList<SupportedFormat>();
683 return QStringList();
688 return QStringList();
693 return QStringList();
696 void 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.
QString userFriendlyIdentifier(IdentifierType type=MediumString) const
Returns a user friendly identifier for the CRS.
QString authid() const
Returns the authority identifier for the CRS.
QString uri(bool expandAuthConfig=true) const
Returns the complete URI as a string.
static QgsGui * instance()
Returns a pointer to the singleton instance.
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...
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,...
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.
QgsOWSSourceSelect(const QString &service, QWidget *parent=nullptr, Qt::WindowFlags fl=QgsGuiUtils::ModalDialogFlags, QgsProviderRegistry::WidgetMode widgetMode=QgsProviderRegistry::WidgetMode::None)
Constructor.
QString connectionInfo()
Connection info (uri)
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.
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 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.
This class is a composition of two QSettings instances:
QStringList childGroups() 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.
QgsNewHttpConnection::ConnectionType connectionTypeFromServiceString(const QString &string)