• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

marble

  • sources
  • kde-4.14
  • kdeedu
  • marble
  • src
  • lib
  • marble
MapWizard.cpp
Go to the documentation of this file.
1 //
2 // This file is part of the Marble Virtual Globe.
3 //
4 // This program is free software licensed under the GNU LGPL. You can
5 // find a copy of this license in LICENSE.txt in the top directory of
6 // the source code.
7 //
8 // Copyright 2011 Utku Aydın <utkuaydin34@gmail.com>
9 //
10 
11 #include "MapWizard.h"
12 #include "ui_MapWizard.h"
13 
14 #include "MarbleGlobal.h"
15 #include "MarbleDirs.h"
16 #include "MarbleDebug.h"
17 #include "ServerLayout.h"
18 #include "GeoSceneDocument.h"
19 #include "GeoSceneHead.h"
20 #include "GeoSceneIcon.h"
21 #include "GeoSceneZoom.h"
22 #include "GeoSceneMap.h"
23 #include "GeoSceneLayer.h"
24 #include "GeoSceneTiled.h"
25 #include "GeoSceneSettings.h"
26 #include "GeoSceneProperty.h"
27 #include "GeoSceneGeodata.h"
28 #include "GeoSceneLegend.h"
29 #include "GeoSceneSection.h"
30 #include "GeoSceneItem.h"
31 #include "GeoSceneVector.h"
32 #include "GeoWriter.h"
33 #include "DgmlElementDictionary.h"
34 #include "MarbleWidget.h"
35 #include "MarbleNavigator.h"
36 
37 #include <QBuffer>
38 #include <QDir>
39 #include <QFile>
40 #include <QProcess>
41 #include <QSharedPointer>
42 #include <QTimer>
43 #include <QTemporaryFile>
44 #include <QPixmap>
45 #include <QMessageBox>
46 #include <QFileDialog>
47 #include <QImageReader>
48 #include <QDialogButtonBox>
49 #include <QNetworkAccessManager>
50 #include <QNetworkReply>
51 #include <QNetworkRequest>
52 #include <QDomElement>
53 #include <QXmlStreamWriter>
54 #if QT_VERSION >= 0x050000
55  #include <QUrlQuery>
56 #endif
57 
58 namespace Marble
59 {
60 
61 class MapWizardPrivate
62 {
63 public:
64  MapWizardPrivate()
65  : m_serverCapabilitiesValid( false ),
66  mapProviderType()
67  {}
68 
69  void pageEntered( int id );
70 
71  Ui::MapWizard uiWidget;
72 
73  QString mapTheme;
74 
75  QNetworkAccessManager xmlAccessManager;
76  QNetworkAccessManager legendAccessManager;
77  QNetworkAccessManager levelZeroAccessManager;
78  QStringList wmsServerList;
79  QMap<QString, QString> wmsFetchedMaps;
80  QStringList staticUrlServerList;
81  bool m_serverCapabilitiesValid;
82 
83  enum mapType
84  {
85  NoMap,
86  StaticImageMap,
87  WmsMap,
88  StaticUrlMap
89  };
90 
91  mapType mapProviderType;
92  QByteArray levelZero;
93  QImage previewImage;
94 
95  QString format;
96 
97  QStringList wmsLegends;
98 
99  QString sourceImage;
100 };
101 
102 class PreviewDialog : public QDialog
103 {
104 public:
105  PreviewDialog( QWidget* parent, QString mapThemeId );
106  virtual void closeEvent(QCloseEvent* e );
107 private:
108  bool deleteTheme( QString directory );
109  QString m_mapThemeId;
110 };
111 
112 PreviewDialog::PreviewDialog( QWidget* parent, QString mapThemeId ) : QDialog( parent ), m_mapThemeId( mapThemeId )
113 {
114  QGridLayout *layout = new QGridLayout();
115  MarbleWidget *widget = new MarbleWidget();
116  MarbleNavigator *navigator = new MarbleNavigator();
117 
118  connect( navigator, SIGNAL(goHome()), widget, SLOT(goHome()) );
119  connect( navigator, SIGNAL(moveUp()), widget, SLOT(moveUp()) );
120  connect( navigator, SIGNAL(moveDown()), widget, SLOT(moveDown()) );
121  connect( navigator, SIGNAL(moveLeft()), widget, SLOT(moveLeft()) );
122  connect( navigator, SIGNAL(moveRight()), widget, SLOT(moveRight()) );
123  connect( navigator, SIGNAL(zoomIn()), widget, SLOT(zoomIn()) );
124  connect( navigator, SIGNAL(zoomOut()), widget, SLOT(zoomOut()) );
125  connect( navigator, SIGNAL(zoomChanged(int)), widget, SLOT(setZoom(int)) );
126 
127  widget->setMapThemeId( m_mapThemeId );
128  widget->setZoom( 1000 );
129 
130  layout->addWidget( navigator, 1, 1 );
131  layout->addWidget( widget, 1, 2 );
132  layout->setMargin( 0 );
133  layout->setSpacing( 0 );
134 
135  this->setLayout( layout );
136  this->setMinimumSize( 640, 480 );
137  this->setWindowTitle( tr( "Preview Map" ) );
138 }
139 
140 void PreviewDialog::closeEvent(QCloseEvent* e)
141 {
142  QString dgmlPath = MarbleDirs::localPath() + "/maps/" + m_mapThemeId;
143  QString directory = dgmlPath.left( dgmlPath.lastIndexOf("/") );
144  this->deleteTheme( directory );
145  QDialog::closeEvent( e );
146 }
147 
148 bool PreviewDialog::deleteTheme( QString directory )
149 {
150  QDir dir(directory);
151  bool result = true;
152 
153  if (dir.exists(directory)) {
154  Q_FOREACH(QFileInfo info, dir.entryInfoList(QDir::NoDotAndDotDot | QDir::System | QDir::Hidden | QDir::AllDirs | QDir::Files, QDir::DirsFirst)) {
155  if (info.isDir()) {
156  result = deleteTheme(info.absoluteFilePath());
157  } else {
158  result = QFile::remove(info.absoluteFilePath());
159  }
160 
161  if (!result) {
162  return result;
163  }
164  }
165  result = dir.rmdir(directory);
166  }
167 
168  return result;
169 }
170 
171 void MapWizardPrivate::pageEntered( int id )
172 {
173  if ( id == 1 ) {
174  m_serverCapabilitiesValid = false;
175  } else if ( id == 2 || id == 4 ) {
176  levelZero.clear();
177  uiWidget.comboBoxStaticUrlServer->clear();
178  uiWidget.comboBoxStaticUrlServer->addItems( staticUrlServerList );
179  uiWidget.comboBoxStaticUrlServer->addItem( "http://" );
180  } else if ( id == 5 ) {
181  if ( mapProviderType == MapWizardPrivate::StaticImageMap ) {
182  previewImage = QImage( uiWidget.lineEditSource->text() ).scaled( 136, 136, Qt::IgnoreAspectRatio, Qt::SmoothTransformation );
183  } else {
184  previewImage = QImage::fromData( levelZero ).scaled( 136, 136, Qt::IgnoreAspectRatio, Qt::SmoothTransformation );
185  }
186  uiWidget.labelPreview->setPixmap( QPixmap::fromImage( previewImage ) );
187  } else if ( id == 7 ) {
188  uiWidget.labelThumbnail->setPixmap( QPixmap::fromImage( previewImage ) );
189  }
190 }
191 
192 MapWizard::MapWizard( QWidget* parent ) : QWizard( parent ), d( new MapWizardPrivate )
193 {
194  d->uiWidget.setupUi( this );
195 
196  connect( this, SIGNAL(currentIdChanged(int)), this, SLOT(pageEntered(int)) );
197 
198  connect( &( d->xmlAccessManager ), SIGNAL(finished(QNetworkReply*)), this, SLOT(parseServerCapabilities(QNetworkReply*)) );
199  connect( &( d->legendAccessManager ), SIGNAL(finished(QNetworkReply*)), this, SLOT(createWmsLegend(QNetworkReply*)) );
200  connect( &( d->levelZeroAccessManager ), SIGNAL(finished(QNetworkReply*)), this, SLOT(createLevelZero(QNetworkReply*)) );
201 
202  connect( d->uiWidget.pushButtonSource, SIGNAL(clicked(bool)), this, SLOT(querySourceImage()) );
203  connect( d->uiWidget.pushButtonPreview, SIGNAL(clicked(bool)), this, SLOT(queryPreviewImage()) );
204  connect( d->uiWidget.pushButtonLegend_2, SIGNAL(clicked(bool)), this, SLOT(queryLegendImage()) );
205 
206  connect( d->uiWidget.comboBoxWmsServer, SIGNAL(currentIndexChanged(QString)), d->uiWidget.lineEditWmsUrl, SLOT(setText(QString)) );
207  connect( d->uiWidget.listWidgetWmsMaps, SIGNAL(itemSelectionChanged()), this, SLOT(autoFillDetails()) );
208 
209  connect( d->uiWidget.lineEditTitle, SIGNAL(textChanged(QString)), d->uiWidget.labelSumMName, SLOT(setText(QString)) );
210  connect( d->uiWidget.lineEditTheme, SIGNAL(textChanged(QString)), d->uiWidget.labelSumMTheme, SLOT(setText(QString)) );
211 
212  connect( d->uiWidget.pushButtonPreviewMap, SIGNAL(clicked(bool)), this, SLOT(showPreview()) );
213 
214 }
215 
216 MapWizard::~MapWizard()
217 {
218  delete d;
219 }
220 
221 void MapWizard::queryServerCapabilities()
222 {
223  QUrl url( d->uiWidget.lineEditWmsUrl->text() );
224 #if QT_VERSION < 0x050000
225  url.addQueryItem( "service", "WMS" );
226  url.addQueryItem( "request", "GetCapabilities" );
227 #else
228  QUrlQuery urlQuery;
229  urlQuery.addQueryItem( "service", "WMS" );
230  urlQuery.addQueryItem( "request", "GetCapabilities" );
231  url.setQuery(urlQuery);
232 #endif
233 
234  QNetworkRequest request;
235  request.setUrl( url );
236 
237  d->xmlAccessManager.get( request );
238 }
239 
240 void MapWizard::parseServerCapabilities( QNetworkReply* reply )
241 {
242  button( MapWizard::NextButton )->setEnabled( true );
243 
244  QString result( reply->readAll() );
245  QDomDocument xml;
246  if( !xml.setContent( result ) )
247  {
248  QMessageBox::critical( this, tr( "Error while parsing" ), tr( "Wizard cannot parse server's response" ) );
249  return;
250  }
251 
252  if( xml.documentElement().firstChildElement().tagName().isNull() )
253  {
254  QMessageBox::critical( this, tr( "Error while parsing" ), tr( "Server is not a Web Map Server." ) );
255  return;
256  }
257 
258  QDomElement firstLayer = xml.documentElement().firstChildElement( "Capability" ).firstChildElement( "Layer" );
259  QDomNodeList layers = firstLayer.elementsByTagName( "Layer" );
260 
261  d->uiWidget.listWidgetWmsMaps->clear();
262  d->wmsFetchedMaps.clear();
263 
264  for( int i = 0; i < layers.size(); ++i )
265  {
266  QString theme = layers.at( i ).firstChildElement( "Name" ).text();
267  QString title = layers.at( i ).firstChildElement( "Title" ).text();
268  QDomElement legendUrl = layers.at( i ).firstChildElement( "Style" ).firstChildElement( "LegendURL" );
269  d->wmsFetchedMaps[ theme ] = title;
270 
271  d->wmsLegends.clear();
272  if( legendUrl.isNull() ) {
273  d->wmsLegends.append( QString() );
274  } else {
275  d->wmsLegends.append( legendUrl.firstChildElement( "OnlineResource" ).attribute( "xlink:href" ) );
276  }
277  }
278 
279  d->uiWidget.listWidgetWmsMaps->addItems( d->wmsFetchedMaps.values() );
280 
281  QDomElement format = xml.documentElement().firstChildElement( "Capability" ).firstChildElement( "Request" )
282  .firstChildElement( "GetMap" ).firstChildElement( "Format" );
283 
284  d->format = format.text().right( format.text().length() - format.text().indexOf( '/' ) - 1 ).toLower();
285 
286  if( d->format == "jpeg" ) {
287  d->format = "jpg";
288  }
289 
290  if( !d->wmsFetchedMaps.isEmpty() && !d->wmsServerList.contains( d->uiWidget.lineEditWmsUrl->text() ) ) {
291  d->wmsServerList.append( d->uiWidget.lineEditWmsUrl->text() );
292  setWmsServers( d->wmsServerList );
293  }
294 
295  d->m_serverCapabilitiesValid = true;
296  next();
297 }
298 
299 void MapWizard::createWmsLegend( QNetworkReply* reply )
300 {
301  QByteArray result( reply->readAll() );
302  QDir map( QString( "%1/maps/earth/%2" ).arg( MarbleDirs::localPath() ).arg( d->mapTheme ) );
303  if( !map.exists( "legend" ) ) {
304  map.mkdir( "legend" );
305  }
306 
307  QFile image( QString( "%1/legend/legend.png" ).arg( map.absolutePath() ) );
308  image.open( QIODevice::ReadWrite );
309  image.write( result );
310  image.close();
311 
312  const QString legendHtml = createLegendHtml();
313  createLegendFile( legendHtml );
314 }
315 
316 void MapWizard::setWmsServers( const QStringList& uris )
317 {
318  d->wmsServerList = uris;
319 
320  d->uiWidget.comboBoxWmsServer->clear();
321  d->uiWidget.comboBoxWmsServer->addItems( d->wmsServerList );
322  d->uiWidget.comboBoxWmsServer->addItem( tr( "Custom" ), "http://" );
323 }
324 
325 QStringList MapWizard::wmsServers() const
326 {
327  return d->wmsServerList;
328 }
329 
330 QStringList MapWizard::staticUrlServers() const
331 {
332  return d->staticUrlServerList;
333 }
334 
335 void MapWizard::setStaticUrlServers( const QStringList& uris )
336 {
337  d->staticUrlServerList = uris;
338 }
339 
340 void MapWizard::autoFillDetails()
341 {
342  QString selected = d->uiWidget.listWidgetWmsMaps->currentItem()->text();
343  d->uiWidget.lineEditTitle->setText( selected );
344  d->uiWidget.lineEditTheme->setText( d->wmsFetchedMaps.key( selected ) );
345 }
346 
347 bool MapWizard::createFiles( const GeoSceneDocument* document )
348 {
349  // Create directories
350  QDir maps( MarbleDirs::localPath() + "/maps/earth/" );
351  if( !maps.exists( document->head()->theme() ) )
352  {
353  maps.mkdir( document->head()->theme() );
354 
355  if( d->mapProviderType == MapWizardPrivate::StaticImageMap )
356  {
357  // Source image
358  QFile sourceImage( d->sourceImage );
359  d->format = d->sourceImage.right( d->sourceImage.length() - d->sourceImage.lastIndexOf( '.' ) - 1 ).toLower();
360  sourceImage.copy( QString( "%1/%2/%2.%3" ).arg( maps.absolutePath() )
361  .arg( document->head()->theme() )
362  .arg( d->format ) );
363  }
364 
365  else if( d->mapProviderType == MapWizardPrivate::WmsMap )
366  {
367  maps.mkdir( QString( "%1/0/" ).arg( document->head()->theme() ) );
368  maps.mkdir( QString( "%1/0/0" ).arg( document->head()->theme() ) );
369  const QString path = QString( "%1/%2/0/0/0.%3" ).arg( maps.absolutePath() )
370  .arg( document->head()->theme() )
371  .arg( d->format );
372  QFile baseTile( path );
373  baseTile.open( QFile::WriteOnly );
374  baseTile.write( d->levelZero );
375  }
376 
377  else if( d->mapProviderType == MapWizardPrivate::StaticUrlMap )
378  {
379  maps.mkdir( QString( "%1/0/" ).arg( document->head()->theme() ) );
380  maps.mkdir( QString( "%1/0/0" ).arg( document->head()->theme() ) );
381  const QString path = QString( "%1/%2/0/0/0.%3" ).arg( maps.absolutePath() )
382  .arg( document->head()->theme() )
383  .arg( d->format );
384  QFile baseTile( path );
385  baseTile.open( QFile::WriteOnly );
386  baseTile.write( d->levelZero );
387  }
388 
389  // Preview image
390  QString pixmapPath = QString( "%1/%2/%3" ).arg( maps.absolutePath() )
391  .arg( document->head()->theme() )
392  .arg( document->head()->icon()->pixmap() );
393  d->previewImage.save( pixmapPath );
394 
395  // DGML
396  QFile file( QString( "%1/%2/%2.dgml" ).arg( maps.absolutePath() )
397  .arg( document->head()->theme() ) );
398  file.open( QIODevice::ReadWrite );
399  GeoWriter geoWriter;
400  geoWriter.setDocumentType( dgml::dgmlTag_nameSpace20 );
401  geoWriter.write( &file, document );
402  file.close();
403 
404  return true;
405  }
406 
407  else
408  return false;
409 }
410 
411 QString MapWizard::createLegendHtml( const QString& image )
412 {
413  QString htmlOutput;
414  QXmlStreamWriter stream( &htmlOutput );
415  stream.writeStartDocument();
416  stream.writeStartElement( "html" );
417  stream.writeStartElement( "head" );
418 
419  stream.writeTextElement( "title", "Marble: Legend" );
420  stream.writeStartElement( "link" );
421  stream.writeAttribute( "href", "legend.css" );
422  stream.writeAttribute( "rel", "stylesheet" );
423  stream.writeAttribute( "type", "text/css" );
424  stream.writeEndElement();
425 
426  stream.writeStartElement( "body" );
427  stream.writeStartElement( "img" );
428  stream.writeAttribute( "src", image );
429  stream.writeEndElement();
430  stream.writeComment( " ##customLegendEntries:all## " );
431  stream.writeEndElement();
432  stream.writeEndElement();
433 
434  return htmlOutput;
435 }
436 
437 void MapWizard::createLegendFile( const QString& legendHtml )
438 {
439  QDir map( QString( "%1/maps/earth/%2" ).arg( MarbleDirs::localPath() ).arg( d->mapTheme ) );
440 
441  QFile html( QString( "%1/legend.html" ).arg( map.absolutePath() ) );
442  html.open( QIODevice::ReadWrite );
443  html.write( legendHtml.toLatin1().data() );
444  html.close();
445 }
446 
447 void MapWizard::downloadLegend( const QString& url )
448 {
449  QUrl downloadUrl( url );
450  QNetworkRequest request( downloadUrl );
451  d->legendAccessManager.get( request );
452 }
453 
454 void MapWizard::downloadLevelZero()
455 {
456  if( d->mapProviderType == MapWizardPrivate::WmsMap )
457  {
458  QString selected = d->uiWidget.listWidgetWmsMaps->currentItem()->text();
459 
460 #if QT_VERSION < 0x050000
461  QUrl downloadUrl( d->uiWidget.lineEditWmsUrl->text() );
462 #else
463  QUrl finalDownloadUrl( d->uiWidget.lineEditWmsUrl->text() );
464  QUrlQuery downloadUrl;
465 #endif
466  downloadUrl.addQueryItem( "request", "GetMap" );
467  downloadUrl.addQueryItem( "version", "1.1.1" );
468  downloadUrl.addQueryItem( "layers", d->wmsFetchedMaps.key( selected ) );
469  downloadUrl.addQueryItem( "srs", "EPSG:4326" );
470  downloadUrl.addQueryItem( "width", "400" );
471  downloadUrl.addQueryItem( "height", "200" );
472  downloadUrl.addQueryItem( "bbox", "-180,-90,180,90" );
473  downloadUrl.addQueryItem( "format", "image/jpeg" );
474  downloadUrl.addQueryItem( "styles", "" );
475 
476 #if QT_VERSION < 0x050000
477  QNetworkRequest request( downloadUrl );
478 #else
479  finalDownloadUrl.setQuery( downloadUrl );
480 
481  QNetworkRequest request( finalDownloadUrl );
482 #endif
483 
484  d->levelZeroAccessManager.get( request );
485  }
486 
487  else if( d->mapProviderType == MapWizardPrivate::StaticUrlMap )
488  {
489  QString server = d->uiWidget.comboBoxStaticUrlServer->currentText();
490  QUrl downloadUrl;
491 
492  server.replace( server.indexOf( "{x}" ), 3, QString::number( 0 ) );
493  server.replace( server.indexOf( "{y}" ), 3, QString::number( 0 ) );
494  server.replace( server.indexOf( "{zoomLevel}" ), 11, QString::number( 0 ) );
495  downloadUrl.setUrl( server );
496 
497  QNetworkRequest request( downloadUrl );
498  d->levelZeroAccessManager.get( request );
499  }
500 }
501 
502 void MapWizard::createLevelZero( QNetworkReply* reply )
503 {
504  button( MapWizard::NextButton )->setEnabled( true );
505 
506  d->levelZero = reply->readAll();
507  QImage testImage = QImage::fromData( d->levelZero );
508 
509  if ( d->levelZero.isNull() ) {
510  QMessageBox::information( this,
511  tr( "Base Tile" ),
512  tr( "The base tile could not be downloaded." ) );
513  return;
514  }
515 
516  if ( testImage.isNull() ) {
517  QMessageBox::information( this,
518  tr( "Base Tile" ),
519  tr( "The base tile could not be downloaded successfully. The server replied:\n\n%1" ).arg( QString( d->levelZero ) ) );
520  d->levelZero.clear();
521  return;
522  }
523 
524  QBuffer testBuffer( &d->levelZero );
525  d->format = QImageReader( &testBuffer ).format();
526 
527  if ( d->mapProviderType == MapWizardPrivate::StaticUrlMap ) {
528  const QString url = d->uiWidget.comboBoxStaticUrlServer->currentText();
529  d->staticUrlServerList.removeAll( url );
530  d->staticUrlServerList.prepend( url );
531  }
532 
533  next();
534 }
535 
536 void MapWizard::createLegend()
537 {
538  QDir map( QString( "%1/maps/earth/%2" ).arg( MarbleDirs::localPath() ).arg( d->mapTheme ) );
539  if( !map.exists( "legend" ) ) {
540  map.mkdir( "legend" );
541  }
542 
543  QFile image;
544  image.setFileName( d->uiWidget.lineEditLegend_2->text() );
545  image.copy( QString( "%1/legend/legend.png" ).arg( map.absolutePath() ) );
546 
547  const QString legendHtml = createLegendHtml();
548  createLegendFile( legendHtml );
549 }
550 
551 void MapWizard::querySourceImage()
552 {
553  d->uiWidget.lineEditSource->setText( QFileDialog::getOpenFileName() );
554 }
555 
556 void MapWizard::queryPreviewImage()
557 {
558  QString fileName = QFileDialog::getOpenFileName();
559  d->previewImage = QImage( fileName );
560 
561  QPixmap preview = QPixmap::fromImage( d->previewImage );
562  d->uiWidget.labelThumbnail->setPixmap( preview );
563  d->uiWidget.labelThumbnail->resize( preview.width(), preview.height() );
564 }
565 
566 void MapWizard::queryLegendImage()
567 {
568  QString fileName = QFileDialog::getOpenFileName();
569  d->uiWidget.lineEditLegend_2->setText( fileName );
570  const QString legendHtml = createLegendHtml( d->uiWidget.lineEditLegend_2->text() );
571  d->uiWidget.textBrowserLegend->setHtml( legendHtml );
572 }
573 
574 QString MapWizard::createArchive( QWidget *parent, QString mapId )
575 {
576  QStringList splitMapId( mapId.split(QLatin1Char('/')) );
577  QString body = splitMapId[0];
578  QString theme = splitMapId[1];
579  QDir themeDir;
580 
581  QStringList tarArgs;
582  tarArgs.append( "--create" );
583  tarArgs.append( "--gzip" );
584  tarArgs.append( "--file" );
585  tarArgs.append( QString( "%1/%2.tar.gz" ).arg( QDir::tempPath() ).arg( theme ) );
586  tarArgs.append( "--directory" );
587 
588  if( QFile::exists( QString( "%1/maps/%2" ).arg( MarbleDirs::localPath() ).arg( mapId ) ) )
589  {
590  tarArgs.append( QString( "%1/maps/" ).arg( MarbleDirs::localPath() ) );
591  themeDir.cd( QString( "%1/maps/%2/%3" ).arg( MarbleDirs::localPath() ).arg( body ).arg( theme ) );
592  }
593 
594  else if( QFile::exists( QString( "%1/maps/%2" ).arg( MarbleDirs::systemPath() ).arg( mapId ) ) )
595  {
596  tarArgs.append( QString( "%1/maps/" ).arg( MarbleDirs::systemPath() ) );
597  themeDir.cd( QString( "%1/maps/%2/%3" ).arg( MarbleDirs::systemPath() ).arg( body ).arg( theme ) );
598  }
599 
600  if( QFile::exists( QString( "%1/%2.dgml" ).arg( themeDir.absolutePath() ).arg( theme ) ) )
601  {
602  tarArgs.append( QString( "%1/%2/%2.dgml" ).arg( body ).arg( theme ) );
603  }
604 
605  if( QFile::exists( QString( "%1/legend.html" ).arg( themeDir.absolutePath() ) ) )
606  {
607  tarArgs.append( QString( "%1/%2/legend.html" ).arg( body ).arg( theme ) );
608  }
609 
610  if( QFile::exists( QString( "%1/legend" ).arg( themeDir.absolutePath() ) ) )
611  {
612  tarArgs.append( QString( "%1/%2/legend" ).arg( body ).arg( theme ) );
613  }
614 
615  if( QFile::exists( QString( "%1/0/000000" ).arg( themeDir.absolutePath() ) ) )
616  {
617  tarArgs.append( QString( "%1/%2/0/000000" ).arg( body ).arg( theme ) );
618  }
619 
620  QStringList previewFilters;
621  previewFilters << "preview.*";
622  QStringList preview = themeDir.entryList( previewFilters );
623  if( !preview.isEmpty() ) {
624  tarArgs.append( QString( "%1/%2/%3" ).arg( body ).arg( theme ).arg( preview[0] ) );
625  }
626 
627  QStringList sourceImgFilters;
628  sourceImgFilters << QString( "%1.jpg" ).arg( theme ) << QString( "%1.png" ).arg( theme ) << QString( "%1.jpeg" ).arg( theme );
629  QStringList sourceImg = themeDir.entryList( sourceImgFilters );
630  if( !sourceImg.isEmpty() ) {
631  tarArgs.append( QString( "%1/%2/%3" ).arg( body ).arg( theme ).arg( sourceImg[0] ) );
632  }
633 
634  QProcess archiver;
635  switch( archiver.execute( "tar", tarArgs ) )
636  {
637  case -2:
638  QMessageBox::critical( parent, tr( "Archiving failed" ), tr( "Archiving process cannot be started." ) );
639  break;
640  case -1:
641  QMessageBox::critical( parent, tr( "Archiving failed" ), tr( "Archiving process crashed." ) );
642  break;
643  case 0:
644  mDebug() << "Archived the theme successfully.";
645  break;
646  }
647  archiver.waitForFinished();
648  return QString( "%1/%2.tar.gz" ).arg( QDir::tempPath() ).arg( theme );
649 }
650 
651 void MapWizard::deleteArchive( QString mapId )
652 {
653  QStringList splitMapId( mapId.split(QLatin1Char('/')) );
654  QString theme = splitMapId[1];
655  QFile::remove( QString( "%1/%2.tar.gz" ).arg( QDir::tempPath() ).arg( theme ) );
656 }
657 
658 bool MapWizard::validateCurrentPage()
659 {
660  if ( currentId() == 1 && !d->m_serverCapabilitiesValid ) {
661  queryServerCapabilities();
662  button( MapWizard::NextButton )->setEnabled( false );
663  return false;
664  }
665 
666  if ( ( currentId() == 2 || currentId() == 4 ) && d->levelZero.isNull() ) {
667  downloadLevelZero();
668  button( MapWizard::NextButton )->setEnabled( false );
669  return false;
670  }
671 
672  if ( currentId() == 3 ) {
673  d->sourceImage = d->uiWidget.lineEditSource->text();
674  if ( d->sourceImage.isEmpty() ) {
675  QMessageBox::information( this,
676  tr( "Source Image" ),
677  tr( "Please specify a source image." ) );
678  d->uiWidget.lineEditSource->setFocus();
679  return false;
680  }
681 
682  if ( !QFileInfo( d->sourceImage ).exists() ) {
683  QMessageBox::information( this,
684  tr( "Source Image" ),
685  tr( "The source image you specified does not exist. Please specify a different one." ) );
686  d->uiWidget.lineEditSource->setFocus();
687  d->uiWidget.lineEditSource->selectAll();
688  return false;
689  }
690 
691  if ( QImage( d->sourceImage ).isNull() ) {
692  QMessageBox::information( this,
693  tr( "Source Image" ),
694  tr( "The source image you specified does not seem to be an image. Please specify a different image file." ) );
695  d->uiWidget.lineEditSource->setFocus();
696  d->uiWidget.lineEditSource->selectAll();
697  return false;
698  }
699  }
700 
701  if ( currentId() == 5 ) {
702  if ( d->uiWidget.lineEditTitle->text().isEmpty() ) {
703  QMessageBox::information( this, tr( "Map Title" ), tr( "Please specify a map title." ) );
704  d->uiWidget.lineEditTitle->setFocus();
705  return false;
706  }
707 
708  d->mapTheme = d->uiWidget.lineEditTheme->text();
709  if ( d->mapTheme.isEmpty() ) {
710  QMessageBox::information( this, tr( "Map Name" ), tr( "Please specify a map name." ) );
711  d->uiWidget.lineEditTheme->setFocus();
712  return false;
713  }
714 
715  const QDir destinationDir( QString( "%1/maps/earth/%2" ).arg( MarbleDirs::localPath() ).arg( d->mapTheme ) );
716  if ( destinationDir.exists() ) {
717  QMessageBox::information( this,
718  tr( "Map Name" ),
719  tr( "Please specify another map name, since there is already a map named \"%1\"." ).arg( d->mapTheme ) );
720  d->uiWidget.lineEditTheme->setFocus();
721  d->uiWidget.lineEditTheme->selectAll();
722  return false;
723  }
724 
725  if ( d->previewImage.isNull() ) {
726  QMessageBox::information( this, tr( "Preview Image" ), tr( "Please specify a preview image." ) );
727  d->uiWidget.pushButtonPreview->setFocus();
728  return false;
729  }
730  }
731 
732  return QWizard::validateCurrentPage();
733 }
734 
735 int MapWizard::nextId() const
736 {
737  switch( currentId() )
738  {
739  case 0:
740  if( d->uiWidget.radioButtonWms->isChecked() ) {
741  d->mapProviderType = MapWizardPrivate::WmsMap;
742  return 1;
743  } else if( d->uiWidget.radioButtonBitmap->isChecked() ) {
744  d->mapProviderType = MapWizardPrivate::StaticImageMap;
745  return 3;
746  } else if( d->uiWidget.radioButtonStaticUrl->isChecked() ) {
747  d->mapProviderType = MapWizardPrivate::StaticUrlMap;
748  return 4;
749  }
750  break;
751 
752  case 2: // WMS
753  return 5;
754  break;
755 
756  case 3: // Static Image
757  return 5;
758  break;
759 
760  case 7: // Finish
761  return -1;
762  break;
763 
764  default:
765  break;
766 
767  }
768 
769  return currentId() + 1;
770 }
771 
772 GeoSceneDocument* MapWizard::createDocument()
773 {
774  GeoSceneDocument *document = new GeoSceneDocument;
775 
776  GeoSceneHead *head = document->head();
777  head->setName( d->uiWidget.lineEditTitle->text() );
778  head->setTheme( d->uiWidget.lineEditTheme->text() );
779  head->setTarget( "earth" );
780  head->setDescription( d->uiWidget.textEditDesc->document()->toHtml() );
781  head->setVisible( true );
782 
783  GeoSceneIcon *icon = head->icon();
784  icon->setPixmap( QString( "preview.png" ) );
785 
786  GeoSceneZoom *zoom = head->zoom();
787  zoom->setMinimum( 900 );
788  zoom->setMaximum( 3500 );
789  zoom->setDiscrete( false );
790 
791  GeoSceneTiled *texture = new GeoSceneTiled( "map" );
792  texture->setExpire( 31536000 );
793  texture->setSourceDir( "earth/" + document->head()->theme() );
794  if( d->mapProviderType == MapWizardPrivate::WmsMap )
795  {
796  texture->setFileFormat( d->format );
797  QString layer = d->wmsFetchedMaps.key( d->uiWidget.listWidgetWmsMaps->currentItem()->text() );
798  QUrl downloadUrl = QUrl( d->uiWidget.lineEditWmsUrl->text() );
799 #if QT_VERSION < 0x050000
800  downloadUrl.addQueryItem( "layers", layer );
801 #else
802  QUrlQuery urlQuery;
803  urlQuery.addQueryItem( "layers", layer );
804  downloadUrl.setQuery( urlQuery );
805 #endif
806  texture->addDownloadUrl( downloadUrl );
807  texture->setMaximumTileLevel( 20 );
808  texture->setLevelZeroRows( 1 );
809  texture->setLevelZeroColumns( 1 );
810  texture->setServerLayout( new WmsServerLayout( texture ) );
811  texture->setProjection( GeoSceneTiled::Equirectangular );
812  }
813 
814  else if( d->mapProviderType == MapWizardPrivate::StaticUrlMap )
815  {
816  texture->setFileFormat( d->format );
817  QUrl downloadUrl = QUrl( d->uiWidget.comboBoxStaticUrlServer->currentText() );
818  texture->addDownloadPolicy( DownloadBrowse, 20 );
819  texture->addDownloadPolicy( DownloadBulk, 2 );
820  texture->addDownloadUrl( downloadUrl );
821  texture->setMaximumTileLevel( 20 );
822  texture->setLevelZeroRows( 1 );
823  texture->setLevelZeroColumns( 1 );
824  texture->setServerLayout( new CustomServerLayout( texture ) );
825  texture->setProjection( GeoSceneTiled::Mercator );
826  }
827 
828  else if( d->mapProviderType == MapWizardPrivate::StaticImageMap )
829  {
830  QString image = d->uiWidget.lineEditSource->text();
831  d->format = image.right( image.length() - image.lastIndexOf( '.' ) - 1 ).toLower();
832  texture->setFileFormat( d->format.toUpper() );
833  texture->setInstallMap( document->head()->theme() + '.' + d->format );
834  texture->setServerLayout( new MarbleServerLayout( texture ) );
835  texture->setProjection( GeoSceneTiled::Equirectangular );
836  int imageWidth = QImage( image ).width();
837  int tileSize = c_defaultTileSize;
838 
839  float approxMaxTileLevel = log( imageWidth / ( 2.0 * tileSize ) ) / log( 2.0 );
840  int maxTileLevel = 0;
841  if ( approxMaxTileLevel == int( approxMaxTileLevel ) ) {
842  maxTileLevel = static_cast<int>( approxMaxTileLevel );
843  } else {
844  maxTileLevel = static_cast<int>( approxMaxTileLevel + 1 );
845  }
846  texture->setMaximumTileLevel( maxTileLevel );
847  }
848 
849  GeoSceneLayer *layer = new GeoSceneLayer( d->uiWidget.lineEditTheme->text() );
850  layer->setBackend( "texture" );
851  layer->addDataset( texture );
852 
853  GeoSceneLayer* secondLayer = new GeoSceneLayer( "standardplaces" );
854  secondLayer->setBackend( "geodata" );
855 
856  GeoSceneGeodata* cityplacemarks = new GeoSceneGeodata( "cityplacemarks" );
857  cityplacemarks->setSourceFile( "cityplacemarks.kml" );
858  secondLayer->addDataset( cityplacemarks );
859 
860  GeoSceneGeodata* baseplacemarks = new GeoSceneGeodata( "baseplacemarks" );
861  baseplacemarks->setSourceFile( "baseplacemarks.kml" );
862  secondLayer->addDataset( baseplacemarks );
863 
864  GeoSceneGeodata* elevplacemarks = new GeoSceneGeodata( "elevplacemarks" );
865  elevplacemarks->setSourceFile( "elevplacemarks.kml" );
866  secondLayer->addDataset( elevplacemarks );
867 
868  GeoSceneGeodata* observatoryplacemarks = new GeoSceneGeodata( "observatoryplacemarks" );
869  observatoryplacemarks->setSourceFile( "observatoryplacemarks.kml" );
870  secondLayer->addDataset( observatoryplacemarks );
871 
872  GeoSceneGeodata* otherplacemarks = new GeoSceneGeodata( "otherplacemarks" );
873  otherplacemarks->setSourceFile( "otherplacemarks.kml" );
874  secondLayer->addDataset( otherplacemarks );
875 
876  GeoSceneGeodata* boundaryplacemarks = new GeoSceneGeodata( "boundaryplacemarks" );
877  boundaryplacemarks->setSourceFile( "boundaryplacemarks.kml" );
878  secondLayer->addDataset( boundaryplacemarks );
879 
880  GeoSceneMap *map = document->map();
881  map->addLayer( layer );
882  map->addLayer( secondLayer );
883 
884  GeoSceneSettings *settings = document->settings();
885  GeoSceneLegend *legend = document->legend();
886 
887  if( d->uiWidget.checkBoxCoord->checkState() == Qt::Checked )
888  {
889  GeoSceneProperty *coorGrid = new GeoSceneProperty( "coordinate-grid" );
890  coorGrid->setDefaultValue( true );
891  coorGrid->setAvailable( true );
892  settings->addProperty( coorGrid );
893 
894  GeoSceneSection *coorSection = new GeoSceneSection( "coordinate-grid" );
895  coorSection->setHeading( "Coordinate Grid" );
896  coorSection->setCheckable( true );
897  coorSection->setConnectTo( "coordinate-grid" );
898  coorSection->setSpacing( 12 );
899  legend->addSection( coorSection );
900  }
901 
902  if( d->uiWidget.checkBoxInterest->checkState() == Qt::Checked )
903  {
904  GeoSceneProperty *poiProperty = new GeoSceneProperty( "otherplaces" );
905  poiProperty->setDefaultValue( true );
906  poiProperty->setAvailable( true );
907  settings->addProperty( poiProperty );
908 
909  GeoSceneSection *poiSection = new GeoSceneSection( "otherplaces" );
910  poiSection->setHeading( "Places of Interest" );
911  poiSection->setCheckable( true );
912  poiSection->setConnectTo( "otherplaces" );
913  poiSection->setSpacing( 12 );
914 
915  GeoSceneItem *geoPole = new GeoSceneItem( "geographic-pole" );
916  GeoSceneIcon *geoPoleIcon = geoPole->icon();
917  geoPole->setText( tr("Geographic Pole") );
918  geoPoleIcon->setPixmap( "bitmaps/pole_1.png" );
919  poiSection->addItem( geoPole );
920 
921  GeoSceneItem *magPole = new GeoSceneItem( "magnetic-pole" );
922  GeoSceneIcon *magPoleIcon = magPole->icon();
923  magPole->setText( tr("Magnetic Pole") );
924  magPoleIcon->setPixmap( "bitmaps/pole_2.png" );
925  poiSection->addItem( magPole );
926 
927  GeoSceneItem *airport = new GeoSceneItem( "airport" );
928  GeoSceneIcon *airportIcon = airport->icon();
929  airport->setText( tr("Airport") );
930  airportIcon->setPixmap( "bitmaps/airport.png" );
931  poiSection->addItem( airport );
932 
933  GeoSceneItem *shipwreck = new GeoSceneItem( "shipwreck" );
934  GeoSceneIcon *shipwreckIcon = shipwreck->icon();
935  shipwreck->setText( tr("Shipwreck") );
936  shipwreckIcon->setPixmap( "bitmaps/shipwreck.png" );
937  poiSection->addItem( shipwreck );
938 
939  GeoSceneItem *observatory = new GeoSceneItem( "observatory" );
940  GeoSceneIcon *observatoryIcon = observatory->icon();
941  observatory->setText( tr("Observatory") );
942  observatoryIcon->setPixmap( "bitmaps/observatory.png" );
943  poiSection->addItem( observatory );
944 
945  legend->addSection( poiSection );
946  }
947 
948  if( d->uiWidget.checkBoxTer->checkState() == Qt::Checked )
949  {
950  GeoSceneProperty *terrainProperty = new GeoSceneProperty( "terrain" );
951  terrainProperty->setDefaultValue( true );
952  terrainProperty->setAvailable( true );
953  settings->addProperty( terrainProperty );
954 
955  GeoSceneSection *terrainSection = new GeoSceneSection( "terrain" );
956  terrainSection->setHeading( "Terrain" );
957  terrainSection->setCheckable( true );
958  terrainSection->setConnectTo( "terrain" );
959  terrainSection->setSpacing( 12 );
960 
961  GeoSceneItem *mountain = new GeoSceneItem( "mountain" );
962  GeoSceneIcon *mountainIcon = mountain->icon();
963  mountain->setText( tr("Mountain") );
964  mountainIcon->setPixmap( "bitmaps/mountain_1.png" );
965  terrainSection->addItem( mountain );
966 
967  GeoSceneItem *volcano = new GeoSceneItem( "volcano" );
968  GeoSceneIcon *volcanoIcon = volcano->icon();
969  volcano->setText( tr("Volcano") );
970  volcanoIcon->setPixmap( "bitmaps/volcano_1.png" );
971  terrainSection->addItem( volcano );
972 
973  legend->addSection( terrainSection );
974 
975  }
976 
977  if( d->uiWidget.checkBoxPop->checkState() == Qt::Checked )
978  {
979  GeoSceneProperty *placesProperty = new GeoSceneProperty( "places" );
980  placesProperty->setDefaultValue( true );
981  placesProperty->setAvailable( true );
982  settings->addProperty( placesProperty );
983 
984  GeoSceneProperty *citiesProperty = new GeoSceneProperty( "cities" );
985  citiesProperty->setDefaultValue( true );
986  citiesProperty->setAvailable( true );
987  settings->addProperty( citiesProperty );
988  }
989 
990  if( d->uiWidget.checkBoxBorder->checkState() == Qt::Checked )
991  {
992  GeoSceneSection *bordersSection = new GeoSceneSection( "borders" );
993  bordersSection->setHeading( "Boundaries" );
994  bordersSection->setCheckable( true );
995  bordersSection->setConnectTo( "borders" );
996  bordersSection->setSpacing( 12 );
997 
998  GeoSceneItem *internationalBoundary = new GeoSceneItem( "international-boundary" );
999  GeoSceneIcon *internationalBoundaryIcon = internationalBoundary->icon();
1000  internationalBoundary->setText( tr("International") );
1001  internationalBoundaryIcon->setPixmap( "bitmaps/border_1.png" );
1002  bordersSection->addItem( internationalBoundary );
1003 
1004  GeoSceneItem *stateBoundary = new GeoSceneItem( "state" );
1005  GeoSceneIcon *stateBoundaryIcon = stateBoundary->icon();
1006  stateBoundary->setText( tr("State") );
1007  stateBoundaryIcon->setPixmap( "bitmaps/border_2.png" );
1008  bordersSection->addItem( stateBoundary );
1009 
1010  GeoSceneProperty *bordersProperty = new GeoSceneProperty( "borders" );
1011  bordersProperty->setDefaultValue( false );
1012  bordersProperty->setAvailable( true );
1013  settings->addProperty( bordersProperty );
1014 
1015  GeoSceneProperty *intBoundariesProperty = new GeoSceneProperty( "international-boundaries" );
1016  intBoundariesProperty->setDefaultValue( false );
1017  intBoundariesProperty->setAvailable( true );
1018  settings->addProperty( intBoundariesProperty );
1019 
1020  GeoSceneProperty *stateBounderiesProperty = new GeoSceneProperty( "state-boundaries" );
1021  stateBounderiesProperty->setDefaultValue( false );
1022  stateBounderiesProperty->setAvailable( true );
1023  settings->addProperty( stateBounderiesProperty );
1024 
1025  legend->addSection( bordersSection );
1026 
1027  GeoSceneLayer* mwdbii = new GeoSceneLayer( "mwdbii" );
1028  mwdbii->setBackend( "vector" );
1029  mwdbii->setRole( "polyline" );
1030 
1031  GeoSceneVector* vector = new GeoSceneVector( "pdiffborder" );
1032  vector->setFeature( "border" );
1033  vector->setFileFormat( "PNT" );
1034  vector->setSourceFile( "earth/mwdbii/PDIFFBORDER.PNT" );
1035  vector->pen().setColor( "#ffe300" );
1036  mwdbii->addDataset( vector );
1037  map->addLayer( mwdbii );
1038  }
1039 
1040  GeoSceneProperty *overviewmap = new GeoSceneProperty( "overviewmap" );
1041  overviewmap->setDefaultValue( true );
1042  overviewmap->setAvailable( true );
1043  settings->addProperty( overviewmap );
1044 
1045  GeoSceneProperty *compass = new GeoSceneProperty( "compass" );
1046  compass->setDefaultValue( true );
1047  compass->setAvailable( true );
1048  settings->addProperty( compass );
1049 
1050  GeoSceneProperty *scalebar = new GeoSceneProperty( "scalebar" );
1051  scalebar->setDefaultValue( true );
1052  scalebar->setAvailable( true );
1053  settings->addProperty( scalebar );
1054 
1055  return document;
1056 }
1057 
1058 void MapWizard::accept()
1059 {
1060  Q_ASSERT( d->mapProviderType != MapWizardPrivate::NoMap );
1061 
1062  Q_ASSERT( d->format == d->format.toLower() );
1063  Q_ASSERT( !d->mapTheme.isEmpty() );
1064 
1065  if ( d->mapProviderType == MapWizardPrivate::StaticImageMap )
1066  {
1067  d->sourceImage = d->uiWidget.lineEditSource->text();
1068  Q_ASSERT( !d->sourceImage.isEmpty() );
1069  Q_ASSERT( QFile( d->sourceImage ).exists() );
1070  }
1071  else if ( d->mapProviderType == MapWizardPrivate::WmsMap )
1072  {
1073  Q_ASSERT( !d->wmsFetchedMaps.isEmpty() );
1074  Q_ASSERT( !d->levelZero.isNull() );
1075  Q_ASSERT( !QImage::fromData( d->levelZero ).isNull() );
1076  }
1077  else if ( d->mapProviderType == MapWizardPrivate::StaticUrlMap )
1078  {
1079  Q_ASSERT( !d->levelZero.isNull() );
1080  Q_ASSERT( !QImage::fromData( d->levelZero ).isNull() );
1081  }
1082 
1083  QSharedPointer<GeoSceneDocument> document( createDocument() );
1084  Q_ASSERT( !document->head()->description().isEmpty() );
1085  Q_ASSERT( !document->head()->name().isEmpty() );
1086 
1087  if( createFiles( document.data() ) )
1088  {
1089  if( d->mapProviderType == MapWizardPrivate::WmsMap )
1090  {
1091  if( d->wmsLegends.isEmpty() && d->wmsLegends.at( d->uiWidget.listWidgetWmsMaps->currentRow() ).isEmpty() )
1092  {
1093  downloadLegend( d->wmsLegends.at( d->uiWidget.listWidgetWmsMaps->currentRow() ) );
1094  }
1095  } else if( d->mapProviderType == MapWizardPrivate::StaticImageMap || d->mapProviderType == MapWizardPrivate::StaticUrlMap ) {
1096  createLegend();
1097  }
1098 
1099  QDialog::accept();
1100  d->uiWidget.lineEditTitle->clear();
1101  d->uiWidget.lineEditTheme->clear();
1102  d->uiWidget.textEditDesc->clear();
1103  d->uiWidget.labelPreview->clear();
1104  d->uiWidget.lineEditSource->clear();
1105  QTimer::singleShot( 0, this, SLOT(restart()) );
1106  }
1107 
1108  else
1109  {
1110  QMessageBox::critical( this, tr( "Problem while creating files" ), tr( "Check if a theme with the same name exists." ) );
1111  return;
1112  }
1113 }
1114 
1115 void MapWizard::showPreview()
1116 {
1117  QSharedPointer<GeoSceneDocument> document( createDocument() );
1118 
1119  if( createFiles( document.data() ) )
1120  {
1121  if( d->mapProviderType == MapWizardPrivate::WmsMap )
1122  {
1123  if( d->wmsLegends.isEmpty() && d->wmsLegends.at( d->uiWidget.listWidgetWmsMaps->currentRow() ).isEmpty() )
1124  {
1125  downloadLegend( d->wmsLegends.at( d->uiWidget.listWidgetWmsMaps->currentRow() ) );
1126  }
1127  } else if( d->mapProviderType == MapWizardPrivate::StaticImageMap || d->mapProviderType == MapWizardPrivate::StaticUrlMap ) {
1128  createLegend();
1129  }
1130  }
1131 
1132  QPointer<PreviewDialog> previewDialog = new PreviewDialog( this, document.data()->head()->mapThemeId() );
1133  previewDialog->exec();
1134  delete previewDialog;
1135 }
1136 
1137 
1138 }
1139 
1140 #include "MapWizard.moc"
QWidget::layout
QLayout * layout() const
GeoSceneHead.h
QProcess::execute
int execute(const QString &program, const QStringList &arguments)
QWizard::validateCurrentPage
virtual bool validateCurrentPage()
GeoSceneProperty.h
QDomElement::elementsByTagName
QDomNodeList elementsByTagName(const QString &tagname) const
QString::indexOf
int indexOf(QChar ch, int from, Qt::CaseSensitivity cs) const
QWidget
Marble::GeoSceneTiled::Equirectangular
Definition: GeoSceneTiled.h:47
Marble::GeoSceneIcon
Icon properties of a GeoScene document.
Definition: GeoSceneIcon.h:38
Marble::GeoSceneDocument::map
const GeoSceneMap * map() const
Definition: GeoSceneDocument.cpp:96
Marble::GeoSceneTiled::setServerLayout
void setServerLayout(const ServerLayout *)
Definition: GeoSceneTiled.cpp:86
QDialog::closeEvent
virtual void closeEvent(QCloseEvent *e)
QUrl::setQuery
void setQuery(const QString &txt)
QPixmap::width
int width() const
QImage::fromData
QImage fromData(const uchar *data, int size, const char *format)
GeoSceneGeodata.h
GeoSceneItem.h
QXmlStreamWriter
QNetworkRequest::setUrl
void setUrl(const QUrl &url)
QGridLayout::addWidget
void addWidget(QWidget *widget, int row, int column, QFlags< Qt::AlignmentFlag > alignment)
Marble::GeoSceneZoom::setMaximum
void setMaximum(int target)
Definition: GeoSceneZoom.cpp:51
QByteArray
Marble::MapWizard::setWmsServers
void setWmsServers(const QStringList &uris)
Definition: MapWizard.cpp:316
Marble::GeoSceneHead
General properties and identifiers of a GeoScene document.
Definition: GeoSceneHead.h:42
QDomElement::attribute
QString attribute(const QString &name, const QString &defValue) const
Marble::MapWizard::createWmsLegend
void createWmsLegend(QNetworkReply *reply)
Definition: MapWizard.cpp:299
QFile::remove
bool remove()
Marble::MapWizard::createArchive
static QString createArchive(QWidget *parent, QString mapId)
Definition: MapWizard.cpp:574
Marble::MapWizard::wmsServers
QStringList wmsServers() const
Definition: MapWizard.cpp:325
QString::split
QStringList split(const QString &sep, SplitBehavior behavior, Qt::CaseSensitivity cs) const
QNetworkReply
QWizard::currentId
int currentId() const
Marble::GeoSceneHead::setTarget
void setTarget(const QString &target)
Definition: GeoSceneHead.cpp:106
QDomNodeList
Marble::MapWizard::setStaticUrlServers
void setStaticUrlServers(const QStringList &uris)
Definition: MapWizard.cpp:335
Marble::GeoSceneTiled::setInstallMap
void setInstallMap(const QString &installMap)
Definition: GeoSceneTiled.cpp:71
QMap< QString, QString >
Marble::MapWizard::parseServerCapabilities
void parseServerCapabilities(QNetworkReply *reply)
Definition: MapWizard.cpp:240
QPointer
QFile::setFileName
void setFileName(const QString &name)
Marble::MapWizard::queryPreviewImage
void queryPreviewImage()
Definition: MapWizard.cpp:556
Marble::MapWizard::autoFillDetails
void autoFillDetails()
Definition: MapWizard.cpp:340
Marble::GeoSceneTiled
Definition: GeoSceneTiled.h:43
QPixmap::fromImage
QPixmap fromImage(const QImage &image, QFlags< Qt::ImageConversionFlag > flags)
Marble::DownloadBrowse
Browsing mode, normal operation of Marble, like a web browser.
Definition: MarbleGlobal.h:166
QBuffer
GeoSceneDocument.h
Marble::MarbleDirs::localPath
static QString localPath()
Definition: MarbleDirs.cpp:223
QGridLayout
QWidget::icon
const QPixmap * icon() const
QImage::isNull
bool isNull() const
QFile::exists
bool exists() const
Marble::GeoSceneHead::setVisible
void setVisible(bool visible)
Definition: GeoSceneHead.cpp:151
Marble::GeoSceneTiled::setLevelZeroColumns
void setLevelZeroColumns(const int)
Definition: GeoSceneTiled.cpp:102
Marble::GeoSceneTiled::setSourceDir
void setSourceDir(const QString &sourceDir)
Definition: GeoSceneTiled.cpp:61
QSharedPointer::data
T * data() const
MarbleDebug.h
QObject::tr
QString tr(const char *sourceText, const char *disambiguation, int n)
QMessageBox::information
StandardButton information(QWidget *parent, const QString &title, const QString &text, QFlags< QMessageBox::StandardButton > buttons, StandardButton defaultButton)
QFile
QFile::copy
bool copy(const QString &newName)
Marble::GeoSceneHead::setName
void setName(const QString &name)
Definition: GeoSceneHead.cpp:96
QGridLayout::setSpacing
void setSpacing(int spacing)
GeoWriter.h
QString::lastIndexOf
int lastIndexOf(QChar ch, int from, Qt::CaseSensitivity cs) const
MapWizard.h
This file contains the header for MapWizard.
Marble::GeoSceneHead::setDescription
void setDescription(const QString &)
Definition: GeoSceneHead.cpp:131
Marble::MapWizard::deleteArchive
static void deleteArchive(QString mapId)
Definition: MapWizard.cpp:651
QDialog::finished
void finished(int result)
QCloseEvent
QWidget::setMinimumSize
void setMinimumSize(const QSize &)
QWizard::currentIdChanged
void currentIdChanged(int id)
Marble::GeoSceneDocument::legend
const GeoSceneLegend * legend() const
Definition: GeoSceneDocument.cpp:116
Marble::GeoSceneTiled::setProjection
void setProjection(const Projection)
Definition: GeoSceneTiled.cpp:174
QNetworkRequest
QWidget::setEnabled
void setEnabled(bool)
QString::number
QString number(int n, int base)
QDir::exists
bool exists() const
QList::append
void append(const T &value)
Marble::MapWizard::querySourceImage
void querySourceImage()
Definition: MapWizard.cpp:551
QWidget::setLayout
void setLayout(QLayout *layout)
QDomElement::text
QString text() const
QWizard::restart
void restart()
QDir::tempPath
QString tempPath()
QSharedPointer
Marble::GeoSceneIcon::setPixmap
void setPixmap(const QString &)
Definition: GeoSceneIcon.cpp:42
Marble::MapWizard::~MapWizard
~MapWizard()
Definition: MapWizard.cpp:216
Marble::c_defaultTileSize
const unsigned int c_defaultTileSize
Definition: MarbleGlobal.h:263
QUrl::setUrl
void setUrl(const QString &url)
QFileInfo::isDir
bool isDir() const
GeoSceneZoom.h
QProcess
QImage::width
int width() const
QList::isEmpty
bool isEmpty() const
MarbleDirs.h
QDir::cd
bool cd(const QString &dirName)
QFileInfo::absoluteFilePath
QString absoluteFilePath() const
Marble::dgml::dgmlTag_nameSpace20
const char * dgmlTag_nameSpace20
Definition: DgmlElementDictionary.cpp:31
GeoSceneVector.h
QIODevice::readAll
QByteArray readAll()
Marble::WmsServerLayout
Definition: ServerLayout.h:90
Marble::GeoSceneHead::setTheme
void setTheme(const QString &theme)
Definition: GeoSceneHead.cpp:121
DgmlElementDictionary.h
QImageReader
QDialog::result
int result() const
QString
QtConcurrent::map
QFuture< void > map(Sequence &sequence, MapFunction function)
MarbleGlobal.h
QLayout::setMargin
void setMargin(int margin)
QFile::open
virtual bool open(QFlags< QIODevice::OpenModeFlag > mode)
Marble::GeoSceneHead::theme
QString theme() const
Definition: GeoSceneHead.cpp:111
QDialog::accept
virtual void accept()
QStringList
Marble::MapWizard::accept
virtual void accept()
Definition: MapWizard.cpp:1058
QString::right
QString right(int n) const
QPixmap
Marble::GeoSceneDocument::head
const GeoSceneHead * head() const
Definition: GeoSceneDocument.cpp:86
QFileInfo
QFileInfo::exists
bool exists() const
Marble::GeoSceneTiled::Mercator
Definition: GeoSceneTiled.h:47
QUrl
Marble::GeoSceneDocument
A container for features parsed from the DGML file.
Definition: GeoSceneDocument.h:44
QLatin1Char
QPixmap::height
int height() const
ServerLayout.h
QDomDocument
QFile::close
virtual void close()
QImage
Marble::MapWizard::staticUrlServers
QStringList staticUrlServers() const
Definition: MapWizard.cpp:330
QDomNode::isNull
bool isNull() const
Marble::MapWizard::nextId
virtual int nextId() const
Definition: MapWizard.cpp:735
QDir
Marble::MapWizard::queryLegendImage
void queryLegendImage()
Definition: MapWizard.cpp:566
QString::replace
QString & replace(int position, int n, QChar after)
QNetworkAccessManager
Marble::GeoSceneMap::addLayer
void addLayer(GeoSceneLayer *)
Add a new layer to the map.
Definition: GeoSceneMap.cpp:81
Marble::GeoSceneAbstractDataset::setFileFormat
void setFileFormat(const QString &fileFormat)
Definition: GeoSceneAbstractDataset.cpp:48
QWizard::button
QAbstractButton * button(WizardButton which) const
GeoSceneSettings.h
QString::toLatin1
QByteArray toLatin1() const
GeoSceneSection.h
GeoSceneTiled.h
Marble::GeoSceneHead::icon
const GeoSceneIcon * icon() const
Definition: GeoSceneHead.cpp:156
MarbleNavigator.h
This file contains the header for MarbleNavigator.
Marble::GeoSceneIcon::pixmap
QString pixmap() const
Definition: GeoSceneIcon.cpp:37
QDir::absolutePath
QString absolutePath() const
Marble::GeoSceneAbstractDataset::setExpire
void setExpire(int expire)
Definition: GeoSceneAbstractDataset.cpp:58
QDir::entryList
QStringList entryList(QFlags< QDir::Filter > filters, QFlags< QDir::SortFlag > sort) const
QWidget::setWindowTitle
void setWindowTitle(const QString &)
QDomNode::firstChildElement
QDomElement firstChildElement(const QString &tagName) const
Marble::MapWizard::createLevelZero
void createLevelZero(QNetworkReply *reply=0)
Definition: MapWizard.cpp:502
QMessageBox::critical
StandardButton critical(QWidget *parent, const QString &title, const QString &text, QFlags< QMessageBox::StandardButton > buttons, StandardButton defaultButton)
Marble::GeoSceneZoom::setMinimum
void setMinimum(int name)
Definition: GeoSceneZoom.cpp:41
QString::length
int length() const
QByteArray::data
char * data()
MarbleWidget::setMapThemeId
void setMapThemeId(const QString &mapThemeId)
Change the currently active map theme id.
Definition: MarbleDeclarativeWidget.cpp:183
Marble::MapWizard::downloadLevelZero
void downloadLevelZero()
Definition: MapWizard.cpp:454
QString::left
QString left(int n) const
QIODevice::write
qint64 write(const char *data, qint64 maxSize)
Marble::GeoSceneHead::zoom
const GeoSceneZoom * zoom() const
Definition: GeoSceneHead.cpp:166
QDialog
MarbleWidget.h
This file contains the headers for MarbleWidget.
QUrl::addQueryItem
void addQueryItem(const QString &key, const QString &value)
Marble::MarbleDirs::systemPath
static QString systemPath()
Definition: MarbleDirs.cpp:125
Marble::GeoSceneZoom
Zoom properties of a GeoScene document.
Definition: GeoSceneZoom.h:34
GeoSceneLegend.h
QWizard
QFileDialog::getOpenFileName
QString getOpenFileName(QWidget *parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedFilter, QFlags< QFileDialog::Option > options)
MarbleWidget
Wraps a Marble::MarbleWidget, providing access to important properties and methods.
Definition: MarbleDeclarativeWidget.h:50
QDomNodeList::size
int size() const
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
GeoSceneIcon.h
QDomElement
QImageReader::format
QByteArray format() const
QString::arg
QString arg(qlonglong a, int fieldWidth, int base, const QChar &fillChar) const
Marble::GeoSceneTiled::addDownloadUrl
void addDownloadUrl(const QUrl &)
Definition: GeoSceneTiled.cpp:197
Marble::GeoSceneTiled::setLevelZeroRows
void setLevelZeroRows(const int)
Definition: GeoSceneTiled.cpp:112
Marble::mDebug
QDebug mDebug()
a function to replace qDebug() in Marble library code
Definition: MarbleDebug.cpp:36
QWizard::next
void next()
Marble::MapWizard::showPreview
void showPreview()
Definition: MapWizard.cpp:1115
Marble::GeoSceneTiled::setMaximumTileLevel
void setMaximumTileLevel(const int)
Definition: GeoSceneTiled.cpp:122
GeoSceneMap.h
QImage::scaled
QImage scaled(int width, int height, Qt::AspectRatioMode aspectRatioMode, Qt::TransformationMode transformMode) const
Marble::GeoSceneDocument::settings
const GeoSceneSettings * settings() const
Definition: GeoSceneDocument.cpp:106
Marble::GeoSceneZoom::setDiscrete
void setDiscrete(bool theme)
Definition: GeoSceneZoom.cpp:61
Marble::MapWizard::validateCurrentPage
virtual bool validateCurrentPage()
Definition: MapWizard.cpp:658
GeoSceneLayer.h
Marble::DownloadBulk
Bulk download, for example "File/Download region".
Definition: MarbleGlobal.h:165
QDomNodeList::at
QDomNode at(int index) const
Marble::MapWizard::MapWizard
MapWizard(QWidget *parent=0)
Definition: MapWizard.cpp:192
Marble::GeoSceneTiled::addDownloadPolicy
void addDownloadPolicy(const DownloadUsage usage, const int maximumConnections)
Definition: GeoSceneTiled.cpp:253
QTimer::singleShot
singleShot
Marble::MapWizard::queryServerCapabilities
void queryServerCapabilities()
Definition: MapWizard.cpp:221
QProcess::waitForFinished
bool waitForFinished(int msecs)
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:13:40 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

marble

Skip menu "marble"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal