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