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

marble

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