7#include "ui_MapWizard.h"
9#include "MarbleGlobal.h"
10#include "MarbleDirs.h"
11#include "MarbleDebug.h"
12#include "ServerLayout.h"
13#include "GeoSceneDocument.h"
14#include "GeoSceneHead.h"
15#include "GeoSceneIcon.h"
16#include "GeoSceneZoom.h"
17#include "GeoSceneMap.h"
18#include "GeoSceneLayer.h"
19#include "GeoSceneTileDataset.h"
20#include "GeoSceneSettings.h"
21#include "GeoSceneProperty.h"
22#include "GeoSceneGeodata.h"
23#include "GeoSceneLegend.h"
24#include "GeoSceneSection.h"
25#include "GeoSceneItem.h"
26#include "GeoSceneVector.h"
28#include "DgmlElementDictionary.h"
31#include "OwsServiceManager.h"
37#include <QSharedPointer>
42#include <QImageReader>
43#include <QDialogButtonBox>
44#include <QNetworkReply>
45#include <QNetworkRequest>
47#include <QXmlStreamWriter>
49#include <QStandardItemModel>
50#include <QSortFilterProxyModel>
51#include <QColorDialog>
56int const layerIdRole = 1001;
63 GlobalSourceImagePage,
74 : m_serverCapabilitiesValid( false ),
75 m_levelZeroTileValid( false ),
76 m_previewImageValid( false ),
77 m_legendImageValid( false ),
87 void pageEntered(
int id );
89 Ui::MapWizard uiWidget;
93 OwsServiceManager owsManager;
98 bool m_serverCapabilitiesValid;
99 bool m_levelZeroTileValid;
100 bool m_previewImageValid;
101 bool m_legendImageValid;
114 mapType mapProviderType;
132class PreviewDialog :
public QDialog
139 bool deleteTheme(
const QString& directory );
143PreviewDialog::PreviewDialog(
QWidget* parent,
const QString& mapThemeId ) :
QDialog( parent ), m_mapThemeId( mapThemeId )
146 MarbleWidget *widget =
new MarbleWidget();
147 MarbleNavigator *navigator =
new MarbleNavigator();
149 connect( navigator, SIGNAL(goHome()), widget, SLOT(goHome()) );
150 connect( navigator, SIGNAL(moveUp()), widget, SLOT(moveUp()) );
151 connect( navigator, SIGNAL(moveDown()), widget, SLOT(moveDown()) );
152 connect( navigator, SIGNAL(moveLeft()), widget, SLOT(moveLeft()) );
153 connect( navigator, SIGNAL(moveRight()), widget, SLOT(moveRight()) );
156 connect( navigator, SIGNAL(zoomChanged(
int)), widget, SLOT(setZoom(
int)) );
158 widget->setMapThemeId( m_mapThemeId );
159 widget->setZoom( 1000 );
163 layout->setMargin( 0 );
166 this->setLayout( layout );
167 this->setMinimumSize( 640, 480 );
168 this->setWindowTitle( tr(
"Preview Map" ) );
175 this->deleteTheme( directory );
179bool PreviewDialog::deleteTheme(
const QString &directory )
184 if (
dir.exists(directory)) {
187 result = deleteTheme(info.absoluteFilePath());
196 result =
dir.rmdir(directory);
202void MapWizardPrivate::pageEntered(
int id )
204 if (
id == WmsSelectionPage ) {
205 m_serverCapabilitiesValid =
false;
206 uiWidget.lineEditWmsUrl->setFocus();
207 }
else if (
id == LayerSelectionPage ||
id == GlobalSourceImagePage ) {
208 m_legendImageValid =
false;
209 m_previewImageValid =
false;
211 uiWidget.comboBoxStaticUrlServer->clear();
212 uiWidget.comboBoxStaticUrlServer->addItems( staticUrlServerList );
213 uiWidget.comboBoxStaticUrlServer->addItem(
"http://" );
214 }
else if (
id == ThemeInfoPage ) {
215 m_legendImageValid =
false;
216 if ( mapProviderType == MapWizardPrivate::StaticImageMap ) {
220 }
else if (
id == LegendPage ) {
221 m_levelZeroTileValid =
false;
225MapWizard::MapWizard(
QWidget* parent ) :
QWizard( parent ), d( new MapWizardPrivate )
229 connect(
this, SIGNAL(currentIdChanged(
int)),
this, SLOT(pageEntered(
int)) );
231 connect( &d->owsManager, &OwsServiceManager::wmsCapabilitiesReady,
232 this, &MapWizard::processCapabilitiesResults);
233 connect( &d->owsManager, &OwsServiceManager::imageRequestResultReady,
234 this, &MapWizard::processImageResults);
236 connect( &d->owsManager, &OwsServiceManager::wmtsCapabilitiesReady,
237 this, &MapWizard::processCapabilitiesResults);
244 connect( d->uiWidget.comboBoxWmsServer, SIGNAL(activated(
QString)),
this, SLOT(setLineEditWms(
QString)) );
252 connect( d->uiWidget.comboBoxWmsMaps, SIGNAL(currentIndexChanged(
int)),
this, SLOT(updateBackdropCheckBox()) );
257 updateListViewSelection();
259 d->uiWidget.checkBoxWmsMultipleSelections->setVisible(
true);
260 d->uiWidget.checkBoxWmsBackdrop->setVisible(
true);
261 d->uiWidget.listViewWmsLayers->setModel(d->sortModel);
264 d->uiWidget.progressBarWmsCapabilities->setVisible(
false);
265 setLayerButtonsVisible(
true);
267 d->uiWidget.tabWidgetLayers->setCurrentIndex(0);
269 QPalette p = d->uiWidget.labelBackgroundColor->palette();
271 d->uiWidget.labelBackgroundColor->setAutoFillBackground(
true);
272 d->uiWidget.labelBackgroundColor->setPalette(p);
274 d->uiWidget.radioButtonXYZServer->setVisible(
false);
277MapWizard::~MapWizard()
282void MapWizard::processCapabilitiesResults()
284 d->uiWidget.progressBarWmsCapabilities->setVisible(
false);
286 button( MapWizard::NextButton )->setEnabled(
true );
288 if (d->owsManager.capabilitiesStatus() == OwsCapabilitiesReplyUnreadable)
290 QMessageBox::critical(
this, tr(
"Error while parsing" ), tr(
"Wizard cannot parse server's response" ) );
293 if(d->owsManager.capabilitiesStatus() == OwsCapabilitiesNoOwsServer)
300 OwsMappingCapabilities owsCapabilities;
301 if (d->owsManager.owsServiceType() == WmsType) {
302 owsCapabilities = d->owsManager.wmsCapabilities();
304 else if (d->owsManager.owsServiceType() == WmtsType) {
305 owsCapabilities = d->owsManager.wmtsCapabilities();
308 d->uiWidget.labelWmsTitle->setText(
QString(
"Web Service: <b>%1</b>").arg(owsCapabilities.title() ) );
309 d->uiWidget.labelWmsTitle->setToolTip(
QString(
"<small>%1</small>").arg(owsCapabilities.abstract() ) );
311 for (
auto layer : owsCapabilities.layers()) {
312 if (!layer.isEmpty()) {
314 item->
setData(layer, layerIdRole);
315 item->
setToolTip(owsCapabilities.abstract(layer));
316 d->model->appendRow(item);
321 d->uiWidget.listViewWmsLayers->setCurrentIndex( d->sortModel->index(0,0) );
322 d->uiWidget.lineEditWmsSearch->setText(
QString());
325 d->uiWidget.comboBoxWmsFormat->clear();
326 if (d->owsManager.owsServiceType() == WmsType) {
327 d->uiWidget.comboBoxWmsFormat->addItems(d->owsManager.wmsCapabilities().formats());
330 d->uiWidget.comboBoxWmsFormat->setCurrentText(
"png");
331 if (d->uiWidget.comboBoxWmsFormat->currentText() !=
"png") {
332 d->uiWidget.comboBoxWmsFormat->setCurrentText(
"jpeg");
337 serviceInfo +=
"<html>";
338 serviceInfo += d->owsManager.wmsCapabilities().abstract();
339 serviceInfo +=
QString(
"<br><br><i>Contact:</i> %1").
arg( d->owsManager.wmsCapabilities().contactInformation());
340 serviceInfo +=
QString(
"<br><br><i>Fees:</i> %1").
arg( d->owsManager.wmsCapabilities().fees());
341 serviceInfo +=
"</html>";
343 d->uiWidget.textEditWmsServiceInfo->setText(serviceInfo);
344 d->uiWidget.tabServiceInfo->setEnabled(!serviceInfo.
isEmpty());
346 if (d->uiWidget.listViewWmsLayers->model()->rowCount() > 0) {
347 processSelectedLayerInformation();
350 d->m_serverCapabilitiesValid =
true;
352 if (d->owsManager.owsServiceType() == WmsType) {
353 if (!d->wmsServerList.contains(d->uiWidget.lineEditWmsUrl->text())) {
354 d->wmsServerList.append( d->uiWidget.lineEditWmsUrl->text() );
356 setWmsServers( d->wmsServerList );
358 else if (d->owsManager.owsServiceType() == WmtsType) {
359 if (!d->wmtsServerList.contains(d->uiWidget.lineEditWmsUrl->text())) {
360 d->wmtsServerList.append( d->uiWidget.lineEditWmsUrl->text() );
362 setWmtsServers( d->wmtsServerList );
368 setSearchFieldVisible(d->model->rowCount() > 20);
371void MapWizard::processSelectedLayerInformation()
373 updateListViewSelection();
376 QModelIndexList selectedIndexes = d->uiWidget.listViewWmsLayers->selectionModel()->selectedIndexes();
377 for (
auto selectedIndex : selectedIndexes) {
378 selectedList << d->sortModel->
data(selectedIndex, layerIdRole).toString();
380 d->selectedLayers = selectedList;
381 OwsMappingCapabilities owsCapabilities;
382 if (d->owsManager.owsServiceType() == WmsType) {
383 owsCapabilities = d->owsManager.wmsCapabilities();
385 else if (d->owsManager.owsServiceType() == WmtsType) {
386 owsCapabilities = d->owsManager.wmtsCapabilities();
388 d->uiWidget.comboBoxWmsMaps->
clear();
390 epsgToText[
"epsg:3857"] = tr(
"Web Mercator (epsg:3857)");
391 epsgToText[
"epsg:4326"] = tr(
"Equirectangular (epsg:4326)");
392 epsgToText[
"crs:84"] = tr(
"Equirectangular (crs:84)");
394 if (d->selectedLayers.isEmpty()) {
398 if (d->owsManager.owsServiceType() == WmsType) {
399 WmsCapabilities
capabilities = d->owsManager.wmsCapabilities();
400 for (
auto projection :
capabilities.projections(d->selectedLayers.first())) {
401 projectionTextList << epsgToText[projection];
403 d->uiWidget.labelWmsTileProjection->setText(tr(
"Tile Projection:"));
404 d->uiWidget.comboBoxWmsMaps->addItems(projectionTextList);
407 d->uiWidget.comboBoxWmsMaps->setCurrentText(tr(
"Web Mercator (epsg:3857)"));
409 updateBackdropCheckBox();
416 if (d->owsManager.owsServiceType() == WmtsType) {
417 WmtsCapabilities
capabilities = d->owsManager.wmtsCapabilities();
419 d->uiWidget.labelWmsTileProjection->setText(tr(
"Tile Matrix Set:"));
420 d->uiWidget.comboBoxWmsMaps->addItems(
capabilities.wmtsTileMatrixSets()[selectedLayer]);
421 d->uiWidget.comboBoxWmsFormat->addItems(
capabilities.wmtsTileResource()[selectedLayer].keys());
423 d->uiWidget.comboBoxWmsFormat->setCurrentText(
"png");
424 if (d->uiWidget.comboBoxWmsFormat->currentText() !=
"png") {
425 d->uiWidget.comboBoxWmsFormat->setCurrentText(
"jpeg");
430 d->uiWidget.lineEditTitle->setText( owsCapabilities.title(d->selectedLayers.first()) );
435 themeString.
remove(QRegExp(
"[:\"\\\\/]"));
436 d->uiWidget.lineEditTheme->setText( themeString );
439 d->uiWidget.lineEditTheme->setValidator(validator);
442 description +=
"<html>";
443 description += owsCapabilities.abstract(d->selectedLayers.first());
444 if (d->owsManager.owsServiceType() == WmsType) {
445 description +=
QString(
"<br><br><i>Contact:</i> %1").
arg( d->owsManager.wmsCapabilities().contactInformation());
446 description +=
QString(
"<br><br><i>Fees:</i> %1").
arg( d->owsManager.wmsCapabilities().fees());
448 description +=
"</html>";
449 d->uiWidget.textEditDesc->setText(description);
452 layerInfo += owsCapabilities.abstract(d->selectedLayers.first());
453 d->uiWidget.tabLayerInfo->setEnabled(!layerInfo.
isEmpty());
454 d->uiWidget.textEditWmsLayerInfo->setText(layerInfo);
457void MapWizard::processImageResults()
459 setLayerButtonsVisible(
true);
461 if (d->owsManager.imageRequestResult().resultType() == PreviewImage) {
462 d->m_previewImageValid =
true;
463 imageType = tr(
"Preview Image");
465 if (d->owsManager.imageRequestResult().resultType() == LevelZeroTile) {
466 d->m_levelZeroTileValid =
true;
467 imageType = tr(
"Base Tile");
469 if (d->owsManager.imageRequestResult().resultType() == LevelZeroTile) {
470 d->m_legendImageValid =
true;
471 imageType = tr(
"Legend Image");
474 button( MapWizard::NextButton )->setEnabled(
true );
476 if (d->owsManager.imageRequestResult().imageStatus() == WmsImageFailed ) {
478 tr(
"%1" ).arg(imageType),
479 tr(
"The %1 could not be downloaded." ).arg(imageType) );
480 if (imageType == PreviewImage) d->m_previewImageValid =
false;
481 if (imageType == LevelZeroTile) d->m_levelZeroTileValid =
false;
482 if (imageType == LegendImage) d->m_legendImageValid =
false;
484 else if (d->owsManager.imageRequestResult().imageStatus() == WmsImageFailedServerMessage ) {
486 tr(
"%1" ).arg(imageType),
487 tr(
"The %1 could not be downloaded successfully. The server replied:\n\n%2" ).arg( imageType,
QString( d->owsManager.resultRaw() ) ) );
488 if (imageType == PreviewImage) d->m_previewImageValid =
false;
489 if (imageType == LevelZeroTile) d->m_levelZeroTileValid =
false;
490 if (imageType == LegendImage) d->m_legendImageValid =
false;
493 if (d->owsManager.imageRequestResult().resultType() == PreviewImage) {
496 d->uiWidget.labelThumbnail->setPixmap( previewPixmap );
497 d->uiWidget.labelThumbnail->resize(
QSize(100, 100) );
498 d->uiWidget.labelPreview->setPixmap( previewPixmap );
499 d->uiWidget.labelPreview->resize(
QSize(100, 100) );
501 if (d->owsManager.imageRequestResult().resultType() == LevelZeroTile) {
502 d->levelZeroTile = d->owsManager.resultImage();
503 d->levelZero = d->owsManager.resultRaw();
505 if (d->owsManager.imageRequestResult().resultType() == LegendImage) {
506 d->legendImage = d->owsManager.resultImage();
507 d->legend = d->owsManager.resultRaw();
509 d->uiWidget.labelLegendImage->resize(legendPixmap.
size());
510 d->uiWidget.labelLegendImage->setPixmap( legendPixmap );
516void MapWizard::createWmsLegend()
519 if( !
map.exists(
"legend" ) ) {
520 map.mkdir(
"legend" );
525 image.write( d->legend );
528 const QString legendHtml = createLegendHtml();
529 createLegendFile( legendHtml );
532void MapWizard::setWmsServers(
const QStringList& uris )
534 d->wmsServerList = uris;
539 return d->wmtsServerList;
542void MapWizard::setWmtsServers(
const QStringList &uris)
544 d->wmtsServerList = uris;
549 return d->wmsServerList;
554 return d->staticUrlServerList;
557void MapWizard::setStaticUrlServers(
const QStringList& uris )
559 d->staticUrlServerList = uris;
563void MapWizard::setLineEditWms(
const QString &text)
565 if (text == tr(
"Custom")) {
566 d->uiWidget.lineEditWmsUrl->setText(
QString());
569 d->uiWidget.lineEditWmsUrl->setText(text);
573void MapWizard::setLayerButtonsVisible(
bool visible)
575 d->uiWidget.checkBoxWmsMultipleSelections->setVisible(visible);
576 d->uiWidget.checkBoxWmsBackdrop->setVisible(visible);
577 d->uiWidget.comboBoxWmsFormat->setVisible(visible);
578 d->uiWidget.comboBoxWmsMaps->setVisible(visible);
579 d->uiWidget.labelWmsTileFormat->setVisible(visible);
580 d->uiWidget.labelWmsTileProjection->setVisible(visible);
581 d->uiWidget.progressBarWmsLayers->setVisible(!visible);
584void MapWizard::setSearchFieldVisible(
bool visible)
586 d->uiWidget.labelWmsSearch->setVisible(visible);
587 d->uiWidget.lineEditWmsSearch->setText(
QString());
588 d->uiWidget.lineEditWmsSearch->setVisible(visible);
589 d->uiWidget.lineEditWmsSearch->setFocus();
592bool MapWizard::createFiles(
const GeoSceneDocument* document )
596 if( !maps.exists( document->head()->theme() ) )
598 maps.mkdir( document->head()->theme() );
600 if( d->mapProviderType == MapWizardPrivate::StaticImageMap )
603 QFile sourceImage( d->sourceImage );
604 d->format = d->sourceImage.right(d->sourceImage.length() - d->sourceImage.lastIndexOf(
QLatin1Char(
'.')) - 1).toLower();
605 sourceImage.copy(
QString(
"%1/%2/%2.%3" ).arg( maps.absolutePath(),
606 document->head()->theme(),
610 else if( d->mapProviderType == MapWizardPrivate::WmsMap || d->mapProviderType == MapWizardPrivate::WmtsMap )
612 maps.mkdir(
QString(
"%1/0/" ).arg( document->head()->theme() ) );
613 maps.mkdir(
QString(
"%1/0/0" ).arg( document->head()->theme() ) );
615 document->head()->theme(),
616 d->owsManager.resultFormat() );
617 QFile baseTile( path );
619 baseTile.write( d->levelZero );
622 else if( d->mapProviderType == MapWizardPrivate::StaticUrlMap )
624 maps.mkdir(
QString(
"%1/0/" ).arg( document->head()->theme() ) );
625 maps.mkdir(
QString(
"%1/0/0" ).arg( document->head()->theme() ) );
627 document->head()->theme(),
629 QFile baseTile( path );
631 baseTile.write( d->levelZero );
636 document->head()->theme(),
637 document->head()->icon()->pixmap() );
638 d->previewImage.save( pixmapPath );
641 QFile file(
QString(
"%1/%2/%2.dgml" ).arg( maps.absolutePath(),
642 document->head()->theme() ) );
645 geoWriter.setDocumentType( dgml::dgmlTag_nameSpace20 );
646 geoWriter.write( &file, document );
660 stream.writeStartDocument();
661 stream.writeStartElement(
"html" );
662 stream.writeStartElement(
"head" );
664 stream.writeTextElement(
"title",
"Marble: Legend" );
665 stream.writeStartElement(
"link" );
666 stream.writeAttribute(
"href",
"legend.css" );
667 stream.writeAttribute(
"rel",
"stylesheet" );
668 stream.writeAttribute(
"type",
"text/css" );
669 stream.writeEndElement();
671 stream.writeStartElement(
"body" );
672 stream.writeStartElement(
"img" );
673 stream.writeAttribute(
"src", image );
674 stream.writeEndElement();
675 stream.writeComment(
" ##customLegendEntries:all## " );
676 stream.writeEndElement();
677 stream.writeEndElement();
682void MapWizard::createLegendFile(
const QString& legendHtml )
692void MapWizard::createLegend()
695 if( !
map.exists(
"legend" ) ) {
696 map.mkdir(
"legend" );
700 image.
setFileName( d->uiWidget.lineEditLegend_2->text() );
703 const QString legendHtml = createLegendHtml();
704 createLegendFile( legendHtml );
707void MapWizard::querySourceImage()
712void MapWizard::queryPreviewImage()
715 d->previewImage =
QImage( fileName );
718 d->uiWidget.labelThumbnail->setPixmap( preview );
719 d->uiWidget.labelThumbnail->resize( preview.
width(), preview.
height() );
722void MapWizard::queryLegendImage()
725 d->uiWidget.lineEditLegend_2->setText(fileName);
726 QImage legendImage(fileName);
728 d->uiWidget.labelLegendImage->setPixmap(legendPixmap);
739 tarArgs.
append(
"--create" );
740 tarArgs.
append(
"--gzip" );
741 tarArgs.
append(
"--file" );
743 tarArgs.
append(
"--directory" );
747 tarArgs.
append(
QString(
"%1/maps/" ).arg( MarbleDirs::localPath() ) );
748 themeDir.
cd(
QString(
"%1/maps/%2/%3" ).arg( MarbleDirs::localPath(), body, theme ) );
753 tarArgs.
append(
QString(
"%1/maps/" ).arg( MarbleDirs::systemPath() ) );
754 themeDir.
cd(
QString(
"%1/maps/%2/%3" ).arg( MarbleDirs::systemPath(), body, theme ) );
759 tarArgs.
append(
QString(
"%1/%2/%2.dgml" ).arg( body, theme ) );
764 tarArgs.
append(
QString(
"%1/%2/legend.html" ).arg( body, theme ) );
769 tarArgs.
append(
QString(
"%1/%2/legend" ).arg( body, theme ) );
774 tarArgs.
append(
QString(
"%1/%2/0/000000" ).arg( body, theme ) );
778 previewFilters <<
"preview.*";
781 tarArgs.
append(
QString(
"%1/%2/%3" ).arg( body ).arg( theme, preview[0] ) );
788 tarArgs.
append(
QString(
"%1/%2/%3" ).arg( body ).arg( theme, sourceImg[0] ) );
792 switch( archiver.
execute(
"tar", tarArgs ) )
795 QMessageBox::critical( parent, tr(
"Archiving failed" ), tr(
"Archiving process cannot be started." ) );
801 mDebug() <<
"Archived the theme successfully.";
808void MapWizard::deleteArchive(
const QString& mapId )
815bool MapWizard::validateCurrentPage()
817 if (currentId() == WelcomePage) {
818 updateOwsServiceType();
821 if ( currentId() == WmsSelectionPage && !d->m_serverCapabilitiesValid ) {
822 d->uiWidget.progressBarWmsCapabilities->setVisible(
true);
823 QString serviceString = d->uiWidget.radioButtonWms->isChecked()
824 ?
"WMS" : d->uiWidget.radioButtonWmts->isChecked() ?
"WMTS" :
"";
825 d->owsManager.queryOwsCapabilities(
QUrl(d->uiWidget.lineEditWmsUrl->text()), serviceString);
826 button( MapWizard::NextButton )->setEnabled(
false );
830 if ( (currentId() == LayerSelectionPage && !d->m_previewImageValid)
831 || (currentId() == XYZUrlPage && !d->m_previewImageValid ) ){
832 if( d->mapProviderType == MapWizardPrivate::WmsMap && d->uiWidget.listViewWmsLayers->currentIndex().isValid())
835 QModelIndexList selectedIndexes = d->uiWidget.listViewWmsLayers->selectionModel()->selectedIndexes();
836 for (
auto selectedIndex : selectedIndexes) {
837 selectedList << d->sortModel->
data(selectedIndex, layerIdRole).toString();
839 d->selectedLayers = selectedList;
842 if (d->uiWidget.comboBoxWmsMaps->currentText() == tr(
"Equirectangular (epsg:4326)"))
843 projection =
"epsg:4326";
844 else if (d->uiWidget.comboBoxWmsMaps->currentText() == tr(
"Equirectangular (crs:84)"))
845 projection =
"crs:84";
847 projection =
"epsg:3857";
848 d->selectedProjection = projection;
849 QString format = d->uiWidget.comboBoxWmsFormat->currentText();
850 QStringList styles = d->owsManager.wmsCapabilities().styles(d->selectedLayers);
851 d->owsManager.queryWmsPreviewImage(
QUrl(d->uiWidget.lineEditWmsUrl->text()),
852 d->selectedLayers.join(
','), projection, format, styles.
join(
','));
853 setLayerButtonsVisible(
false);
854 button( MapWizard::NextButton )->setEnabled(
false );
856 else if( d->mapProviderType == MapWizardPrivate::WmtsMap && d->uiWidget.listViewWmsLayers->currentIndex().isValid())
859 QModelIndexList selectedIndexes = d->uiWidget.listViewWmsLayers->selectionModel()->selectedIndexes();
860 for (
auto selectedIndex : selectedIndexes) {
861 selectedList << d->sortModel->
data(selectedIndex, layerIdRole).toString();
863 d->selectedLayers = selectedList;
865 QString tileMatrixSet = d->uiWidget.comboBoxWmsMaps->currentText();
866 QString tileFormat = d->uiWidget.comboBoxWmsFormat->currentText();
867 QString url = d->owsManager.wmtsCapabilities().wmtsTileResource()[d->selectedLayers.first()][tileFormat];
868 QString style = d->owsManager.wmtsCapabilities().style(d->selectedLayers.first());
869 d->owsManager.queryWmtsPreviewImage(url, style, tileMatrixSet);
870 setLayerButtonsVisible(
false);
871 button( MapWizard::NextButton )->setEnabled(
false );
873 else if( d->mapProviderType == MapWizardPrivate::StaticUrlMap )
875 QString urlString = d->uiWidget.comboBoxStaticUrlServer->currentText();
876 d->owsManager.queryXYZPreviewImage(urlString);
877 d->staticUrlServerList.removeAll( urlString );
878 d->staticUrlServerList.
prepend( urlString );
880 d->uiWidget.lineEditTitle->
clear();
881 d->uiWidget.lineEditTheme->clear();
882 d->uiWidget.textEditDesc->clear();
883 d->uiWidget.labelPreview->clear();
884 d->uiWidget.lineEditTitle->setFocus();
885 button( MapWizard::NextButton )->setEnabled(
false );
890 if ( currentId() == GlobalSourceImagePage ) {
891 d->sourceImage = d->uiWidget.lineEditSource->text();
892 if ( d->sourceImage.isEmpty() ) {
894 tr(
"Source Image" ),
895 tr(
"Please specify a source image." ) );
896 d->uiWidget.lineEditSource->setFocus();
902 tr(
"Source Image" ),
903 tr(
"The source image you specified does not exist. Please specify a different one." ) );
904 d->uiWidget.lineEditSource->setFocus();
905 d->uiWidget.lineEditSource->selectAll();
911 tr(
"Source Image" ),
912 tr(
"The source image you specified does not seem to be an image. Please specify a different image file." ) );
913 d->uiWidget.lineEditSource->setFocus();
914 d->uiWidget.lineEditSource->selectAll();
918 d->uiWidget.lineEditTitle->clear();
919 d->uiWidget.lineEditTheme->clear();
920 d->uiWidget.textEditDesc->clear();
921 d->uiWidget.labelPreview->clear();
924 d->uiWidget.labelPreview->setPixmap( previewPixmap );
925 d->uiWidget.labelPreview->resize(
QSize(100, 100) );
926 d->uiWidget.labelThumbnail->setPixmap( previewPixmap );
927 d->uiWidget.labelThumbnail->resize(
QSize(100, 100) );
930 if ( currentId() == ThemeInfoPage ) {
931 if( d->mapProviderType == MapWizardPrivate::WmsMap && !d->m_legendImageValid )
933 QString legendUrl = d->owsManager.wmsCapabilities().legendUrl(d->selectedLayers.first());
935 d->m_legendImageValid =
true;
936 d->owsManager.queryWmsLegendImage(
QUrl(legendUrl));
937 button( MapWizard::NextButton )->setEnabled(
false );
941 if ( d->uiWidget.lineEditTitle->text().isEmpty() ) {
943 d->uiWidget.lineEditTitle->setFocus();
947 d->mapTheme = d->uiWidget.lineEditTheme->text();
948 if ( d->mapTheme.isEmpty() ) {
950 d->uiWidget.lineEditTheme->setFocus();
954 const QDir destinationDir(
QString(
"%1/maps/earth/%2" ).arg( MarbleDirs::localPath(), d->mapTheme ) );
955 if ( destinationDir.exists() ) {
958 tr(
"Please specify another map name, since there is already a map named \"%1\"." ).arg( d->mapTheme ) );
959 d->uiWidget.lineEditTheme->setFocus();
960 d->uiWidget.lineEditTheme->selectAll();
964 if ( d->previewImage.isNull() ) {
966 d->uiWidget.pushButtonPreview->setFocus();
970 if (currentId() == LegendPage && !d->m_levelZeroTileValid
971 && d->mapProviderType != MapWizardPrivate::StaticImageMap ) {
972 if( d->mapProviderType == MapWizardPrivate::WmsMap )
975 if (d->uiWidget.comboBoxWmsMaps->currentText() == tr(
"Equirectangular (epsg:4326)"))
976 projection =
"epsg:4326";
977 else if (d->uiWidget.comboBoxWmsMaps->currentText() == tr(
"Equirectangular (crs:84)"))
978 projection =
"crs:84";
980 projection =
"epsg:3857";
981 d->selectedProjection = projection;
982 QString format = d->uiWidget.comboBoxWmsFormat->currentText();
983 QStringList styles = d->owsManager.wmsCapabilities().styles(d->selectedLayers);
984 d->owsManager.queryWmsLevelZeroTile(
QUrl(d->uiWidget.lineEditWmsUrl->text()),
985 d->selectedLayers.first(), projection, format, styles.
first());
987 else if( d->mapProviderType == MapWizardPrivate::WmtsMap)
990 QModelIndexList selectedIndexes = d->uiWidget.listViewWmsLayers->selectionModel()->selectedIndexes();
991 for (
auto selectedIndex : selectedIndexes) {
992 selectedList << d->sortModel->
data(selectedIndex, layerIdRole).toString();
994 d->selectedLayers = selectedList;
996 QString tileMatrixSet = d->uiWidget.comboBoxWmsMaps->currentText();
997 QString tileFormat = d->uiWidget.comboBoxWmsFormat->currentText();
998 QString url = d->owsManager.wmtsCapabilities().wmtsTileResource()[d->selectedLayers.first()][tileFormat];
999 QString style = d->owsManager.wmtsCapabilities().style(d->selectedLayers.first());
1000 d->owsManager.queryWmtsLevelZeroTile(url, style, tileMatrixSet);
1002 else if( d->mapProviderType == MapWizardPrivate::StaticUrlMap )
1004 QString urlString = d->uiWidget.comboBoxStaticUrlServer->currentText();
1005 d->owsManager.queryXYZLevelZeroTile(urlString);
1007 button( MapWizard::NextButton )->setEnabled(
false );
1014int MapWizard::nextId()
const
1016 switch( currentId() )
1019 if( d->uiWidget.radioButtonWms->isChecked() ) {
1020 d->mapProviderType = MapWizardPrivate::WmsMap;
1021 return WmsSelectionPage;
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;
1035 case WmsSelectionPage:
1036 return LayerSelectionPage;
1038 case LayerSelectionPage:
1039 return ThemeInfoPage;
1041 case GlobalSourceImagePage:
1042 return ThemeInfoPage;
1057 return currentId() + 1;
1060void MapWizard::cleanupPage(
int id)
1062 if ( d->mapProviderType == MapWizardPrivate::StaticUrlMap ) {
1063 if (
id == ThemeInfoPage) {
1064 d->levelZero.clear();
1071GeoSceneDocument* MapWizard::createDocument()
1073 GeoSceneDocument *document =
new GeoSceneDocument;
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 );
1082 GeoSceneIcon *icon = head->icon();
1083 icon->setPixmap(
QString(
"%1-preview.png").arg(document->head()->theme()) );
1085 GeoSceneZoom *
zoom = head->zoom();
1086 zoom->setMinimum( 900 );
1087 zoom->setMaximum( 3500 );
1088 zoom->setDiscrete(
false );
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);
1112 GeoSceneTileDataset *texture =
new GeoSceneTileDataset(
"map" );
1113 texture->setExpire( 31536000 );
1114 texture->setSourceDir(
QLatin1String(
"earth/") + document->head()->theme());
1115 if( d->mapProviderType == MapWizardPrivate::WmsMap )
1117 texture->setFileFormat( d->owsManager.resultFormat() );
1118 QStringList styles = d->owsManager.wmsCapabilities().styles(d->selectedLayers);
1119 QUrl downloadUrl =
QUrl( d->uiWidget.lineEditWmsUrl->text() );
1121 urlQuery.
addQueryItem(
"layers", d->selectedLayers.join(
',') );
1123 bool isBackdropAvailable = d->uiWidget.checkBoxWmsBackdrop->isEnabled()
1124 && d->uiWidget.checkBoxWmsBackdrop->isChecked();
1125 urlQuery.
addQueryItem(
"transparent", isBackdropTextureAvailable ?
"true" :
"false" );
1127 if (d->uiWidget.checkBoxWmsBackdrop->isChecked() && d->uiWidget.radioButtonColor->isChecked()) {
1129 bgColorName = bgColorName.
remove(
"#");
1130 bgColorName =
"0x" + bgColorName;
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);
1144 texture->setTileProjection(GeoSceneAbstractTileProjection::Equirectangular);
1146 if (isBackdropAvailable) {
1147 texture->setBlending(
"AlphaBlending");
1150 if( d->mapProviderType == MapWizardPrivate::WmtsMap )
1152 QString format = d->uiWidget.comboBoxWmsFormat->currentText();
1153 texture->setFileFormat( format );
1155 QString urlString = d->owsManager.wmtsCapabilities().wmtsTileResource()[selectedLayer][format];
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);
1172 else if( d->mapProviderType == MapWizardPrivate::StaticUrlMap )
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);
1187 else if( d->mapProviderType == MapWizardPrivate::StaticImageMap )
1189 QString image = d->uiWidget.lineEditSource->text();
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);
1196 int tileSize = c_defaultTileSize;
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 );
1203 maxTileLevel =
static_cast<int>( approxMaxTileLevel + 1 );
1205 texture->setMaximumTileLevel( maxTileLevel );
1208 GeoSceneLayer *layer =
new GeoSceneLayer( d->uiWidget.lineEditTheme->text() );
1209 layer->setBackend(
"texture" );
1210 layer->addDataset( backdropTexture );
1211 layer->addDataset( texture );
1213 GeoSceneLayer* secondLayer =
new GeoSceneLayer(
"standardplaces" );
1214 secondLayer->setBackend(
"geodata" );
1216 GeoSceneGeodata* cityplacemarks =
new GeoSceneGeodata(
"cityplacemarks" );
1217 cityplacemarks->setSourceFile(
"cityplacemarks.kml" );
1218 secondLayer->addDataset( cityplacemarks );
1220 GeoSceneGeodata* baseplacemarks =
new GeoSceneGeodata(
"baseplacemarks" );
1221 baseplacemarks->setSourceFile(
"baseplacemarks.kml" );
1222 secondLayer->addDataset( baseplacemarks );
1224 GeoSceneGeodata* elevplacemarks =
new GeoSceneGeodata(
"elevplacemarks" );
1225 elevplacemarks->setSourceFile(
"elevplacemarks.kml" );
1226 secondLayer->addDataset( elevplacemarks );
1228 GeoSceneGeodata* observatoryplacemarks =
new GeoSceneGeodata(
"observatoryplacemarks" );
1229 observatoryplacemarks->setSourceFile(
"observatoryplacemarks.kml" );
1230 secondLayer->addDataset( observatoryplacemarks );
1232 GeoSceneGeodata* otherplacemarks =
new GeoSceneGeodata(
"otherplacemarks" );
1233 otherplacemarks->setSourceFile(
"otherplacemarks.kml" );
1234 secondLayer->addDataset( otherplacemarks );
1236 GeoSceneGeodata* boundaryplacemarks =
new GeoSceneGeodata(
"boundaryplacemarks" );
1237 boundaryplacemarks->setSourceFile(
"boundaryplacemarks.kml" );
1238 secondLayer->addDataset( boundaryplacemarks );
1240 GeoSceneMap *
map = document->map();
1242 if( d->mapProviderType == MapWizardPrivate::WmsMap )
1245 bbox = d->owsManager.wmsCapabilities().boundingBoxNSEWDegrees(d->selectedLayers, d->selectedProjection);
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);
1254 map->addLayer( layer );
1255 map->addLayer( secondLayer );
1257 GeoSceneSettings *settings = document->settings();
1414 GeoSceneProperty *overviewmap =
new GeoSceneProperty(
"overviewmap" );
1415 overviewmap->setDefaultValue(
true );
1416 overviewmap->setAvailable(
true );
1417 settings->addProperty( overviewmap );
1419 GeoSceneProperty *compass =
new GeoSceneProperty(
"compass" );
1420 compass->setDefaultValue(
true );
1421 compass->setAvailable(
true );
1422 settings->addProperty( compass );
1424 GeoSceneProperty *scalebar =
new GeoSceneProperty(
"scalebar" );
1425 scalebar->setDefaultValue(
true );
1426 scalebar->setAvailable(
true );
1427 settings->addProperty( scalebar );
1432void MapWizard::accept()
1434 Q_ASSERT( d->mapProviderType != MapWizardPrivate::NoMap );
1436 Q_ASSERT( d->format == d->format.toLower() );
1437 Q_ASSERT( !d->mapTheme.isEmpty() );
1439 if ( d->mapProviderType == MapWizardPrivate::StaticImageMap )
1441 d->sourceImage = d->uiWidget.lineEditSource->text();
1442 Q_ASSERT( !d->sourceImage.isEmpty() );
1445 else if ( d->mapProviderType == MapWizardPrivate::WmsMap )
1447 Q_ASSERT( !d->owsManager.wmsCapabilities().layers().isEmpty() );
1448 Q_ASSERT( !d->levelZero.isNull() );
1450 else if ( d->mapProviderType == MapWizardPrivate::WmtsMap )
1452 Q_ASSERT( !d->owsManager.wmtsCapabilities().layers().isEmpty() );
1453 Q_ASSERT( !d->levelZero.isNull() );
1455 else if ( d->mapProviderType == MapWizardPrivate::StaticUrlMap )
1457 Q_ASSERT( !d->levelZero.isNull() );
1462 Q_ASSERT( !document->head()->description().isEmpty() );
1463 Q_ASSERT( !document->head()->name().isEmpty() );
1465 if( createFiles( document.data() ) )
1467 if( d->mapProviderType == MapWizardPrivate::WmsMap )
1469 if( !d->owsManager.wmsCapabilities().legendUrl(d->sortModel->data(d->uiWidget.listViewWmsLayers->currentIndex(), layerIdRole).toString()).isEmpty() )
1473 }
else if( d->mapProviderType == MapWizardPrivate::StaticImageMap || d->mapProviderType == MapWizardPrivate::StaticUrlMap ) {
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();
1488 QMessageBox::critical(
this, tr(
"Problem while creating files" ), tr(
"Check if a theme with the same name exists." ) );
1493void MapWizard::showPreview()
1497 if( createFiles( document.data() ) )
1499 if( d->mapProviderType == MapWizardPrivate::WmsMap )
1501 if( !d->owsManager.wmsCapabilities().legendUrl(d->sortModel->data(d->uiWidget.listViewWmsLayers->currentIndex(), layerIdRole).toString()).isEmpty() )
1505 }
else if( d->mapProviderType == MapWizardPrivate::StaticImageMap || d->mapProviderType == MapWizardPrivate::StaticUrlMap ) {
1511 previewDialog->exec();
1512 delete previewDialog;
1515void MapWizard::updateSearchFilter(
const QString &text)
1517 d->sortModel->setFilterFixedString(text);
1520void MapWizard::updateListViewSelection()
1523 d->uiWidget.checkBoxWmsMultipleSelections->isChecked()
1527 d->owsManager.owsServiceType() == WmtsType
1530 d->uiWidget.listViewWmsLayers->setSelectionMode(selectionMode);
1531 d->uiWidget.checkBoxWmsMultipleSelections->setVisible(d->uiWidget.radioButtonWms->isChecked());
1534void MapWizard::updateBackdropCheckBox()
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());
1542void MapWizard::updateOwsServiceType()
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" ) );
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" ) );
1561 else if (d->uiWidget.radioButtonStaticUrl->isChecked()) {
1562 d->uiWidget.comboBoxStaticUrlServer->clear();
1563 d->uiWidget.comboBoxStaticUrlServer->addItems( d->staticUrlServerList );
1569void MapWizard::chooseBackgroundColor()
1572 if (selectedColor.
isValid()) {
1573 d->uiWidget.labelBackgroundColor->setText(selectedColor.
name());
1574 QPalette p = d->uiWidget.labelBackgroundColor->palette();
1576 d->uiWidget.labelBackgroundColor->setPalette(p);
1583#include "moc_MapWizard.cpp"
1584#include "MapWizard.moc"
This file contains the header for MapWizard.
This file contains the header for MarbleNavigator.
Capabilities capabilities()
QAction * restart(const QObject *recvr, const char *slot, QObject *parent)
QString path(const QString &relativePath)
KIOCORE_EXPORT QString dir(const QString &fileClass)
QAction * zoom(const QObject *recvr, const char *slot, QObject *parent)
const QList< QKeySequence > & zoomIn()
const QList< QKeySequence > & zoomOut()
const QList< QKeySequence > & next()
Binds a QML item to a specific geodetic location in screen coordinates.
void pressed(const QModelIndex &index)
bool isEnabled() const const
void stateChanged(int state)
bool isValid() const const
QString name(NameFormat format) const const
QColor getColor(const QColor &initial, QWidget *parent, const QString &title, ColorDialogOptions options)
virtual void closeEvent(QCloseEvent *e) override
QString absolutePath() const const
bool cd(const QString &dirName)
QStringList entryList(Filters filters, SortFlags sort) const const
bool copy(const QString &fileName, const QString &newName)
bool exists(const QString &fileName)
bool exists() const const
void setFileName(const QString &name)
QString getOpenFileName(QWidget *parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedFilter, Options options)
bool exists() const const
virtual void setSpacing(int spacing) override
QImage fromData(QByteArrayView data, const char *format)
bool isNull() const const
QImage scaled(const QSize &size, Qt::AspectRatioMode aspectRatioMode, Qt::TransformationMode transformMode) const const
void setText(const QString &)
void textChanged(const QString &text)
void append(QList< T > &&value)
const_reference at(qsizetype i) const const
bool isEmpty() const const
StandardButton critical(QWidget *parent, const QString &title, const QString &text, StandardButtons buttons, StandardButton defaultButton)
QObject * parent() const const
void setColor(ColorGroup group, ColorRole role, const QColor &color)
QPixmap fromImage(QImage &&image, Qt::ImageConversionFlags flags)
int execute(const QString &program, const QStringList &arguments)
bool waitForFinished(int msecs)
void setFilterCaseSensitivity(Qt::CaseSensitivity cs)
virtual void setSourceModel(QAbstractItemModel *sourceModel) override
virtual void setData(const QVariant &value, int role)
QString arg(Args &&... args) const const
QString first(qsizetype n) const const
qsizetype indexOf(QChar ch, qsizetype from, Qt::CaseSensitivity cs) const const
bool isEmpty() const const
qsizetype lastIndexOf(QChar ch, Qt::CaseSensitivity cs) const const
QString left(qsizetype n) const const
qsizetype length() const const
QString & prepend(QChar ch)
QString & remove(QChar ch, Qt::CaseSensitivity cs)
QString & replace(QChar before, QChar after, Qt::CaseSensitivity cs)
QString right(qsizetype n) const const
QStringList split(QChar sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) const const
QByteArray toLatin1() const const
QString toLower() const const
QString join(QChar separator) const const
QFuture< void > map(Iterator begin, Iterator end, MapFunctor &&function)
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)
void setQuery(const QString &query, ParsingMode mode)
void addQueryItem(const QString &key, const QString &value)
virtual void cleanupPage(int id)
virtual bool validateCurrentPage()