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 );
573 QgsMessageViewer *mv =
new QgsMessageViewer(
this );
574 mv->setWindowTitle( title );
576 if ( format == QLatin1String(
"text/html" ) )
578 mv->setMessageAsHtml( error );
582 mv->setMessageAsPlainText( tr(
"Could not understand the response:\n%1" ).arg( error ) );
584 mv->showMessage(
true );
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()