File indexing completed on 2024-04-14 03:47:50
0001 // SPDX-License-Identifier: LGPL-2.1-or-later 0002 // 0003 // SPDX-FileCopyrightText: 2011 Utku Aydın <utkuaydin34@gmail.com> 0004 // 0005 0006 #include "MapWizard.h" 0007 #include "ui_MapWizard.h" 0008 0009 #include "MarbleGlobal.h" 0010 #include "MarbleDirs.h" 0011 #include "MarbleDebug.h" 0012 #include "ServerLayout.h" 0013 #include "GeoSceneDocument.h" 0014 #include "GeoSceneHead.h" 0015 #include "GeoSceneIcon.h" 0016 #include "GeoSceneZoom.h" 0017 #include "GeoSceneMap.h" 0018 #include "GeoSceneLayer.h" 0019 #include "GeoSceneTileDataset.h" 0020 #include "GeoSceneSettings.h" 0021 #include "GeoSceneProperty.h" 0022 #include "GeoSceneGeodata.h" 0023 #include "GeoSceneLegend.h" 0024 #include "GeoSceneSection.h" 0025 #include "GeoSceneItem.h" 0026 #include "GeoSceneVector.h" 0027 #include "GeoWriter.h" 0028 #include "DgmlElementDictionary.h" 0029 #include "MarbleWidget.h" 0030 #include "MarbleNavigator.h" 0031 #include "OwsServiceManager.h" 0032 0033 #include <QBuffer> 0034 #include <QDir> 0035 #include <QFile> 0036 #include <QProcess> 0037 #include <QSharedPointer> 0038 #include <QTimer> 0039 #include <QPixmap> 0040 #include <QMessageBox> 0041 #include <QFileDialog> 0042 #include <QImageReader> 0043 #include <QDialogButtonBox> 0044 #include <QNetworkReply> 0045 #include <QNetworkRequest> 0046 #include <QDomElement> 0047 #include <QXmlStreamWriter> 0048 #include <QUrlQuery> 0049 #include <QStandardItemModel> 0050 #include <QSortFilterProxyModel> 0051 #include <QColorDialog> 0052 0053 namespace Marble 0054 { 0055 0056 int const layerIdRole = 1001; 0057 0058 enum wizardPage 0059 { 0060 WelcomePage, 0061 WmsSelectionPage, 0062 LayerSelectionPage, 0063 GlobalSourceImagePage, 0064 XYZUrlPage, 0065 ThemeInfoPage, 0066 LegendPage, 0067 SummaryPage 0068 }; 0069 0070 class MapWizardPrivate 0071 { 0072 public: 0073 MapWizardPrivate() 0074 : m_serverCapabilitiesValid( false ), 0075 m_levelZeroTileValid( false ), 0076 m_previewImageValid( false ), 0077 m_legendImageValid( false ), 0078 mapProviderType(), 0079 model(new QStandardItemModel()), 0080 sortModel(new QSortFilterProxyModel()) 0081 0082 { 0083 sortModel->setFilterCaseSensitivity(Qt::CaseInsensitive); 0084 sortModel->setSourceModel(model); 0085 } 0086 0087 void pageEntered( int id ); 0088 0089 Ui::MapWizard uiWidget; 0090 0091 QString mapTheme; 0092 0093 OwsServiceManager owsManager; 0094 0095 QStringList wmsServerList; 0096 QStringList wmtsServerList; 0097 QStringList staticUrlServerList; 0098 bool m_serverCapabilitiesValid; 0099 bool m_levelZeroTileValid; 0100 bool m_previewImageValid; 0101 bool m_legendImageValid; 0102 0103 enum mapType 0104 { 0105 NoMap, 0106 StaticImageMap, 0107 WmsMap, 0108 WmtsMap, 0109 StaticUrlMap 0110 }; 0111 QStringList selectedLayers; 0112 QString selectedProjection; 0113 0114 mapType mapProviderType; 0115 QByteArray levelZero; 0116 QByteArray preview; 0117 QByteArray legend; 0118 QImage levelZeroTile; 0119 QImage previewImage; 0120 QImage legendImage; 0121 0122 QString format; 0123 0124 QStringList wmsLegends; 0125 0126 QString sourceImage; 0127 0128 QStandardItemModel * model; 0129 QSortFilterProxyModel * sortModel; 0130 }; 0131 0132 class PreviewDialog : public QDialog 0133 { 0134 Q_OBJECT 0135 public: 0136 PreviewDialog( QWidget* parent, const QString& mapThemeId ); 0137 void closeEvent(QCloseEvent* e ) override; 0138 private: 0139 bool deleteTheme( const QString& directory ); 0140 QString m_mapThemeId; 0141 }; 0142 0143 PreviewDialog::PreviewDialog( QWidget* parent, const QString& mapThemeId ) : QDialog( parent ), m_mapThemeId( mapThemeId ) 0144 { 0145 QGridLayout *layout = new QGridLayout(); 0146 MarbleWidget *widget = new MarbleWidget(); 0147 MarbleNavigator *navigator = new MarbleNavigator(); 0148 0149 connect( navigator, SIGNAL(goHome()), widget, SLOT(goHome()) ); 0150 connect( navigator, SIGNAL(moveUp()), widget, SLOT(moveUp()) ); 0151 connect( navigator, SIGNAL(moveDown()), widget, SLOT(moveDown()) ); 0152 connect( navigator, SIGNAL(moveLeft()), widget, SLOT(moveLeft()) ); 0153 connect( navigator, SIGNAL(moveRight()), widget, SLOT(moveRight()) ); 0154 connect( navigator, SIGNAL(zoomIn()), widget, SLOT(zoomIn()) ); 0155 connect( navigator, SIGNAL(zoomOut()), widget, SLOT(zoomOut()) ); 0156 connect( navigator, SIGNAL(zoomChanged(int)), widget, SLOT(setZoom(int)) ); 0157 0158 widget->setMapThemeId( m_mapThemeId ); 0159 widget->setZoom( 1000 ); 0160 0161 layout->addWidget( navigator, 1, 1 ); 0162 layout->addWidget( widget, 1, 2 ); 0163 layout->setMargin( 0 ); 0164 layout->setSpacing( 0 ); 0165 0166 this->setLayout( layout ); 0167 this->setMinimumSize( 640, 480 ); 0168 this->setWindowTitle( tr( "Preview Map" ) ); 0169 } 0170 0171 void PreviewDialog::closeEvent(QCloseEvent* e) 0172 { 0173 const QString dgmlPath = MarbleDirs::localPath() + QLatin1String("/maps/") + m_mapThemeId; 0174 const QString directory = dgmlPath.left(dgmlPath.lastIndexOf(QLatin1Char('/'))); 0175 this->deleteTheme( directory ); 0176 QDialog::closeEvent( e ); 0177 } 0178 0179 bool PreviewDialog::deleteTheme( const QString &directory ) 0180 { 0181 QDir dir(directory); 0182 bool result = true; 0183 0184 if (dir.exists(directory)) { 0185 for(const QFileInfo& info: dir.entryInfoList(QDir::NoDotAndDotDot | QDir::System | QDir::Hidden | QDir::AllDirs | QDir::Files, QDir::DirsFirst)) { 0186 if (info.isDir()) { 0187 result = deleteTheme(info.absoluteFilePath()); 0188 } else { 0189 result = QFile::remove(info.absoluteFilePath()); 0190 } 0191 0192 if (!result) { 0193 return result; 0194 } 0195 } 0196 result = dir.rmdir(directory); 0197 } 0198 0199 return result; 0200 } 0201 0202 void MapWizardPrivate::pageEntered( int id ) 0203 { 0204 if ( id == WmsSelectionPage ) { 0205 m_serverCapabilitiesValid = false; 0206 uiWidget.lineEditWmsUrl->setFocus(); 0207 } else if ( id == LayerSelectionPage || id == GlobalSourceImagePage ) { 0208 m_legendImageValid = false; 0209 m_previewImageValid = false; 0210 levelZero.clear(); 0211 uiWidget.comboBoxStaticUrlServer->clear(); 0212 uiWidget.comboBoxStaticUrlServer->addItems( staticUrlServerList ); 0213 uiWidget.comboBoxStaticUrlServer->addItem( "http://" ); 0214 } else if ( id == ThemeInfoPage ) { 0215 m_legendImageValid = false; 0216 if ( mapProviderType == MapWizardPrivate::StaticImageMap ) { 0217 previewImage = QImage( uiWidget.lineEditSource->text() ).scaled( 136, 136, Qt::IgnoreAspectRatio, Qt::SmoothTransformation ); 0218 uiWidget.labelPreview->setPixmap( QPixmap::fromImage( previewImage ) ); 0219 } 0220 } else if ( id == LegendPage ) { 0221 m_levelZeroTileValid = false; 0222 } 0223 } 0224 0225 MapWizard::MapWizard( QWidget* parent ) : QWizard( parent ), d( new MapWizardPrivate ) 0226 { 0227 d->uiWidget.setupUi( this ); 0228 0229 connect( this, SIGNAL(currentIdChanged(int)), this, SLOT(pageEntered(int)) ); 0230 0231 connect( &d->owsManager, &OwsServiceManager::wmsCapabilitiesReady, 0232 this, &MapWizard::processCapabilitiesResults); 0233 connect( &d->owsManager, &OwsServiceManager::imageRequestResultReady, 0234 this, &MapWizard::processImageResults); 0235 0236 connect( &d->owsManager, &OwsServiceManager::wmtsCapabilitiesReady, 0237 this, &MapWizard::processCapabilitiesResults); 0238 0239 0240 connect( d->uiWidget.pushButtonSource, &QAbstractButton::clicked, this, &MapWizard::querySourceImage ); 0241 connect( d->uiWidget.pushButtonPreview, &QAbstractButton::clicked, this, &MapWizard::queryPreviewImage ); 0242 connect( d->uiWidget.pushButtonLegend_2, &QAbstractButton::clicked, this, &MapWizard::queryLegendImage ); 0243 0244 connect( d->uiWidget.comboBoxWmsServer, SIGNAL(activated(QString)), this, SLOT(setLineEditWms(QString)) ); 0245 connect( d->uiWidget.listViewWmsLayers, &QListView::pressed, this, &MapWizard::processSelectedLayerInformation ); 0246 0247 connect( d->uiWidget.lineEditTitle, &QLineEdit::textChanged, d->uiWidget.labelSumMName, &QLabel::setText ); 0248 connect( d->uiWidget.lineEditTheme, &QLineEdit::textChanged, d->uiWidget.labelSumMTheme, &QLabel::setText ); 0249 0250 connect( d->uiWidget.pushButtonPreviewMap, &QAbstractButton::clicked, this, &MapWizard::showPreview ); 0251 connect( d->uiWidget.lineEditWmsSearch, &QLineEdit::textChanged, this, &MapWizard::updateSearchFilter ); 0252 connect( d->uiWidget.comboBoxWmsMaps, SIGNAL(currentIndexChanged(int)), this, SLOT(updateBackdropCheckBox()) ); 0253 connect( d->uiWidget.checkBoxWmsBackdrop, &QCheckBox::stateChanged, this, &MapWizard::updateBackdropCheckBox ); 0254 0255 connect( d->uiWidget.checkBoxWmsMultipleSelections, &QCheckBox::stateChanged, this, &MapWizard::updateListViewSelection); 0256 connect( d->uiWidget.pushButtonColor, &QPushButton::clicked, this, &MapWizard::chooseBackgroundColor); 0257 updateListViewSelection(); 0258 0259 d->uiWidget.checkBoxWmsMultipleSelections->setVisible(true); 0260 d->uiWidget.checkBoxWmsBackdrop->setVisible(true); 0261 d->uiWidget.listViewWmsLayers->setModel(d->sortModel); 0262 d->uiWidget.listViewWmsLayers->setSelectionMode(QAbstractItemView::ExtendedSelection); 0263 0264 d->uiWidget.progressBarWmsCapabilities->setVisible(false); 0265 setLayerButtonsVisible(true); 0266 0267 d->uiWidget.tabWidgetLayers->setCurrentIndex(0); 0268 0269 QPalette p = d->uiWidget.labelBackgroundColor->palette(); 0270 p.setColor(QPalette::Window, d->uiWidget.labelBackgroundColor->text()); 0271 d->uiWidget.labelBackgroundColor->setAutoFillBackground(true); 0272 d->uiWidget.labelBackgroundColor->setPalette(p); 0273 0274 d->uiWidget.radioButtonXYZServer->setVisible(false); 0275 } 0276 0277 MapWizard::~MapWizard() 0278 { 0279 delete d; 0280 } 0281 0282 void MapWizard::processCapabilitiesResults() 0283 { 0284 d->uiWidget.progressBarWmsCapabilities->setVisible(false); 0285 0286 button( MapWizard::NextButton )->setEnabled( true ); 0287 0288 if (d->owsManager.capabilitiesStatus() == OwsCapabilitiesReplyUnreadable) 0289 { 0290 QMessageBox::critical( this, tr( "Error while parsing" ), tr( "Wizard cannot parse server's response" ) ); 0291 return; 0292 } 0293 if(d->owsManager.capabilitiesStatus() == OwsCapabilitiesNoOwsServer) 0294 { 0295 QMessageBox::critical( this, tr( "Error while parsing" ), tr( "Server is not an OWS Server." ) ); 0296 return; 0297 } 0298 d->model->clear(); 0299 0300 OwsMappingCapabilities owsCapabilities; 0301 if (d->owsManager.owsServiceType() == WmsType) { 0302 owsCapabilities = d->owsManager.wmsCapabilities(); 0303 } 0304 else if (d->owsManager.owsServiceType() == WmtsType) { 0305 owsCapabilities = d->owsManager.wmtsCapabilities(); 0306 } 0307 0308 d->uiWidget.labelWmsTitle->setText(QString("Web Service: <b>%1</b>").arg(owsCapabilities.title() ) ); 0309 d->uiWidget.labelWmsTitle->setToolTip(QString("<small>%1</small>").arg(owsCapabilities.abstract() ) ); 0310 0311 for (auto layer : owsCapabilities.layers()) { 0312 if (!layer.isEmpty()) { 0313 QStandardItem * item = new QStandardItem(owsCapabilities.title(layer)); 0314 item->setData(layer, layerIdRole); 0315 item->setToolTip(owsCapabilities.abstract(layer)); 0316 d->model->appendRow(item); 0317 } 0318 } 0319 0320 // default to the first layer 0321 d->uiWidget.listViewWmsLayers->setCurrentIndex( d->sortModel->index(0,0) ); 0322 d->uiWidget.lineEditWmsSearch->setText(QString()); 0323 0324 0325 d->uiWidget.comboBoxWmsFormat->clear(); 0326 if (d->owsManager.owsServiceType() == WmsType) { 0327 d->uiWidget.comboBoxWmsFormat->addItems(d->owsManager.wmsCapabilities().formats()); 0328 0329 // default to png or jpeg 0330 d->uiWidget.comboBoxWmsFormat->setCurrentText("png"); 0331 if (d->uiWidget.comboBoxWmsFormat->currentText() != "png") { 0332 d->uiWidget.comboBoxWmsFormat->setCurrentText("jpeg"); 0333 } 0334 } 0335 0336 QString serviceInfo; 0337 serviceInfo += "<html>"; 0338 serviceInfo += d->owsManager.wmsCapabilities().abstract(); 0339 serviceInfo += QString("<br><br><i>Contact:</i> %1").arg( d->owsManager.wmsCapabilities().contactInformation()); 0340 serviceInfo += QString("<br><br><i>Fees:</i> %1").arg( d->owsManager.wmsCapabilities().fees()); 0341 serviceInfo += "</html>"; 0342 0343 d->uiWidget.textEditWmsServiceInfo->setText(serviceInfo); 0344 d->uiWidget.tabServiceInfo->setEnabled(!serviceInfo.isEmpty()); 0345 0346 if (d->uiWidget.listViewWmsLayers->model()->rowCount() > 0) { 0347 processSelectedLayerInformation(); 0348 } 0349 0350 d->m_serverCapabilitiesValid = true; 0351 0352 if (d->owsManager.owsServiceType() == WmsType) { 0353 if (!d->wmsServerList.contains(d->uiWidget.lineEditWmsUrl->text())) { 0354 d->wmsServerList.append( d->uiWidget.lineEditWmsUrl->text() ); 0355 } 0356 setWmsServers( d->wmsServerList ); 0357 } 0358 else if (d->owsManager.owsServiceType() == WmtsType) { 0359 if (!d->wmtsServerList.contains(d->uiWidget.lineEditWmsUrl->text())) { 0360 d->wmtsServerList.append( d->uiWidget.lineEditWmsUrl->text() ); 0361 } 0362 setWmtsServers( d->wmtsServerList ); 0363 } 0364 0365 0366 next(); 0367 0368 setSearchFieldVisible(d->model->rowCount() > 20); 0369 } 0370 0371 void MapWizard::processSelectedLayerInformation() 0372 { 0373 updateListViewSelection(); 0374 0375 QStringList selectedList; 0376 QModelIndexList selectedIndexes = d->uiWidget.listViewWmsLayers->selectionModel()->selectedIndexes(); 0377 for (auto selectedIndex : selectedIndexes) { 0378 selectedList << d->sortModel->data(selectedIndex, layerIdRole).toString(); 0379 } 0380 d->selectedLayers = selectedList; 0381 OwsMappingCapabilities owsCapabilities; 0382 if (d->owsManager.owsServiceType() == WmsType) { 0383 owsCapabilities = d->owsManager.wmsCapabilities(); 0384 } 0385 else if (d->owsManager.owsServiceType() == WmtsType) { 0386 owsCapabilities = d->owsManager.wmtsCapabilities(); 0387 } 0388 d->uiWidget.comboBoxWmsMaps->clear(); 0389 QMap<QString, QString> epsgToText; 0390 epsgToText["epsg:3857"] = tr("Web Mercator (epsg:3857)"); 0391 epsgToText["epsg:4326"] = tr("Equirectangular (epsg:4326)"); 0392 epsgToText["crs:84"] = tr("Equirectangular (crs:84)"); 0393 QStringList projectionTextList; 0394 if (d->selectedLayers.isEmpty()) { 0395 return; 0396 } 0397 0398 if (d->owsManager.owsServiceType() == WmsType) { 0399 WmsCapabilities capabilities = d->owsManager.wmsCapabilities(); 0400 for (auto projection : capabilities.projections(d->selectedLayers.first())) { 0401 projectionTextList << epsgToText[projection]; 0402 } 0403 d->uiWidget.labelWmsTileProjection->setText(tr("Tile Projection:")); 0404 d->uiWidget.comboBoxWmsMaps->addItems(projectionTextList); 0405 0406 // default to Web Mercator 0407 d->uiWidget.comboBoxWmsMaps->setCurrentText(tr("Web Mercator (epsg:3857)")); 0408 0409 updateBackdropCheckBox(); // align the backdrop checkbox state with the available/selected projection 0410 0411 // bool projectionSelectionVisible = d->uiWidget.comboBoxWmsMaps->count() > 0; 0412 // d->uiWidget.comboBoxWmsMaps->setVisible(projectionSelectionVisible); 0413 // d->uiWidget.labelWmsTileProjection->setVisible(projectionSelectionVisible); 0414 // d->uiWidget.comboBoxWmsMaps->setEnabled(d->uiWidget.comboBoxWmsMaps->count() > 1); 0415 } 0416 if (d->owsManager.owsServiceType() == WmtsType) { 0417 WmtsCapabilities capabilities = d->owsManager.wmtsCapabilities(); 0418 QString selectedLayer = d->selectedLayers.first(); 0419 d->uiWidget.labelWmsTileProjection->setText(tr("Tile Matrix Set:")); 0420 d->uiWidget.comboBoxWmsMaps->addItems(capabilities.wmtsTileMatrixSets()[selectedLayer]); 0421 d->uiWidget.comboBoxWmsFormat->addItems(capabilities.wmtsTileResource()[selectedLayer].keys()); 0422 // default to png or jpeg 0423 d->uiWidget.comboBoxWmsFormat->setCurrentText("png"); 0424 if (d->uiWidget.comboBoxWmsFormat->currentText() != "png") { 0425 d->uiWidget.comboBoxWmsFormat->setCurrentText("jpeg"); 0426 } 0427 } 0428 0429 0430 d->uiWidget.lineEditTitle->setText( owsCapabilities.title(d->selectedLayers.first()) ); 0431 0432 // Remove all invalid characters from the theme-String 0433 // that will make the TileLoader malfunction. 0434 QString themeString = d->selectedLayers.first(); 0435 themeString.remove(QRegExp("[:\"\\\\/]")); 0436 d->uiWidget.lineEditTheme->setText( themeString ); 0437 QRegularExpression rx("^[^:\"\\\\/]*$"); 0438 QValidator *validator = new QRegularExpressionValidator(rx, this); 0439 d->uiWidget.lineEditTheme->setValidator(validator); 0440 0441 QString description; 0442 description += "<html>"; 0443 description += owsCapabilities.abstract(d->selectedLayers.first()); 0444 if (d->owsManager.owsServiceType() == WmsType) { 0445 description += QString("<br><br><i>Contact:</i> %1").arg( d->owsManager.wmsCapabilities().contactInformation()); 0446 description += QString("<br><br><i>Fees:</i> %1").arg( d->owsManager.wmsCapabilities().fees()); 0447 } 0448 description += "</html>"; 0449 d->uiWidget.textEditDesc->setText(description); 0450 0451 QString layerInfo; 0452 layerInfo += owsCapabilities.abstract(d->selectedLayers.first()); 0453 d->uiWidget.tabLayerInfo->setEnabled(!layerInfo.isEmpty()); 0454 d->uiWidget.textEditWmsLayerInfo->setText(layerInfo); 0455 } 0456 0457 void MapWizard::processImageResults() 0458 { 0459 setLayerButtonsVisible(true); 0460 QString imageType; 0461 if (d->owsManager.imageRequestResult().resultType() == PreviewImage) { 0462 d->m_previewImageValid = true; 0463 imageType = tr("Preview Image"); 0464 } 0465 if (d->owsManager.imageRequestResult().resultType() == LevelZeroTile) { 0466 d->m_levelZeroTileValid = true; 0467 imageType = tr("Base Tile"); 0468 } 0469 if (d->owsManager.imageRequestResult().resultType() == LevelZeroTile) { 0470 d->m_legendImageValid = true; 0471 imageType = tr("Legend Image"); 0472 } 0473 0474 button( MapWizard::NextButton )->setEnabled( true ); 0475 0476 if (d->owsManager.imageRequestResult().imageStatus() == WmsImageFailed ) { 0477 QMessageBox::information( this, 0478 tr( "%1" ).arg(imageType), 0479 tr( "The %1 could not be downloaded." ).arg(imageType) ); 0480 if (imageType == PreviewImage) d->m_previewImageValid = false; 0481 if (imageType == LevelZeroTile) d->m_levelZeroTileValid = false; 0482 if (imageType == LegendImage) d->m_legendImageValid = false; 0483 } 0484 else if (d->owsManager.imageRequestResult().imageStatus() == WmsImageFailedServerMessage ) { 0485 QMessageBox::information( this, 0486 tr( "%1" ).arg(imageType), 0487 tr( "The %1 could not be downloaded successfully. The server replied:\n\n%2" ).arg( imageType, QString( d->owsManager.resultRaw() ) ) ); 0488 if (imageType == PreviewImage) d->m_previewImageValid = false; 0489 if (imageType == LevelZeroTile) d->m_levelZeroTileValid = false; 0490 if (imageType == LegendImage) d->m_legendImageValid = false; 0491 } 0492 else { 0493 if (d->owsManager.imageRequestResult().resultType() == PreviewImage) { 0494 d->previewImage = d->owsManager.resultImage().scaled( 100, 100, Qt::IgnoreAspectRatio, Qt::SmoothTransformation ); 0495 QPixmap previewPixmap = QPixmap::fromImage( d->previewImage ); 0496 d->uiWidget.labelThumbnail->setPixmap( previewPixmap ); 0497 d->uiWidget.labelThumbnail->resize( QSize(100, 100) ); 0498 d->uiWidget.labelPreview->setPixmap( previewPixmap ); 0499 d->uiWidget.labelPreview->resize( QSize(100, 100) ); 0500 } 0501 if (d->owsManager.imageRequestResult().resultType() == LevelZeroTile) { 0502 d->levelZeroTile = d->owsManager.resultImage(); 0503 d->levelZero = d->owsManager.resultRaw(); 0504 } 0505 if (d->owsManager.imageRequestResult().resultType() == LegendImage) { 0506 d->legendImage = d->owsManager.resultImage(); 0507 d->legend = d->owsManager.resultRaw(); 0508 QPixmap legendPixmap = QPixmap::fromImage( d->legendImage ); 0509 d->uiWidget.labelLegendImage->resize(legendPixmap.size()); 0510 d->uiWidget.labelLegendImage->setPixmap( legendPixmap ); 0511 } 0512 next(); 0513 } 0514 } 0515 0516 void MapWizard::createWmsLegend() 0517 { 0518 QDir map(MarbleDirs::localPath() + QLatin1String("/maps/earth/") + d->mapTheme); 0519 if( !map.exists( "legend" ) ) { 0520 map.mkdir( "legend" ); 0521 } 0522 0523 QFile image(map.absolutePath() + QLatin1String("/legend/legend.png")); 0524 image.open( QIODevice::ReadWrite ); 0525 image.write( d->legend ); 0526 image.close(); 0527 0528 const QString legendHtml = createLegendHtml(); 0529 createLegendFile( legendHtml ); 0530 } 0531 0532 void MapWizard::setWmsServers( const QStringList& uris ) 0533 { 0534 d->wmsServerList = uris; 0535 } 0536 0537 QStringList MapWizard::wmtsServers() const 0538 { 0539 return d->wmtsServerList; 0540 } 0541 0542 void MapWizard::setWmtsServers(const QStringList &uris) 0543 { 0544 d->wmtsServerList = uris; 0545 } 0546 0547 QStringList MapWizard::wmsServers() const 0548 { 0549 return d->wmsServerList; 0550 } 0551 0552 QStringList MapWizard::staticUrlServers() const 0553 { 0554 return d->staticUrlServerList; 0555 } 0556 0557 void MapWizard::setStaticUrlServers( const QStringList& uris ) 0558 { 0559 d->staticUrlServerList = uris; 0560 } 0561 0562 0563 void MapWizard::setLineEditWms(const QString &text) 0564 { 0565 if (text == tr("Custom")) { 0566 d->uiWidget.lineEditWmsUrl->setText(QString()); 0567 } 0568 else { 0569 d->uiWidget.lineEditWmsUrl->setText(text); 0570 } 0571 } 0572 0573 void MapWizard::setLayerButtonsVisible(bool visible) 0574 { 0575 d->uiWidget.checkBoxWmsMultipleSelections->setVisible(visible); 0576 d->uiWidget.checkBoxWmsBackdrop->setVisible(visible); 0577 d->uiWidget.comboBoxWmsFormat->setVisible(visible); 0578 d->uiWidget.comboBoxWmsMaps->setVisible(visible); 0579 d->uiWidget.labelWmsTileFormat->setVisible(visible); 0580 d->uiWidget.labelWmsTileProjection->setVisible(visible); 0581 d->uiWidget.progressBarWmsLayers->setVisible(!visible); 0582 } 0583 0584 void MapWizard::setSearchFieldVisible(bool visible) 0585 { 0586 d->uiWidget.labelWmsSearch->setVisible(visible); 0587 d->uiWidget.lineEditWmsSearch->setText(QString()); 0588 d->uiWidget.lineEditWmsSearch->setVisible(visible); 0589 d->uiWidget.lineEditWmsSearch->setFocus(); 0590 } 0591 0592 bool MapWizard::createFiles( const GeoSceneDocument* document ) 0593 { 0594 // Create directories 0595 QDir maps(MarbleDirs::localPath() + QLatin1String("/maps/earth/")); 0596 if( !maps.exists( document->head()->theme() ) ) 0597 { 0598 maps.mkdir( document->head()->theme() ); 0599 0600 if( d->mapProviderType == MapWizardPrivate::StaticImageMap ) 0601 { 0602 // Source image 0603 QFile sourceImage( d->sourceImage ); 0604 d->format = d->sourceImage.right(d->sourceImage.length() - d->sourceImage.lastIndexOf(QLatin1Char('.')) - 1).toLower(); 0605 sourceImage.copy( QString( "%1/%2/%2.%3" ).arg( maps.absolutePath(), 0606 document->head()->theme(), 0607 d->format ) ); 0608 } 0609 0610 else if( d->mapProviderType == MapWizardPrivate::WmsMap || d->mapProviderType == MapWizardPrivate::WmtsMap ) 0611 { 0612 maps.mkdir( QString( "%1/0/" ).arg( document->head()->theme() ) ); 0613 maps.mkdir( QString( "%1/0/0" ).arg( document->head()->theme() ) ); 0614 const QString path = QString( "%1/%2/0/0/0.%3" ).arg( maps.absolutePath(), 0615 document->head()->theme(), 0616 d->owsManager.resultFormat() ); 0617 QFile baseTile( path ); 0618 baseTile.open( QFile::WriteOnly ); 0619 baseTile.write( d->levelZero ); 0620 } 0621 0622 else if( d->mapProviderType == MapWizardPrivate::StaticUrlMap ) 0623 { 0624 maps.mkdir( QString( "%1/0/" ).arg( document->head()->theme() ) ); 0625 maps.mkdir( QString( "%1/0/0" ).arg( document->head()->theme() ) ); 0626 const QString path = QString( "%1/%2/0/0/0.%3" ).arg( maps.absolutePath(), 0627 document->head()->theme(), 0628 d->format ); 0629 QFile baseTile( path ); 0630 baseTile.open( QFile::WriteOnly ); 0631 baseTile.write( d->levelZero ); 0632 } 0633 0634 // Preview image 0635 QString pixmapPath = QString( "%1/%2/%3" ).arg( maps.absolutePath(), 0636 document->head()->theme(), 0637 document->head()->icon()->pixmap() ); 0638 d->previewImage.save( pixmapPath ); 0639 0640 // DGML 0641 QFile file( QString( "%1/%2/%2.dgml" ).arg( maps.absolutePath(), 0642 document->head()->theme() ) ); 0643 file.open( QIODevice::ReadWrite ); 0644 GeoWriter geoWriter; 0645 geoWriter.setDocumentType( dgml::dgmlTag_nameSpace20 ); 0646 geoWriter.write( &file, document ); 0647 file.close(); 0648 0649 return true; 0650 } 0651 0652 else 0653 return false; 0654 } 0655 0656 QString MapWizard::createLegendHtml( const QString& image ) 0657 { 0658 QString htmlOutput; 0659 QXmlStreamWriter stream( &htmlOutput ); 0660 stream.writeStartDocument(); 0661 stream.writeStartElement( "html" ); 0662 stream.writeStartElement( "head" ); 0663 0664 stream.writeTextElement( "title", "Marble: Legend" ); 0665 stream.writeStartElement( "link" ); 0666 stream.writeAttribute( "href", "legend.css" ); 0667 stream.writeAttribute( "rel", "stylesheet" ); 0668 stream.writeAttribute( "type", "text/css" ); 0669 stream.writeEndElement(); 0670 0671 stream.writeStartElement( "body" ); 0672 stream.writeStartElement( "img" ); 0673 stream.writeAttribute( "src", image ); 0674 stream.writeEndElement(); 0675 stream.writeComment( " ##customLegendEntries:all## " ); 0676 stream.writeEndElement(); 0677 stream.writeEndElement(); 0678 0679 return htmlOutput; 0680 } 0681 0682 void MapWizard::createLegendFile( const QString& legendHtml ) 0683 { 0684 QDir map(MarbleDirs::localPath() + QLatin1String("/maps/earth/") + d->mapTheme); 0685 0686 QFile html(map.absolutePath() + QLatin1String("/legend.html")); 0687 html.open( QIODevice::ReadWrite ); 0688 html.write( legendHtml.toLatin1().data() ); 0689 html.close(); 0690 } 0691 0692 void MapWizard::createLegend() 0693 { 0694 QDir map(MarbleDirs::localPath() + QLatin1String("/maps/earth/") + d->mapTheme); 0695 if( !map.exists( "legend" ) ) { 0696 map.mkdir( "legend" ); 0697 } 0698 0699 QFile image; 0700 image.setFileName( d->uiWidget.lineEditLegend_2->text() ); 0701 image.copy(map.absolutePath() + QLatin1String("/legend/legend.png")); 0702 0703 const QString legendHtml = createLegendHtml(); 0704 createLegendFile( legendHtml ); 0705 } 0706 0707 void MapWizard::querySourceImage() 0708 { 0709 d->uiWidget.lineEditSource->setText( QFileDialog::getOpenFileName() ); 0710 } 0711 0712 void MapWizard::queryPreviewImage() 0713 { 0714 QString fileName = QFileDialog::getOpenFileName(); 0715 d->previewImage = QImage( fileName ); 0716 0717 QPixmap preview = QPixmap::fromImage( d->previewImage ); 0718 d->uiWidget.labelThumbnail->setPixmap( preview ); 0719 d->uiWidget.labelThumbnail->resize( preview.width(), preview.height() ); 0720 } 0721 0722 void MapWizard::queryLegendImage() 0723 { 0724 QString fileName = QFileDialog::getOpenFileName(); 0725 d->uiWidget.lineEditLegend_2->setText(fileName); 0726 QImage legendImage(fileName); 0727 QPixmap legendPixmap = QPixmap::fromImage( legendImage ); 0728 d->uiWidget.labelLegendImage->setPixmap(legendPixmap); 0729 } 0730 0731 QString MapWizard::createArchive( QWidget *parent, const QString& mapId ) 0732 { 0733 QStringList splitMapId( mapId.split(QLatin1Char('/')) ); 0734 QString body = splitMapId[0]; 0735 QString theme = splitMapId[1]; 0736 QDir themeDir; 0737 0738 QStringList tarArgs; 0739 tarArgs.append( "--create" ); 0740 tarArgs.append( "--gzip" ); 0741 tarArgs.append( "--file" ); 0742 tarArgs.append( QString( "%1/%2.tar.gz" ).arg( QDir::tempPath(), theme ) ); 0743 tarArgs.append( "--directory" ); 0744 0745 if( QFile::exists( QString( "%1/maps/%2" ).arg( MarbleDirs::localPath(), mapId ) ) ) 0746 { 0747 tarArgs.append( QString( "%1/maps/" ).arg( MarbleDirs::localPath() ) ); 0748 themeDir.cd( QString( "%1/maps/%2/%3" ).arg( MarbleDirs::localPath(), body, theme ) ); 0749 } 0750 0751 else if( QFile::exists( QString( "%1/maps/%2" ).arg( MarbleDirs::systemPath(), mapId ) ) ) 0752 { 0753 tarArgs.append( QString( "%1/maps/" ).arg( MarbleDirs::systemPath() ) ); 0754 themeDir.cd( QString( "%1/maps/%2/%3" ).arg( MarbleDirs::systemPath(), body, theme ) ); 0755 } 0756 0757 if( QFile::exists( QString( "%1/%2.dgml" ).arg( themeDir.absolutePath(), theme ) ) ) 0758 { 0759 tarArgs.append( QString( "%1/%2/%2.dgml" ).arg( body, theme ) ); 0760 } 0761 0762 if( QFile::exists( QString( "%1/legend.html" ).arg( themeDir.absolutePath() ) ) ) 0763 { 0764 tarArgs.append( QString( "%1/%2/legend.html" ).arg( body, theme ) ); 0765 } 0766 0767 if( QFile::exists( QString( "%1/legend" ).arg( themeDir.absolutePath() ) ) ) 0768 { 0769 tarArgs.append( QString( "%1/%2/legend" ).arg( body, theme ) ); 0770 } 0771 0772 if( QFile::exists( QString( "%1/0/000000" ).arg( themeDir.absolutePath() ) ) ) 0773 { 0774 tarArgs.append( QString( "%1/%2/0/000000" ).arg( body, theme ) ); 0775 } 0776 0777 QStringList previewFilters; 0778 previewFilters << "preview.*"; 0779 QStringList preview = themeDir.entryList( previewFilters ); 0780 if( !preview.isEmpty() ) { 0781 tarArgs.append( QString( "%1/%2/%3" ).arg( body ).arg( theme, preview[0] ) ); 0782 } 0783 0784 QStringList sourceImgFilters; 0785 sourceImgFilters << theme + QLatin1String(".jpg") << theme + QLatin1String(".png") << theme + QLatin1String(".jpeg"); 0786 QStringList sourceImg = themeDir.entryList( sourceImgFilters ); 0787 if( !sourceImg.isEmpty() ) { 0788 tarArgs.append( QString( "%1/%2/%3" ).arg( body ).arg( theme, sourceImg[0] ) ); 0789 } 0790 0791 QProcess archiver; 0792 switch( archiver.execute( "tar", tarArgs ) ) 0793 { 0794 case -2: 0795 QMessageBox::critical( parent, tr( "Archiving failed" ), tr( "Archiving process cannot be started." ) ); 0796 break; 0797 case -1: 0798 QMessageBox::critical( parent, tr( "Archiving failed" ), tr( "Archiving process crashed." ) ); 0799 break; 0800 case 0: 0801 mDebug() << "Archived the theme successfully."; 0802 break; 0803 } 0804 archiver.waitForFinished(); 0805 return QString( "%1/%2.tar.gz" ).arg( QDir::tempPath(), theme ); 0806 } 0807 0808 void MapWizard::deleteArchive( const QString& mapId ) 0809 { 0810 QStringList splitMapId( mapId.split(QLatin1Char('/')) ); 0811 QString theme = splitMapId[1]; 0812 QFile::remove( QString( "%1/%2.tar.gz" ).arg( QDir::tempPath(), theme ) ); 0813 } 0814 0815 bool MapWizard::validateCurrentPage() 0816 { 0817 if (currentId() == WelcomePage) { 0818 updateOwsServiceType(); 0819 return true; 0820 } 0821 if ( currentId() == WmsSelectionPage && !d->m_serverCapabilitiesValid ) { 0822 d->uiWidget.progressBarWmsCapabilities->setVisible(true); 0823 QString serviceString = d->uiWidget.radioButtonWms->isChecked() 0824 ? "WMS" : d->uiWidget.radioButtonWmts->isChecked() ? "WMTS" : ""; 0825 d->owsManager.queryOwsCapabilities(QUrl(d->uiWidget.lineEditWmsUrl->text()), serviceString); 0826 button( MapWizard::NextButton )->setEnabled( false ); 0827 return false; 0828 } 0829 0830 if ( (currentId() == LayerSelectionPage && !d->m_previewImageValid) 0831 || (currentId() == XYZUrlPage && !d->m_previewImageValid ) ){ 0832 if( d->mapProviderType == MapWizardPrivate::WmsMap && d->uiWidget.listViewWmsLayers->currentIndex().isValid()) 0833 { 0834 QStringList selectedList; 0835 QModelIndexList selectedIndexes = d->uiWidget.listViewWmsLayers->selectionModel()->selectedIndexes(); 0836 for (auto selectedIndex : selectedIndexes) { 0837 selectedList << d->sortModel->data(selectedIndex, layerIdRole).toString(); 0838 } 0839 d->selectedLayers = selectedList; 0840 0841 QString projection; 0842 if (d->uiWidget.comboBoxWmsMaps->currentText() == tr("Equirectangular (epsg:4326)")) 0843 projection = "epsg:4326"; 0844 else if (d->uiWidget.comboBoxWmsMaps->currentText() == tr("Equirectangular (crs:84)")) 0845 projection = "crs:84"; 0846 else 0847 projection = "epsg:3857"; 0848 d->selectedProjection = projection; 0849 QString format = d->uiWidget.comboBoxWmsFormat->currentText(); 0850 QStringList styles = d->owsManager.wmsCapabilities().styles(d->selectedLayers); 0851 d->owsManager.queryWmsPreviewImage(QUrl(d->uiWidget.lineEditWmsUrl->text()), 0852 d->selectedLayers.join(','), projection, format, styles.join(',')); 0853 setLayerButtonsVisible(false); 0854 button( MapWizard::NextButton )->setEnabled( false ); 0855 } 0856 else if( d->mapProviderType == MapWizardPrivate::WmtsMap && d->uiWidget.listViewWmsLayers->currentIndex().isValid()) 0857 { 0858 QStringList selectedList; 0859 QModelIndexList selectedIndexes = d->uiWidget.listViewWmsLayers->selectionModel()->selectedIndexes(); 0860 for (auto selectedIndex : selectedIndexes) { 0861 selectedList << d->sortModel->data(selectedIndex, layerIdRole).toString(); 0862 } 0863 d->selectedLayers = selectedList; 0864 0865 QString tileMatrixSet = d->uiWidget.comboBoxWmsMaps->currentText(); 0866 QString tileFormat = d->uiWidget.comboBoxWmsFormat->currentText(); 0867 QString url = d->owsManager.wmtsCapabilities().wmtsTileResource()[d->selectedLayers.first()][tileFormat]; 0868 QString style = d->owsManager.wmtsCapabilities().style(d->selectedLayers.first()); 0869 d->owsManager.queryWmtsPreviewImage(url, style, tileMatrixSet); 0870 setLayerButtonsVisible(false); 0871 button( MapWizard::NextButton )->setEnabled( false ); 0872 } 0873 else if( d->mapProviderType == MapWizardPrivate::StaticUrlMap ) 0874 { 0875 QString urlString = d->uiWidget.comboBoxStaticUrlServer->currentText(); 0876 d->owsManager.queryXYZPreviewImage(urlString); 0877 d->staticUrlServerList.removeAll( urlString ); 0878 d->staticUrlServerList.prepend( urlString ); 0879 // Reset the Theme Description page 0880 d->uiWidget.lineEditTitle->clear(); 0881 d->uiWidget.lineEditTheme->clear(); 0882 d->uiWidget.textEditDesc->clear(); 0883 d->uiWidget.labelPreview->clear(); 0884 d->uiWidget.lineEditTitle->setFocus(); 0885 button( MapWizard::NextButton )->setEnabled( false ); 0886 } 0887 return false; 0888 } 0889 0890 if ( currentId() == GlobalSourceImagePage ) { 0891 d->sourceImage = d->uiWidget.lineEditSource->text(); 0892 if ( d->sourceImage.isEmpty() ) { 0893 QMessageBox::information( this, 0894 tr( "Source Image" ), 0895 tr( "Please specify a source image." ) ); 0896 d->uiWidget.lineEditSource->setFocus(); 0897 return false; 0898 } 0899 0900 if ( !QFileInfo::exists(d->sourceImage) ) { 0901 QMessageBox::information( this, 0902 tr( "Source Image" ), 0903 tr( "The source image you specified does not exist. Please specify a different one." ) ); 0904 d->uiWidget.lineEditSource->setFocus(); 0905 d->uiWidget.lineEditSource->selectAll(); 0906 return false; 0907 } 0908 0909 if ( QImage( d->sourceImage ).isNull() ) { 0910 QMessageBox::information( this, 0911 tr( "Source Image" ), 0912 tr( "The source image you specified does not seem to be an image. Please specify a different image file." ) ); 0913 d->uiWidget.lineEditSource->setFocus(); 0914 d->uiWidget.lineEditSource->selectAll(); 0915 return false; 0916 } 0917 // Reset the Theme Description page 0918 d->uiWidget.lineEditTitle->clear(); 0919 d->uiWidget.lineEditTheme->clear(); 0920 d->uiWidget.textEditDesc->clear(); 0921 d->uiWidget.labelPreview->clear(); 0922 d->previewImage = QImage( d->sourceImage ).scaled( 100, 100, Qt::IgnoreAspectRatio, Qt::SmoothTransformation );; 0923 QPixmap previewPixmap = QPixmap::fromImage( d->previewImage ); 0924 d->uiWidget.labelPreview->setPixmap( previewPixmap ); 0925 d->uiWidget.labelPreview->resize( QSize(100, 100) ); 0926 d->uiWidget.labelThumbnail->setPixmap( previewPixmap ); 0927 d->uiWidget.labelThumbnail->resize( QSize(100, 100) ); 0928 } 0929 0930 if ( currentId() == ThemeInfoPage ) { 0931 if( d->mapProviderType == MapWizardPrivate::WmsMap && !d->m_legendImageValid ) 0932 { 0933 QString legendUrl = d->owsManager.wmsCapabilities().legendUrl(d->selectedLayers.first()); 0934 if (!legendUrl.isEmpty()) { 0935 d->m_legendImageValid = true; 0936 d->owsManager.queryWmsLegendImage(QUrl(legendUrl)); 0937 button( MapWizard::NextButton )->setEnabled( false ); 0938 return false; 0939 } 0940 } 0941 if ( d->uiWidget.lineEditTitle->text().isEmpty() ) { 0942 QMessageBox::information( this, tr( "Map Title" ), tr( "Please specify a map title." ) ); 0943 d->uiWidget.lineEditTitle->setFocus(); 0944 return false; 0945 } 0946 0947 d->mapTheme = d->uiWidget.lineEditTheme->text(); 0948 if ( d->mapTheme.isEmpty() ) { 0949 QMessageBox::information( this, tr( "Map Name" ), tr( "Please specify a map name." ) ); 0950 d->uiWidget.lineEditTheme->setFocus(); 0951 return false; 0952 } 0953 0954 const QDir destinationDir( QString( "%1/maps/earth/%2" ).arg( MarbleDirs::localPath(), d->mapTheme ) ); 0955 if ( destinationDir.exists() ) { 0956 QMessageBox::information( this, 0957 tr( "Map Name" ), 0958 tr( "Please specify another map name, since there is already a map named \"%1\"." ).arg( d->mapTheme ) ); 0959 d->uiWidget.lineEditTheme->setFocus(); 0960 d->uiWidget.lineEditTheme->selectAll(); 0961 return false; 0962 } 0963 0964 if ( d->previewImage.isNull() ) { 0965 QMessageBox::information( this, tr( "Preview Image" ), tr( "Please specify a preview image." ) ); 0966 d->uiWidget.pushButtonPreview->setFocus(); 0967 return false; 0968 } 0969 } 0970 if (currentId() == LegendPage && !d->m_levelZeroTileValid 0971 && d->mapProviderType != MapWizardPrivate::StaticImageMap ) { 0972 if( d->mapProviderType == MapWizardPrivate::WmsMap ) 0973 { 0974 QString projection; 0975 if (d->uiWidget.comboBoxWmsMaps->currentText() == tr("Equirectangular (epsg:4326)")) 0976 projection = "epsg:4326"; 0977 else if (d->uiWidget.comboBoxWmsMaps->currentText() == tr("Equirectangular (crs:84)")) 0978 projection = "crs:84"; 0979 else 0980 projection = "epsg:3857"; 0981 d->selectedProjection = projection; 0982 QString format = d->uiWidget.comboBoxWmsFormat->currentText(); 0983 QStringList styles = d->owsManager.wmsCapabilities().styles(d->selectedLayers); 0984 d->owsManager.queryWmsLevelZeroTile(QUrl(d->uiWidget.lineEditWmsUrl->text()), 0985 d->selectedLayers.first(), projection, format, styles.first()); 0986 } 0987 else if( d->mapProviderType == MapWizardPrivate::WmtsMap) 0988 { 0989 QStringList selectedList; 0990 QModelIndexList selectedIndexes = d->uiWidget.listViewWmsLayers->selectionModel()->selectedIndexes(); 0991 for (auto selectedIndex : selectedIndexes) { 0992 selectedList << d->sortModel->data(selectedIndex, layerIdRole).toString(); 0993 } 0994 d->selectedLayers = selectedList; 0995 0996 QString tileMatrixSet = d->uiWidget.comboBoxWmsMaps->currentText(); 0997 QString tileFormat = d->uiWidget.comboBoxWmsFormat->currentText(); 0998 QString url = d->owsManager.wmtsCapabilities().wmtsTileResource()[d->selectedLayers.first()][tileFormat]; 0999 QString style = d->owsManager.wmtsCapabilities().style(d->selectedLayers.first()); 1000 d->owsManager.queryWmtsLevelZeroTile(url, style, tileMatrixSet); 1001 } 1002 else if( d->mapProviderType == MapWizardPrivate::StaticUrlMap ) 1003 { 1004 QString urlString = d->uiWidget.comboBoxStaticUrlServer->currentText(); 1005 d->owsManager.queryXYZLevelZeroTile(urlString); 1006 } 1007 button( MapWizard::NextButton )->setEnabled( false ); 1008 return false; 1009 } 1010 1011 return QWizard::validateCurrentPage(); 1012 } 1013 1014 int MapWizard::nextId() const 1015 { 1016 switch( currentId() ) 1017 { 1018 case WelcomePage: 1019 if( d->uiWidget.radioButtonWms->isChecked() ) { 1020 d->mapProviderType = MapWizardPrivate::WmsMap; 1021 return WmsSelectionPage; 1022 } 1023 else if( d->uiWidget.radioButtonWmts->isChecked() ) { 1024 d->mapProviderType = MapWizardPrivate::WmtsMap; 1025 return WmsSelectionPage; 1026 } else if( d->uiWidget.radioButtonBitmap->isChecked() ) { 1027 d->mapProviderType = MapWizardPrivate::StaticImageMap; 1028 return GlobalSourceImagePage; 1029 } else if( d->uiWidget.radioButtonStaticUrl->isChecked() ) { 1030 d->mapProviderType = MapWizardPrivate::StaticUrlMap; 1031 return XYZUrlPage; 1032 } 1033 break; 1034 1035 case WmsSelectionPage: // WMS Servers 1036 return LayerSelectionPage; 1037 1038 case LayerSelectionPage: // WMS Layers 1039 return ThemeInfoPage; 1040 1041 case GlobalSourceImagePage: // Static Image 1042 return ThemeInfoPage; 1043 1044 case ThemeInfoPage: 1045 return LegendPage; 1046 1047 case LegendPage: 1048 return SummaryPage; 1049 1050 case SummaryPage: // Finish 1051 return -1; 1052 1053 default: 1054 break; 1055 } 1056 1057 return currentId() + 1; 1058 } 1059 1060 void MapWizard::cleanupPage(int id) 1061 { 1062 if ( d->mapProviderType == MapWizardPrivate::StaticUrlMap ) { 1063 if (id == ThemeInfoPage) { 1064 d->levelZero.clear(); 1065 d->preview.clear(); 1066 } 1067 } 1068 QWizard::cleanupPage(id); 1069 } 1070 1071 GeoSceneDocument* MapWizard::createDocument() 1072 { 1073 GeoSceneDocument *document = new GeoSceneDocument; 1074 1075 GeoSceneHead *head = document->head(); 1076 head->setName( d->uiWidget.lineEditTitle->text() ); 1077 head->setTheme( d->uiWidget.lineEditTheme->text() ); 1078 head->setTarget( "earth" ); 1079 head->setDescription( d->uiWidget.textEditDesc->document()->toHtml() ); 1080 head->setVisible( true ); 1081 1082 GeoSceneIcon *icon = head->icon(); 1083 icon->setPixmap( QString("%1-preview.png").arg(document->head()->theme()) ); 1084 1085 GeoSceneZoom *zoom = head->zoom(); 1086 zoom->setMinimum( 900 ); 1087 zoom->setMaximum( 3500 ); 1088 zoom->setDiscrete( false ); 1089 1090 GeoSceneTileDataset *backdropTexture = nullptr; 1091 bool isBackdropTextureAvailable = d->uiWidget.checkBoxWmsBackdrop->isEnabled() 1092 && d->uiWidget.checkBoxWmsBackdrop->isChecked() 1093 && d->uiWidget.radioButtonOpenStreetMap->isChecked(); 1094 if (isBackdropTextureAvailable) { 1095 if (d->uiWidget.radioButtonXYZServer) { 1096 backdropTexture = new GeoSceneTileDataset( "backdrop" ); 1097 backdropTexture->setExpire( 31536000 ); 1098 backdropTexture->setSourceDir(QLatin1String("earth/openstreetmap")); 1099 backdropTexture->setFileFormat( "PNG" ); 1100 backdropTexture->addDownloadPolicy( DownloadBrowse, 20 ); 1101 backdropTexture->addDownloadPolicy( DownloadBulk, 2 ); 1102 backdropTexture->addDownloadUrl( QUrl("https://tile.openstreetmap.org/") ); 1103 backdropTexture->setMaximumTileLevel( 20 ); 1104 backdropTexture->setTileSize(QSize(256, 256)); 1105 backdropTexture->setLevelZeroRows( 1 ); 1106 backdropTexture->setLevelZeroColumns( 1 ); 1107 backdropTexture->setServerLayout( new OsmServerLayout( backdropTexture ) ); 1108 backdropTexture->setTileProjection(GeoSceneAbstractTileProjection::Mercator); 1109 } 1110 } 1111 1112 GeoSceneTileDataset *texture = new GeoSceneTileDataset( "map" ); 1113 texture->setExpire( 31536000 ); 1114 texture->setSourceDir(QLatin1String("earth/") + document->head()->theme()); 1115 if( d->mapProviderType == MapWizardPrivate::WmsMap ) 1116 { 1117 texture->setFileFormat( d->owsManager.resultFormat() ); 1118 QStringList styles = d->owsManager.wmsCapabilities().styles(d->selectedLayers); 1119 QUrl downloadUrl = QUrl( d->uiWidget.lineEditWmsUrl->text() ); 1120 QUrlQuery urlQuery; 1121 urlQuery.addQueryItem( "layers", d->selectedLayers.join(',') ); 1122 urlQuery.addQueryItem( "styles", styles.join(",") ); 1123 bool isBackdropAvailable = d->uiWidget.checkBoxWmsBackdrop->isEnabled() 1124 && d->uiWidget.checkBoxWmsBackdrop->isChecked(); 1125 urlQuery.addQueryItem( "transparent", isBackdropTextureAvailable ? "true" : "false" ); 1126 1127 if (d->uiWidget.checkBoxWmsBackdrop->isChecked() && d->uiWidget.radioButtonColor->isChecked()) { 1128 QString bgColorName = d->uiWidget.labelBackgroundColor->palette().color(QPalette::Window).name(); 1129 bgColorName = bgColorName.remove("#"); 1130 bgColorName = "0x" + bgColorName; 1131 urlQuery.addQueryItem( "bgcolor", bgColorName); 1132 } 1133 downloadUrl.setQuery( urlQuery ); 1134 texture->addDownloadUrl( downloadUrl ); 1135 texture->setMaximumTileLevel( 20 ); 1136 texture->setTileSize(QSize(256, 256)); 1137 texture->setLevelZeroRows( 1 ); 1138 texture->setLevelZeroColumns( 1 ); 1139 texture->setServerLayout( new WmsServerLayout( texture ) ); 1140 if (d->uiWidget.comboBoxWmsMaps->currentText() == tr("Web Mercator (epsg:3857)")) { 1141 texture->setTileProjection(GeoSceneAbstractTileProjection::Mercator); 1142 } 1143 else { 1144 texture->setTileProjection(GeoSceneAbstractTileProjection::Equirectangular); 1145 } 1146 if (isBackdropAvailable) { 1147 texture->setBlending("AlphaBlending"); 1148 } 1149 } 1150 if( d->mapProviderType == MapWizardPrivate::WmtsMap ) 1151 { 1152 QString format = d->uiWidget.comboBoxWmsFormat->currentText(); 1153 texture->setFileFormat( format ); 1154 QString selectedLayer = d->selectedLayers.first(); 1155 QString urlString = d->owsManager.wmtsCapabilities().wmtsTileResource()[selectedLayer][format]; 1156 urlString.replace(urlString.indexOf(QLatin1String("{Time}")), 6, "current"); 1157 urlString.replace(urlString.indexOf(QLatin1String("{style}")), 7, d->owsManager.wmtsCapabilities().style(selectedLayer)); 1158 urlString.replace(urlString.indexOf(QLatin1String("{Style}")), 7, d->owsManager.wmtsCapabilities().style(selectedLayer)); 1159 urlString.replace(urlString.indexOf(QLatin1String("{TileMatrixSet}")), 15, d->uiWidget.comboBoxWmsMaps->currentText()); 1160 QUrl downloadUrl = QUrl( urlString ); 1161 texture->addDownloadPolicy( DownloadBrowse, 20 ); 1162 texture->addDownloadPolicy( DownloadBulk, 2 ); 1163 texture->addDownloadUrl( downloadUrl ); 1164 texture->setMaximumTileLevel( 20 ); 1165 texture->setTileSize(QSize(256, 256)); 1166 texture->setLevelZeroRows( 1 ); 1167 texture->setLevelZeroColumns( 1 ); 1168 texture->setServerLayout( new WmtsServerLayout( texture ) ); 1169 texture->setTileProjection(GeoSceneAbstractTileProjection::Mercator); 1170 } 1171 1172 else if( d->mapProviderType == MapWizardPrivate::StaticUrlMap ) 1173 { 1174 texture->setFileFormat( d->format ); 1175 QUrl downloadUrl = QUrl( d->uiWidget.comboBoxStaticUrlServer->currentText() ); 1176 texture->addDownloadPolicy( DownloadBrowse, 20 ); 1177 texture->addDownloadPolicy( DownloadBulk, 2 ); 1178 texture->addDownloadUrl( downloadUrl ); 1179 texture->setMaximumTileLevel( 20 ); 1180 texture->setTileSize(QSize(256, 256)); 1181 texture->setLevelZeroRows( 1 ); 1182 texture->setLevelZeroColumns( 1 ); 1183 texture->setServerLayout( new CustomServerLayout( texture ) ); 1184 texture->setTileProjection(GeoSceneAbstractTileProjection::Mercator); 1185 } 1186 1187 else if( d->mapProviderType == MapWizardPrivate::StaticImageMap ) 1188 { 1189 QString image = d->uiWidget.lineEditSource->text(); 1190 d->format = image.right(image.length() - image.lastIndexOf(QLatin1Char('.')) - 1).toLower(); 1191 texture->setFileFormat( d->format.toUpper() ); 1192 texture->setInstallMap(document->head()->theme() + QLatin1Char('.') + d->format); 1193 texture->setServerLayout( new MarbleServerLayout( texture ) ); 1194 texture->setTileProjection(GeoSceneAbstractTileProjection::Equirectangular); 1195 int imageWidth = QImage( image ).width(); 1196 int tileSize = c_defaultTileSize; 1197 1198 float approxMaxTileLevel = log( imageWidth / ( 2.0 * tileSize ) ) / log( 2.0 ); 1199 int maxTileLevel = 0; 1200 if ( approxMaxTileLevel == int( approxMaxTileLevel ) ) { 1201 maxTileLevel = static_cast<int>( approxMaxTileLevel ); 1202 } else { 1203 maxTileLevel = static_cast<int>( approxMaxTileLevel + 1 ); 1204 } 1205 texture->setMaximumTileLevel( maxTileLevel ); 1206 } 1207 1208 GeoSceneLayer *layer = new GeoSceneLayer( d->uiWidget.lineEditTheme->text() ); 1209 layer->setBackend( "texture" ); 1210 layer->addDataset( backdropTexture ); 1211 layer->addDataset( texture ); 1212 1213 GeoSceneLayer* secondLayer = new GeoSceneLayer( "standardplaces" ); 1214 secondLayer->setBackend( "geodata" ); 1215 1216 GeoSceneGeodata* cityplacemarks = new GeoSceneGeodata( "cityplacemarks" ); 1217 cityplacemarks->setSourceFile( "cityplacemarks.kml" ); 1218 secondLayer->addDataset( cityplacemarks ); 1219 1220 GeoSceneGeodata* baseplacemarks = new GeoSceneGeodata( "baseplacemarks" ); 1221 baseplacemarks->setSourceFile( "baseplacemarks.kml" ); 1222 secondLayer->addDataset( baseplacemarks ); 1223 1224 GeoSceneGeodata* elevplacemarks = new GeoSceneGeodata( "elevplacemarks" ); 1225 elevplacemarks->setSourceFile( "elevplacemarks.kml" ); 1226 secondLayer->addDataset( elevplacemarks ); 1227 1228 GeoSceneGeodata* observatoryplacemarks = new GeoSceneGeodata( "observatoryplacemarks" ); 1229 observatoryplacemarks->setSourceFile( "observatoryplacemarks.kml" ); 1230 secondLayer->addDataset( observatoryplacemarks ); 1231 1232 GeoSceneGeodata* otherplacemarks = new GeoSceneGeodata( "otherplacemarks" ); 1233 otherplacemarks->setSourceFile( "otherplacemarks.kml" ); 1234 secondLayer->addDataset( otherplacemarks ); 1235 1236 GeoSceneGeodata* boundaryplacemarks = new GeoSceneGeodata( "boundaryplacemarks" ); 1237 boundaryplacemarks->setSourceFile( "boundaryplacemarks.kml" ); 1238 secondLayer->addDataset( boundaryplacemarks ); 1239 1240 GeoSceneMap *map = document->map(); 1241 1242 if( d->mapProviderType == MapWizardPrivate::WmsMap ) 1243 { 1244 QString bbox; 1245 bbox = d->owsManager.wmsCapabilities().boundingBoxNSEWDegrees(d->selectedLayers, d->selectedProjection); 1246 QStringList bboxList = bbox.split(','); 1247 // Only center if the bbox does not cover roughly the whole earth 1248 if (bboxList.at(0).toDouble() < 85 && bboxList.at(1).toDouble() > -85 1249 && bboxList.at(2).toDouble() < 179 && bboxList.at(3).toDouble() > -179) { 1250 map->setCenter(bbox); 1251 } 1252 } 1253 1254 map->addLayer( layer ); 1255 map->addLayer( secondLayer ); 1256 1257 GeoSceneSettings *settings = document->settings(); 1258 // GeoSceneLegend *legend = document->legend(); 1259 1260 /* 1261 if( d->uiWidget.checkBoxCoord->checkState() == Qt::Checked ) 1262 { 1263 GeoSceneProperty *coorGrid = new GeoSceneProperty( "coordinate-grid" ); 1264 coorGrid->setDefaultValue( true ); 1265 coorGrid->setAvailable( true ); 1266 settings->addProperty( coorGrid ); 1267 1268 GeoSceneSection *coorSection = new GeoSceneSection( "coordinate-grid" ); 1269 coorSection->setHeading( "Coordinate Grid" ); 1270 coorSection->setCheckable( true ); 1271 coorSection->setConnectTo( "coordinate-grid" ); 1272 coorSection->setSpacing( 12 ); 1273 legend->addSection( coorSection ); 1274 } 1275 1276 if( d->uiWidget.checkBoxInterest->checkState() == Qt::Checked ) 1277 { 1278 GeoSceneProperty *poiProperty = new GeoSceneProperty( "otherplaces" ); 1279 poiProperty->setDefaultValue( true ); 1280 poiProperty->setAvailable( true ); 1281 settings->addProperty( poiProperty ); 1282 1283 GeoSceneSection *poiSection = new GeoSceneSection( "otherplaces" ); 1284 poiSection->setHeading( "Places of Interest" ); 1285 poiSection->setCheckable( true ); 1286 poiSection->setConnectTo( "otherplaces" ); 1287 poiSection->setSpacing( 12 ); 1288 1289 GeoSceneItem *geoPole = new GeoSceneItem( "geographic-pole" ); 1290 GeoSceneIcon *geoPoleIcon = geoPole->icon(); 1291 geoPole->setText( tr("Geographic Pole") ); 1292 geoPoleIcon->setPixmap( "bitmaps/pole_1.png" ); 1293 poiSection->addItem( geoPole ); 1294 1295 GeoSceneItem *magPole = new GeoSceneItem( "magnetic-pole" ); 1296 GeoSceneIcon *magPoleIcon = magPole->icon(); 1297 magPole->setText( tr("Magnetic Pole") ); 1298 magPoleIcon->setPixmap( "bitmaps/pole_2.png" ); 1299 poiSection->addItem( magPole ); 1300 1301 GeoSceneItem *airport = new GeoSceneItem( "airport" ); 1302 GeoSceneIcon *airportIcon = airport->icon(); 1303 airport->setText( tr("Airport") ); 1304 airportIcon->setPixmap( "bitmaps/airport.png" ); 1305 poiSection->addItem( airport ); 1306 1307 GeoSceneItem *shipwreck = new GeoSceneItem( "shipwreck" ); 1308 GeoSceneIcon *shipwreckIcon = shipwreck->icon(); 1309 shipwreck->setText( tr("Shipwreck") ); 1310 shipwreckIcon->setPixmap( "bitmaps/shipwreck.png" ); 1311 poiSection->addItem( shipwreck ); 1312 1313 GeoSceneItem *observatory = new GeoSceneItem( "observatory" ); 1314 GeoSceneIcon *observatoryIcon = observatory->icon(); 1315 observatory->setText( tr("Observatory") ); 1316 observatoryIcon->setPixmap( "bitmaps/observatory.png" ); 1317 poiSection->addItem( observatory ); 1318 1319 legend->addSection( poiSection ); 1320 } 1321 1322 if( d->uiWidget.checkBoxTer->checkState() == Qt::Checked ) 1323 { 1324 GeoSceneProperty *terrainProperty = new GeoSceneProperty( "terrain" ); 1325 terrainProperty->setDefaultValue( true ); 1326 terrainProperty->setAvailable( true ); 1327 settings->addProperty( terrainProperty ); 1328 1329 GeoSceneSection *terrainSection = new GeoSceneSection( "terrain" ); 1330 terrainSection->setHeading( "Terrain" ); 1331 terrainSection->setCheckable( true ); 1332 terrainSection->setConnectTo( "terrain" ); 1333 terrainSection->setSpacing( 12 ); 1334 1335 GeoSceneItem *mountain = new GeoSceneItem( "mountain" ); 1336 GeoSceneIcon *mountainIcon = mountain->icon(); 1337 mountain->setText( tr("Mountain") ); 1338 mountainIcon->setPixmap( "bitmaps/mountain_1.png" ); 1339 terrainSection->addItem( mountain ); 1340 1341 GeoSceneItem *volcano = new GeoSceneItem( "volcano" ); 1342 GeoSceneIcon *volcanoIcon = volcano->icon(); 1343 volcano->setText( tr("Volcano") ); 1344 volcanoIcon->setPixmap( "bitmaps/volcano_1.png" ); 1345 terrainSection->addItem( volcano ); 1346 1347 legend->addSection( terrainSection ); 1348 1349 } 1350 1351 if( d->uiWidget.checkBoxPop->checkState() == Qt::Checked ) 1352 { 1353 GeoSceneProperty *placesProperty = new GeoSceneProperty( "places" ); 1354 placesProperty->setDefaultValue( true ); 1355 placesProperty->setAvailable( true ); 1356 settings->addProperty( placesProperty ); 1357 1358 GeoSceneProperty *citiesProperty = new GeoSceneProperty( "cities" ); 1359 citiesProperty->setDefaultValue( true ); 1360 citiesProperty->setAvailable( true ); 1361 settings->addProperty( citiesProperty ); 1362 } 1363 1364 if( d->uiWidget.checkBoxBorder->checkState() == Qt::Checked ) 1365 { 1366 GeoSceneSection *bordersSection = new GeoSceneSection( "borders" ); 1367 bordersSection->setHeading( "Boundaries" ); 1368 bordersSection->setCheckable( true ); 1369 bordersSection->setConnectTo( "borders" ); 1370 bordersSection->setSpacing( 12 ); 1371 1372 GeoSceneItem *internationalBoundary = new GeoSceneItem( "international-boundary" ); 1373 GeoSceneIcon *internationalBoundaryIcon = internationalBoundary->icon(); 1374 internationalBoundary->setText( tr("International") ); 1375 internationalBoundaryIcon->setPixmap( "bitmaps/border_1.png" ); 1376 bordersSection->addItem( internationalBoundary ); 1377 1378 GeoSceneItem *stateBoundary = new GeoSceneItem( "state" ); 1379 GeoSceneIcon *stateBoundaryIcon = stateBoundary->icon(); 1380 stateBoundary->setText( tr("State") ); 1381 stateBoundaryIcon->setPixmap( "bitmaps/border_2.png" ); 1382 bordersSection->addItem( stateBoundary ); 1383 1384 GeoSceneProperty *bordersProperty = new GeoSceneProperty( "borders" ); 1385 bordersProperty->setDefaultValue( false ); 1386 bordersProperty->setAvailable( true ); 1387 settings->addProperty( bordersProperty ); 1388 1389 GeoSceneProperty *intBoundariesProperty = new GeoSceneProperty( "international-boundaries" ); 1390 intBoundariesProperty->setDefaultValue( false ); 1391 intBoundariesProperty->setAvailable( true ); 1392 settings->addProperty( intBoundariesProperty ); 1393 1394 GeoSceneProperty *stateBounderiesProperty = new GeoSceneProperty( "state-boundaries" ); 1395 stateBounderiesProperty->setDefaultValue( false ); 1396 stateBounderiesProperty->setAvailable( true ); 1397 settings->addProperty( stateBounderiesProperty ); 1398 1399 legend->addSection( bordersSection ); 1400 1401 GeoSceneLayer* mwdbii = new GeoSceneLayer( "mwdbii" ); 1402 mwdbii->setBackend( "vector" ); 1403 mwdbii->setRole( "polyline" ); 1404 1405 GeoSceneVector* vector = new GeoSceneVector( "pdiffborder" ); 1406 vector->setFeature( "border" ); 1407 vector->setFileFormat( "PNT" ); 1408 vector->setSourceFile( "earth/mwdbii/PDIFFBORDER.PNT" ); 1409 vector->pen().setColor( "#ffe300" ); 1410 mwdbii->addDataset( vector ); 1411 map->addLayer( mwdbii ); 1412 } 1413 */ 1414 GeoSceneProperty *overviewmap = new GeoSceneProperty( "overviewmap" ); 1415 overviewmap->setDefaultValue( true ); 1416 overviewmap->setAvailable( true ); 1417 settings->addProperty( overviewmap ); 1418 1419 GeoSceneProperty *compass = new GeoSceneProperty( "compass" ); 1420 compass->setDefaultValue( true ); 1421 compass->setAvailable( true ); 1422 settings->addProperty( compass ); 1423 1424 GeoSceneProperty *scalebar = new GeoSceneProperty( "scalebar" ); 1425 scalebar->setDefaultValue( true ); 1426 scalebar->setAvailable( true ); 1427 settings->addProperty( scalebar ); 1428 1429 return document; 1430 } 1431 1432 void MapWizard::accept() 1433 { 1434 Q_ASSERT( d->mapProviderType != MapWizardPrivate::NoMap ); 1435 1436 Q_ASSERT( d->format == d->format.toLower() ); 1437 Q_ASSERT( !d->mapTheme.isEmpty() ); 1438 1439 if ( d->mapProviderType == MapWizardPrivate::StaticImageMap ) 1440 { 1441 d->sourceImage = d->uiWidget.lineEditSource->text(); 1442 Q_ASSERT( !d->sourceImage.isEmpty() ); 1443 Q_ASSERT( QFile( d->sourceImage ).exists() ); 1444 } 1445 else if ( d->mapProviderType == MapWizardPrivate::WmsMap ) 1446 { 1447 Q_ASSERT( !d->owsManager.wmsCapabilities().layers().isEmpty() ); 1448 Q_ASSERT( !d->levelZero.isNull() ); 1449 } 1450 else if ( d->mapProviderType == MapWizardPrivate::WmtsMap ) 1451 { 1452 Q_ASSERT( !d->owsManager.wmtsCapabilities().layers().isEmpty() ); 1453 Q_ASSERT( !d->levelZero.isNull() ); 1454 } 1455 else if ( d->mapProviderType == MapWizardPrivate::StaticUrlMap ) 1456 { 1457 Q_ASSERT( !d->levelZero.isNull() ); 1458 Q_ASSERT( !QImage::fromData( d->levelZero ).isNull() ); 1459 } 1460 1461 QSharedPointer<GeoSceneDocument> document( createDocument() ); 1462 Q_ASSERT( !document->head()->description().isEmpty() ); 1463 Q_ASSERT( !document->head()->name().isEmpty() ); 1464 1465 if( createFiles( document.data() ) ) 1466 { 1467 if( d->mapProviderType == MapWizardPrivate::WmsMap ) 1468 { 1469 if( !d->owsManager.wmsCapabilities().legendUrl(d->sortModel->data(d->uiWidget.listViewWmsLayers->currentIndex(), layerIdRole).toString()).isEmpty() ) 1470 { 1471 createWmsLegend(); 1472 } 1473 } else if( d->mapProviderType == MapWizardPrivate::StaticImageMap || d->mapProviderType == MapWizardPrivate::StaticUrlMap ) { 1474 createLegend(); 1475 } 1476 1477 QDialog::accept(); 1478 d->uiWidget.lineEditTitle->clear(); 1479 d->uiWidget.lineEditTheme->clear(); 1480 d->uiWidget.textEditDesc->clear(); 1481 d->uiWidget.labelPreview->clear(); 1482 d->uiWidget.lineEditSource->clear(); 1483 QTimer::singleShot( 0, this, SLOT(restart()) ); 1484 } 1485 1486 else 1487 { 1488 QMessageBox::critical( this, tr( "Problem while creating files" ), tr( "Check if a theme with the same name exists." ) ); 1489 return; 1490 } 1491 } 1492 1493 void MapWizard::showPreview() 1494 { 1495 QSharedPointer<GeoSceneDocument> document( createDocument() ); 1496 1497 if( createFiles( document.data() ) ) 1498 { 1499 if( d->mapProviderType == MapWizardPrivate::WmsMap ) 1500 { 1501 if( !d->owsManager.wmsCapabilities().legendUrl(d->sortModel->data(d->uiWidget.listViewWmsLayers->currentIndex(), layerIdRole).toString()).isEmpty() ) 1502 { 1503 createWmsLegend(); 1504 } 1505 } else if( d->mapProviderType == MapWizardPrivate::StaticImageMap || d->mapProviderType == MapWizardPrivate::StaticUrlMap ) { 1506 createLegend(); 1507 } 1508 } 1509 1510 QPointer<PreviewDialog> previewDialog = new PreviewDialog( this, document.data()->head()->mapThemeId() ); 1511 previewDialog->exec(); 1512 delete previewDialog; 1513 } 1514 1515 void MapWizard::updateSearchFilter(const QString &text) 1516 { 1517 d->sortModel->setFilterFixedString(text); 1518 } 1519 1520 void MapWizard::updateListViewSelection() 1521 { 1522 QAbstractItemView::SelectionMode selectionModeWMS = 1523 d->uiWidget.checkBoxWmsMultipleSelections->isChecked() 1524 ? QAbstractItemView::MultiSelection 1525 : QAbstractItemView::ExtendedSelection; 1526 QAbstractItemView::SelectionMode selectionMode = 1527 d->owsManager.owsServiceType() == WmtsType 1528 ? QAbstractItemView::SingleSelection 1529 : selectionModeWMS; 1530 d->uiWidget.listViewWmsLayers->setSelectionMode(selectionMode); 1531 d->uiWidget.checkBoxWmsMultipleSelections->setVisible(d->uiWidget.radioButtonWms->isChecked()); 1532 } 1533 1534 void MapWizard::updateBackdropCheckBox() 1535 { 1536 // The only backdrop supported is the Mercator-based OSM tile server map 1537 bool isMercator = d->uiWidget.comboBoxWmsMaps->currentText() == "Web Mercator (epsg:3857)"; 1538 d->uiWidget.checkBoxWmsBackdrop->setEnabled(isMercator); 1539 d->uiWidget.tabCustomizeBackdrop->setEnabled(isMercator && d->uiWidget.checkBoxWmsBackdrop->isChecked()); 1540 } 1541 1542 void MapWizard::updateOwsServiceType() 1543 { 1544 if (d->uiWidget.radioButtonWms->isChecked()) { 1545 d->uiWidget.labelWmsServer->setText(tr("WMS Server")); 1546 d->uiWidget.labelOwsServiceHeader->setText(tr("<h4>WMS Server</h4>Please choose a <a href=\"https://en.wikipedia.org/wiki/Web_Map_Service\">WMS</a> server or enter a custom server URL.")); 1547 d->uiWidget.comboBoxWmsServer->clear(); 1548 d->uiWidget.comboBoxWmsServer->addItems( d->wmsServerList ); 1549 d->uiWidget.comboBoxWmsServer->addItem( tr( "Custom" ), "http://" ); 1550 d->uiWidget.comboBoxWmsServer->setCurrentText( tr( "Custom" ) ); 1551 1552 } 1553 else if (d->uiWidget.radioButtonWmts->isChecked()) { 1554 d->uiWidget.labelWmsServer->setText(tr("WMTS Server")); 1555 d->uiWidget.labelOwsServiceHeader->setText(tr("<h4>WMTS Server</h4>Please choose a <a href=\"https://de.wikipedia.org/wiki/Web_Map_Tile_Service\">WMTS</a> server or enter a custom server URL.")); 1556 d->uiWidget.comboBoxWmsServer->clear(); 1557 d->uiWidget.comboBoxWmsServer->addItems( d->wmtsServerList ); 1558 d->uiWidget.comboBoxWmsServer->addItem( tr( "Custom" ), "http://" ); 1559 d->uiWidget.comboBoxWmsServer->setCurrentText( tr( "Custom" ) ); 1560 } 1561 else if (d->uiWidget.radioButtonStaticUrl->isChecked()) { 1562 d->uiWidget.comboBoxStaticUrlServer->clear(); 1563 d->uiWidget.comboBoxStaticUrlServer->addItems( d->staticUrlServerList ); 1564 // d->uiWidget.comboBoxWmsServer->addItem( tr( "Custom" ), "http://" ); 1565 // d->uiWidget.comboBoxWmsServer->setCurrentText( tr( "Custom" ) ); 1566 } 1567 } 1568 1569 void MapWizard::chooseBackgroundColor() 1570 { 1571 QColor selectedColor = QColorDialog::getColor(d->uiWidget.pushButtonColor->text()); 1572 if (selectedColor.isValid()) { 1573 d->uiWidget.labelBackgroundColor->setText(selectedColor.name()); 1574 QPalette p = d->uiWidget.labelBackgroundColor->palette(); 1575 p.setColor(QPalette::Window, selectedColor); 1576 d->uiWidget.labelBackgroundColor->setPalette(p); 1577 } 1578 } 1579 1580 1581 } 1582 1583 #include "moc_MapWizard.cpp" 1584 #include "MapWizard.moc" // needed for Q_OBJECT here in source