39 #include "qgssettings.h" 
   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() )
 
  461         mSelectedCRS = defaultCRS;
 
  465     mChangeCRSButton->setEnabled( 
true );
 
  472   mCRSLabel->setText( tr( 
"Coordinate Reference System" ) + 
':' );
 
  473   mSelectedCRS.clear();
 
  474   mSelectedCRSLabel->clear();
 
  475   mChangeCRSButton->setEnabled( 
false );
 
  478 void QgsOWSSourceSelect::mTilesetsTableWidget_itemClicked( QTableWidgetItem *item )
 
  482   QTableWidgetItem *rowItem = mTilesetsTableWidget->item( mTilesetsTableWidget->currentRow(), 0 );
 
  485   mTilesetsTableWidget->blockSignals( 
true );
 
  486   mTilesetsTableWidget->clearSelection();
 
  489     QgsDebugMsg( QStringLiteral( 
"selecting current row %1" ).arg( mTilesetsTableWidget->currentRow() ) );
 
  490     mTilesetsTableWidget->selectRow( mTilesetsTableWidget->currentRow() );
 
  497   mTilesetsTableWidget->blockSignals( 
false );
 
  521   int cache = mCacheComboBox->currentData().toInt();
 
  522   return static_cast<QNetworkRequest::CacheLoadControl
>( cache );
 
  532   return mTimeComboBox->currentText();
 
  539   mConnectionsComboBox->setCurrentIndex( mConnectionsComboBox->findText( toSelect ) );
 
  541   if ( mConnectionsComboBox->currentIndex() < 0 )
 
  543     if ( toSelect.isNull() )
 
  544       mConnectionsComboBox->setCurrentIndex( 0 );
 
  546       mConnectionsComboBox->setCurrentIndex( mConnectionsComboBox->count() - 1 );
 
  549   if ( mConnectionsComboBox->count() == 0 )
 
  552     mConnectButton->setEnabled( 
false );
 
  553     mEditButton->setEnabled( 
false );
 
  554     mDeleteButton->setEnabled( 
false );
 
  555     mSaveButton->setEnabled( 
false );
 
  560     mConnectButton->setEnabled( 
true );
 
  561     mEditButton->setEnabled( 
true );
 
  562     mDeleteButton->setEnabled( 
true );
 
  563     mSaveButton->setEnabled( 
true );
 
  571   mStatusLabel->setText( message );
 
  581   mv->setWindowTitle( title );
 
  583   if ( format == QLatin1String( 
"text/html" ) )
 
  594 void QgsOWSSourceSelect::mConnectionsComboBox_activated( 
int )
 
  600 void QgsOWSSourceSelect::mAddDefaultButton_clicked()
 
  617   QMap<QString, QString> exampleServers;
 
  618   exampleServers[QStringLiteral( 
"DM Solutions GMap" )] = QStringLiteral( 
"http://www2.dmsolutions.ca/cgi-bin/mswms_gmap" );
 
  619   exampleServers[QStringLiteral( 
"Lizardtech server" )] = QStringLiteral( 
"http://wms.lizardtech.com/lizardtech/iserv/ows" );
 
  623   QgsSettings settings;
 
  624   settings.beginGroup( 
"/qgis/connections-" + 
mService.toLower() );
 
  625   QMap<QString, QString>::const_iterator i = exampleServers.constBegin();
 
  626   for ( ; i != exampleServers.constEnd(); ++i )
 
  629     QStringList keys = settings.childGroups();
 
  630     if ( !keys.contains( i.key() ) )
 
  632       QString path = i.key();
 
  633       settings.setValue( path + 
"/url", i.value() );
 
  639   QMessageBox::information( 
this, tr( 
"Add WMS Servers" ), 
"<p>" + tr( 
"Several WMS servers have " 
  640                             "been added to the server list. Note that if " 
  641                             "you access the Internet via a web proxy, you will " 
  642                             "need to set the proxy settings in the QGIS options dialog." ) + 
"</p>" );
 
  645 void QgsOWSSourceSelect::mLayerUpButton_clicked()
 
  647   QList<QTreeWidgetItem *> selectionList = mLayerOrderTreeWidget->selectedItems();
 
  648   if ( selectionList.empty() )
 
  652   int selectedIndex = mLayerOrderTreeWidget->indexOfTopLevelItem( selectionList[0] );
 
  653   if ( selectedIndex < 1 )
 
  658   QTreeWidgetItem *selectedItem = mLayerOrderTreeWidget->takeTopLevelItem( selectedIndex );
 
  659   mLayerOrderTreeWidget->insertTopLevelItem( selectedIndex - 1, selectedItem );
 
  660   mLayerOrderTreeWidget->clearSelection();
 
  661   selectedItem->setSelected( 
true );
 
  664 void QgsOWSSourceSelect::mLayerDownButton_clicked()
 
  666   QList<QTreeWidgetItem *> selectionList = mLayerOrderTreeWidget->selectedItems();
 
  667   if ( selectionList.empty() )
 
  671   int selectedIndex = mLayerOrderTreeWidget->indexOfTopLevelItem( selectionList[0] );
 
  672   if ( selectedIndex < 0 || selectedIndex > mLayerOrderTreeWidget->topLevelItemCount() - 2 )
 
  677   QTreeWidgetItem *selectedItem = mLayerOrderTreeWidget->takeTopLevelItem( selectedIndex );
 
  678   mLayerOrderTreeWidget->insertTopLevelItem( selectedIndex + 1, selectedItem );
 
  679   mLayerOrderTreeWidget->clearSelection();
 
  680   selectedItem->setSelected( 
true );
 
  685   return QList<SupportedFormat>();
 
  690   return QStringList();
 
  695   return QStringList();
 
  700   return QStringList();
 
  703 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.
CONSTLATIN1STRING geoEpsgCrsAuthId()
Geographic coord sys from EPSG authority.
QgsNewHttpConnection::ConnectionType connectionTypeFromServiceString(const QString &string)