• 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
  • plugins
  • runner
  • monav
MonavConfigWidget.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 2010 Dennis Nienhüser <earthwings@gentoo.org>
9 //
10 
11 #include "MonavConfigWidget.h"
12 
13 #include "MonavMapsModel.h"
14 #include "MonavPlugin.h"
15 #include "MarbleDirs.h"
16 #include "MarbleDebug.h"
17 
18 #include <QFile>
19 #include <QProcess>
20 #include <QSignalMapper>
21 #include <QStringListModel>
22 #include <QComboBox>
23 #include <QPushButton>
24 #include <QShowEvent>
25 #include <QSortFilterProxyModel>
26 #include <QMessageBox>
27 #include <QNetworkAccessManager>
28 #include <QNetworkReply>
29 #include <QDomDocument>
30 
31 namespace Marble
32 {
33 
34 class MonavStuffEntry
35 {
36 public:
37  void setPayload( const QString &payload );
38 
39  QString payload() const;
40 
41  void setName( const QString &name );
42 
43  QString name() const;
44 
45  bool isValid() const;
46 
47  QString continent() const;
48 
49  QString state() const;
50 
51  QString region() const;
52 
53  QString transport() const;
54 
55 private:
56  QString m_payload;
57 
58  QString m_name;
59 
60  QString m_continent;
61 
62  QString m_state;
63 
64  QString m_region;
65 
66  QString m_transport;
67 };
68 
69 class MonavConfigWidgetPrivate
70 {
71 public:
72  MonavConfigWidget* m_parent;
73 
74  MonavPlugin* m_plugin;
75 
76  QNetworkAccessManager m_networkAccessManager;
77 
78  QNetworkReply* m_currentReply;
79 
80  QProcess* m_unpackProcess;
81 
82  QSortFilterProxyModel* m_filteredModel;
83 
84  MonavMapsModel* m_mapsModel;
85 
86  bool m_initialized;
87 
88  QSignalMapper m_removeMapSignalMapper;
89 
90  QSignalMapper m_upgradeMapSignalMapper;
91 
92  QVector<MonavStuffEntry> m_remoteMaps;
93 
94  QMap<QString, QString> m_remoteVersions;
95 
96  QString m_currentDownload;
97 
98  QFile m_currentFile;
99 
100  QString m_transport;
101 
102  MonavConfigWidgetPrivate( MonavConfigWidget* parent, MonavPlugin* plugin );
103 
104  void parseNewStuff( const QByteArray &data );
105 
106  bool updateContinents( QComboBox* comboBox );
107 
108  bool updateStates( const QString &continent, QComboBox* comboBox );
109 
110  bool updateRegions( const QString &continent, const QString &state, QComboBox* comboBox );
111 
112  MonavStuffEntry map( const QString &continent, const QString &state, const QString &region ) const;
113 
114  void install();
115 
116  void installMap();
117 
118  void updateInstalledMapsView();
119 
120  void updateInstalledMapsViewButtons();
121 
122  void updateTransportPreference();
123 
124  static bool canExecute( const QString &executable );
125 
126  void setBusy( bool busy, const QString &message = QString() ) const;
127 
128 private:
129  static bool fillComboBox( QStringList items, QComboBox* comboBox );
130 };
131 
132 void MonavStuffEntry::setPayload( const QString &payload )
133 {
134  m_payload = payload;
135 }
136 
137 QString MonavStuffEntry::payload() const
138 {
139  return m_payload;
140 }
141 
142 void MonavStuffEntry::setName( const QString &name )
143 {
144  m_name = name;
145  QStringList parsed = name.split( QLatin1Char( '/' ) );
146  int size = parsed.size();
147  m_continent = size > 0 ? parsed.at( 0 ).trimmed() : QString();
148  m_state = size > 1 ? parsed.at( 1 ).trimmed() : QString();
149  m_region = size > 2 ? parsed.at( 2 ).trimmed() : QString();
150  m_transport = "Motorcar"; // No i18n
151 
152  if ( size > 1 ) {
153  QString last = parsed.last().trimmed();
154  QRegExp regexp("([^(]+)\\(([^)]+)\\)");
155  if ( regexp.indexIn( last ) >= 0 ) {
156  QStringList matches = regexp.capturedTexts();
157  if ( matches.size() == 3 ) {
158  m_transport = matches.at( 2 ).trimmed();
159  if ( size > 2 ) {
160  m_region = matches.at( 1 ).trimmed();
161  } else {
162  m_state = matches.at( 1 ).trimmed();
163  }
164  }
165  }
166  }
167 }
168 
169 QString MonavStuffEntry::name() const
170 {
171  return m_name;
172 }
173 
174 QString MonavStuffEntry::continent() const
175 {
176  return m_continent;
177 }
178 
179 QString MonavStuffEntry::state() const
180 {
181  return m_state;
182 }
183 
184 QString MonavStuffEntry::region() const
185 {
186  return m_region;
187 }
188 
189 QString MonavStuffEntry::transport() const
190 {
191  return m_transport;
192 }
193 
194 bool MonavStuffEntry::isValid() const
195 {
196  return !m_continent.isEmpty() && !m_state.isEmpty() && m_payload.startsWith( QLatin1String( "http://" ) );
197 }
198 
199 MonavConfigWidgetPrivate::MonavConfigWidgetPrivate( MonavConfigWidget* parent, MonavPlugin* plugin ) :
200  m_parent( parent ), m_plugin( plugin ), m_networkAccessManager( 0 ),
201  m_currentReply( 0 ), m_unpackProcess( 0 ), m_filteredModel( new QSortFilterProxyModel( parent) ),
202  m_mapsModel( 0 ), m_initialized( false )
203 {
204  m_filteredModel->setFilterKeyColumn( 1 );
205 }
206 
207 void MonavConfigWidgetPrivate::parseNewStuff( const QByteArray &data )
208 {
209  QDomDocument xml;
210  if ( !xml.setContent( data ) ) {
211  mDebug() << "Cannot parse xml file " << data;
212  return;
213  }
214 
215  QDomElement root = xml.documentElement();
216  QDomNodeList items = root.elementsByTagName( "stuff" );
217 #if QT_VERSION < 0x050000
218  unsigned int i=0;
219 #else
220  int i=0;
221 #endif
222  for ( ; i < items.length(); ++i ) {
223  MonavStuffEntry item;
224  QDomNode node = items.item( i );
225 
226  QDomNodeList names = node.toElement().elementsByTagName( "name" );
227  if ( names.size() == 1 ) {
228  item.setName( names.at( 0 ).toElement().text() );
229  }
230 
231  QString releaseDate;
232  QDomNodeList dates = node.toElement().elementsByTagName( "releasedate" );
233  if ( dates.size() == 1 ) {
234  releaseDate = dates.at( 0 ).toElement().text();
235  }
236 
237  QString filename;
238  QDomNodeList payloads = node.toElement().elementsByTagName( "payload" );
239  if ( payloads.size() == 1 ) {
240  QString payload = payloads.at( 0 ).toElement().text();
241  filename = payload.mid( 1 + payload.lastIndexOf( "/" ) );
242  item.setPayload( payload );
243  }
244 
245  if ( item.isValid() ) {
246  m_remoteMaps.push_back( item );
247  if ( !filename.isEmpty() && !releaseDate.isEmpty() ) {
248  m_remoteVersions[filename] = releaseDate;
249  }
250  }
251  }
252 
253  m_mapsModel->setInstallableVersions( m_remoteVersions );
254  updateInstalledMapsViewButtons();
255 }
256 
257 bool MonavConfigWidgetPrivate::fillComboBox( QStringList items, QComboBox* comboBox )
258 {
259  comboBox->clear();
260  qSort( items );
261  comboBox->addItems( items );
262  return !items.isEmpty();
263 }
264 
265 bool MonavConfigWidgetPrivate::updateContinents( QComboBox* comboBox )
266 {
267  QSet<QString> continents;
268  foreach( const MonavStuffEntry &map, m_remoteMaps ) {
269  Q_ASSERT( map.isValid() );
270  continents << map.continent();
271  }
272 
273  return fillComboBox( continents.toList(), comboBox );
274 }
275 
276 bool MonavConfigWidgetPrivate::updateStates( const QString &continent, QComboBox* comboBox )
277 {
278  QSet<QString> states;
279  foreach( const MonavStuffEntry &map, m_remoteMaps ) {
280  Q_ASSERT( map.isValid() );
281  if ( map.continent() == continent ) {
282  states << map.state();
283  }
284  }
285 
286  return fillComboBox( states.toList(), comboBox );
287 }
288 
289 bool MonavConfigWidgetPrivate::updateRegions( const QString &continent, const QString &state, QComboBox* comboBox )
290 {
291  comboBox->clear();
292  QMap<QString,QString> regions;
293  foreach( const MonavStuffEntry &map, m_remoteMaps ) {
294  Q_ASSERT( map.isValid() );
295  if ( map.continent() == continent && map.state() == state ) {
296  QString item = "%1 - %2";
297  if ( map.region().isEmpty() ) {
298  item = item.arg( map.state() );
299  comboBox->addItem( item.arg( map.transport() ), map.payload() );
300  } else {
301  item = item.arg( map.region(), map.transport() );
302  regions.insert( item, map.payload() );
303  }
304  }
305  }
306 
307  QMapIterator<QString, QString> iter( regions );
308  while ( iter.hasNext() ) {
309  iter.next();
310  comboBox->addItem( iter.key(), iter.value() );
311  }
312 
313  return true;
314 }
315 
316 MonavStuffEntry MonavConfigWidgetPrivate::map( const QString &continent, const QString &state, const QString &region ) const
317 {
318  foreach( const MonavStuffEntry &entry, m_remoteMaps ) {
319  if ( continent == entry.continent() && state == entry.state() && region == entry.region() ) {
320  return entry;
321  }
322  }
323 
324  return MonavStuffEntry();
325 }
326 
327 MonavConfigWidget::MonavConfigWidget( MonavPlugin* plugin ) :
328  d( new MonavConfigWidgetPrivate( this, plugin ) )
329 {
330  setupUi( this );
331  m_statusLabel->setText( plugin->statusMessage() );
332  m_statusLabel->setHidden( m_statusLabel->text().isEmpty() );
333  d->setBusy( false );
334  m_installedMapsListView->setModel( d->m_mapsModel );
335  m_configureMapsListView->setModel( d->m_filteredModel );
336  m_configureMapsListView->resizeColumnsToContents();
337 
338  updateComboBoxes();
339 
340  connect( m_continentComboBox, SIGNAL(currentIndexChanged(int)),
341  this, SLOT(updateStates()) );
342  connect( m_transportTypeComboBox, SIGNAL(currentIndexChanged(QString)),
343  this, SLOT(updateTransportTypeFilter(QString)) );
344  connect( m_stateComboBox, SIGNAL(currentIndexChanged(int)),
345  this, SLOT(updateRegions()) );
346  connect( m_installButton, SIGNAL(clicked()), this, SLOT(downloadMap()) );
347  connect( m_cancelButton, SIGNAL(clicked()), this, SLOT(cancelOperation()) );
348  connect( &d->m_removeMapSignalMapper, SIGNAL(mapped(int)),
349  this, SLOT(removeMap(int)) );
350  connect( &d->m_upgradeMapSignalMapper, SIGNAL(mapped(int)),
351  this, SLOT(upgradeMap(int)) );
352  connect( &d->m_networkAccessManager, SIGNAL(finished(QNetworkReply*)),
353  this, SLOT(retrieveMapList(QNetworkReply*)) );
354 }
355 
356 MonavConfigWidget::~MonavConfigWidget()
357 {
358  delete d;
359 }
360 
361 void MonavConfigWidget::loadSettings( const QHash<QString, QVariant> &settings )
362 {
363  d->m_transport = settings["transport"].toString();
364  d->updateTransportPreference();
365 }
366 
367 void MonavConfigWidgetPrivate::updateTransportPreference()
368 {
369  if ( m_parent->m_transportTypeComboBox && m_mapsModel ) {
370  m_parent->m_transportTypeComboBox->blockSignals( true );
371  m_parent->m_transportTypeComboBox->clear();
372  QSet<QString> transportTypes;
373  for( int i=0; i<m_mapsModel->rowCount(); ++i ) {
374  QModelIndex index = m_mapsModel->index( i, 1 );
375  transportTypes << m_mapsModel->data( index ).toString();
376  }
377  m_parent->m_transportTypeComboBox->addItems( transportTypes.toList() );
378  m_parent->m_transportTypeComboBox->blockSignals( false );
379 
380  if ( !m_transport.isEmpty() && m_parent->m_transportTypeComboBox ) {
381  for ( int i=1; i<m_parent->m_transportTypeComboBox->count(); ++i ) {
382  if ( m_parent->m_transportTypeComboBox->itemText( i ) == m_transport ) {
383  m_parent->m_transportTypeComboBox->setCurrentIndex( i );
384  return;
385  }
386  }
387  }
388  }
389 }
390 
391 QHash<QString, QVariant> MonavConfigWidget::settings() const
392 {
393  QHash<QString, QVariant> settings;
394  settings["transport"] = d->m_transport;
395  return settings;
396 }
397 
398 void MonavConfigWidget::retrieveMapList( QNetworkReply *reply )
399 {
400  if ( reply->isReadable() && d->m_currentDownload.isEmpty() ) {
401  // check if we are redirected
402  QVariant const redirectionAttribute = reply->attribute( QNetworkRequest::RedirectionTargetAttribute );
403  if ( !redirectionAttribute.isNull() ) {
404  d->m_networkAccessManager.get( QNetworkRequest( redirectionAttribute.toUrl() ) );
405  } else {
406  disconnect( &d->m_networkAccessManager, SIGNAL(finished(QNetworkReply*)),
407  this, SLOT(retrieveMapList(QNetworkReply*)) );
408  d->parseNewStuff( reply->readAll() );
409  updateComboBoxes();
410  }
411  }
412 }
413 
414 void MonavConfigWidget::retrieveData()
415 {
416  if ( d->m_currentReply && d->m_currentReply->isReadable() && !d->m_currentDownload.isEmpty() ) {
417  // check if we are redirected
418  QVariant const redirectionAttribute = d->m_currentReply->attribute( QNetworkRequest::RedirectionTargetAttribute );
419  if ( !redirectionAttribute.isNull() ) {
420  d->m_currentReply = d->m_networkAccessManager.get( QNetworkRequest( redirectionAttribute.toUrl() ) );
421  connect( d->m_currentReply, SIGNAL(readyRead()),
422  this, SLOT(retrieveData()) );
423  connect( d->m_currentReply, SIGNAL(readChannelFinished()),
424  this, SLOT(retrieveData()) );
425  connect( d->m_currentReply, SIGNAL(downloadProgress(qint64,qint64)),
426  this, SLOT(updateProgressBar(qint64,qint64)) );
427  } else {
428  d->m_currentFile.write( d->m_currentReply->readAll() );
429  if ( d->m_currentReply->isFinished() ) {
430  d->m_currentReply->deleteLater();
431  d->m_currentReply = 0;
432  d->m_currentFile.close();
433  d->installMap();
434  d->m_currentDownload.clear();
435  }
436  }
437  }
438 }
439 
440 void MonavConfigWidget::updateComboBoxes()
441 {
442  d->updateContinents( m_continentComboBox );
443  updateStates();
444  updateRegions();
445 }
446 
447 void MonavConfigWidget::updateStates()
448 {
449  bool const haveContinents = m_continentComboBox->currentIndex() >= 0;
450  if ( haveContinents ) {
451  QString const continent = m_continentComboBox->currentText();
452  if ( d->updateStates( continent, m_stateComboBox ) ) {
453  updateRegions();
454  }
455  }
456 }
457 
458 void MonavConfigWidget::updateRegions()
459 {
460  bool haveRegions = false;
461  if ( m_continentComboBox->currentIndex() >= 0 ) {
462  if ( m_stateComboBox->currentIndex() >= 0 ) {
463  QString const continent = m_continentComboBox->currentText();
464  QString const state = m_stateComboBox->currentText();
465  haveRegions = d->updateRegions( continent, state, m_regionComboBox );
466  }
467  }
468 
469  m_regionLabel->setVisible( haveRegions );
470  m_regionComboBox->setVisible( haveRegions );
471 }
472 
473 void MonavConfigWidget::downloadMap()
474 {
475  if ( d->m_currentDownload.isEmpty() && !d->m_currentFile.isOpen() ) {
476  d->m_currentDownload = m_regionComboBox->itemData( m_regionComboBox->currentIndex() ).toString();
477  d->install();
478  }
479 }
480 
481 void MonavConfigWidget::cancelOperation()
482 {
483  if ( !d->m_currentDownload.isEmpty() || d->m_currentFile.isOpen() ) {
484  d->m_currentReply->abort();
485  d->m_currentReply->deleteLater();
486  d->m_currentReply = 0;
487  d->m_currentDownload.clear();
488  d->setBusy( false );
489  d->m_currentFile.close();
490  }
491 }
492 
493 void MonavConfigWidgetPrivate::install()
494 {
495  if ( !m_currentDownload.isEmpty() ) {
496  int const index = m_currentDownload.lastIndexOf( "/");
497  QString localFile = MarbleDirs::localPath() + "/maps" + m_currentDownload.mid( index );
498  m_currentFile.setFileName( localFile );
499  if ( m_currentFile.open( QFile::WriteOnly ) ) {
500  QFileInfo file( m_currentFile );
501  QString message = QObject::tr( "Downloading %1" ).arg( file.fileName() );
502  setBusy( true, message );
503  m_currentReply = m_networkAccessManager.get( QNetworkRequest( m_currentDownload ) );
504  QObject::connect( m_currentReply, SIGNAL(readyRead()),
505  m_parent, SLOT(retrieveData()) );
506  QObject::connect( m_currentReply, SIGNAL(readChannelFinished()),
507  m_parent, SLOT(retrieveData()) );
508  QObject::connect( m_currentReply, SIGNAL(downloadProgress(qint64,qint64)),
509  m_parent, SLOT(updateProgressBar(qint64,qint64)) );
510  } else {
511  mDebug() << "Failed to write to " << localFile;
512  }
513  }
514 }
515 
516 void MonavConfigWidgetPrivate::installMap()
517 {
518  if ( m_unpackProcess ) {
519  m_unpackProcess->close();
520  delete m_unpackProcess;
521  m_unpackProcess = 0;
522  m_parent->m_installButton->setEnabled( true );
523  } else if ( m_currentFile.fileName().endsWith( QLatin1String( "tar.gz" ) ) && canExecute( "tar" ) ) {
524  QFileInfo file( m_currentFile );
525  QString message = QObject::tr( "Installing %1" ).arg( file.fileName() );
526  setBusy( true, message );
527  m_parent->m_progressBar->setMaximum( 0 );
528  if ( file.exists() && file.isReadable() ) {
529  m_unpackProcess = new QProcess;
530  QObject::connect( m_unpackProcess, SIGNAL(finished(int)),
531  m_parent, SLOT(mapInstalled(int)) );
532  QStringList arguments = QStringList() << "-x" << "-z" << "-f" << file.fileName();
533  m_unpackProcess->setWorkingDirectory( file.dir().absolutePath() );
534  m_unpackProcess->start( "tar", arguments );
535  }
536  } else {
537  if ( !m_currentFile.fileName().endsWith( QLatin1String( "tar.gz" ) ) ) {
538  mDebug() << "Can only handle tar.gz files";
539  } else {
540  mDebug() << "Cannot extract archive: tar executable not found in PATH.";
541  }
542  }
543 }
544 
545 void MonavConfigWidget::updateProgressBar( qint64 bytesReceived, qint64 bytesTotal )
546 {
547  // Coarse MB resolution for the text to get it short,
548  // finer Kb resolution for the progress values to see changes easily
549  m_progressBar->setMaximum( bytesTotal / 1024 );
550  m_progressBar->setValue( bytesReceived / 1024 );
551  QString progress = "%1/%2 MB";
552  m_progressBar->setFormat( progress.arg( bytesReceived / 1024 / 1024 ).arg( bytesTotal / 1024 / 1024 ) );
553 }
554 
555 bool MonavConfigWidgetPrivate::canExecute( const QString &executable )
556 {
557  QString path = QProcessEnvironment::systemEnvironment().value( "PATH", "/usr/local/bin:/usr/bin:/bin" );
558  foreach( const QString &dir, path.split( QLatin1Char( ':' ) ) ) {
559  QFileInfo application( QDir( dir ), executable );
560  if ( application.exists() ) {
561  return true;
562  }
563  }
564 
565  return false;
566 }
567 
568 void MonavConfigWidget::mapInstalled( int exitStatus )
569 {
570  d->m_unpackProcess = 0;
571  d->m_currentFile.remove();
572  d->setBusy( false );
573 
574  if ( exitStatus == 0 ) {
575  d->m_plugin->reloadMaps();
576  d->updateInstalledMapsView();
577  monavTabWidget->setCurrentIndex( 0 );
578  } else {
579  mDebug() << "Error when unpacking archive, process exited with status code " << exitStatus;
580  }
581 }
582 
583 void MonavConfigWidget::showEvent ( QShowEvent * event )
584 {
585  // Lazy initialization
586  RoutingRunnerPlugin::ConfigWidget::showEvent( event );
587  if ( !event->spontaneous() && !d->m_initialized ) {
588  d->m_initialized = true;
589  d->updateInstalledMapsView();
590  QUrl url = QUrl( "http://files.kde.org/marble/newstuff/maps-monav.xml" );
591  d->m_networkAccessManager.get( QNetworkRequest( url ) );
592  }
593 }
594 
595 void MonavConfigWidgetPrivate::updateInstalledMapsView()
596 {
597  m_mapsModel = m_plugin->installedMapsModel();
598  m_mapsModel->setInstallableVersions( m_remoteVersions );
599  m_filteredModel->setSourceModel( m_mapsModel );
600  m_parent->m_installedMapsListView->setModel( m_mapsModel );
601 
602  m_parent->m_configureMapsListView->setColumnHidden( 1, true );
603  m_parent->m_installedMapsListView->setColumnHidden( 2, true );
604  m_parent->m_configureMapsListView->setColumnHidden( 3, true );
605  m_parent->m_configureMapsListView->setColumnHidden( 4, true );
606  m_parent->m_installedMapsListView->setColumnHidden( 5, true );
607 
608  m_parent->m_configureMapsListView->horizontalHeader()->setVisible( true );
609  m_parent->m_installedMapsListView->horizontalHeader()->setVisible( true );
610  m_parent->m_configureMapsListView->resizeColumnsToContents();
611  m_parent->m_installedMapsListView->resizeColumnsToContents();
612 
613  updateTransportPreference();
614  updateInstalledMapsViewButtons();
615 }
616 
617 void MonavConfigWidgetPrivate::updateInstalledMapsViewButtons()
618 {
619  m_removeMapSignalMapper.removeMappings( m_parent );
620  m_upgradeMapSignalMapper.removeMappings( m_parent );
621  for( int i=0; i<m_mapsModel->rowCount(); ++i ) {
622  {
623  QPushButton* button = new QPushButton( QIcon( ":/system-software-update.png" ), "" );
624  button->setAutoFillBackground( true );
625  QModelIndex index = m_mapsModel->index( i, 3 );
626  m_parent->m_installedMapsListView->setIndexWidget( index, button );
627  m_upgradeMapSignalMapper.setMapping( button, index.row() );
628  QObject::connect( button, SIGNAL(clicked()), &m_upgradeMapSignalMapper, SLOT(map()) );
629  bool upgradable = m_mapsModel->data( index ).toBool();
630  QString canUpgradeText = QObject::tr( "An update is available. Click to install it." );
631  QString isLatestText = QObject::tr( "No update available. You are running the latest version." );
632  button->setToolTip( upgradable ? canUpgradeText : isLatestText );
633  button->setEnabled( upgradable );
634  }
635  {
636  QPushButton* button = new QPushButton( QIcon( ":/edit-delete.png" ), "" );
637  button->setAutoFillBackground( true );
638  QModelIndex index = m_mapsModel->index( i, 4 );
639  m_parent->m_installedMapsListView->setIndexWidget( index, button );
640  m_removeMapSignalMapper.setMapping( button, index.row() );
641  QObject::connect( button, SIGNAL(clicked()), &m_removeMapSignalMapper, SLOT(map()) );
642  bool const writable = m_mapsModel->data( index ).toBool();
643  button->setEnabled( writable );
644  }
645  }
646  m_parent->m_installedMapsListView->resizeColumnsToContents();
647 }
648 
649 void MonavConfigWidget::updateTransportTypeFilter( const QString &filter )
650 {
651  d->m_filteredModel->setFilterFixedString( filter );
652  d->m_transport = filter;
653  m_configureMapsListView->resizeColumnsToContents();
654 }
655 
656 void MonavConfigWidget::removeMap( int index )
657 {
658  QMessageBox::StandardButtons buttons = QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel;
659  QString text = tr( "Are you sure you want to delete this map from the system?" );
660  if ( QMessageBox::question( this, tr( "Remove Map" ), text, buttons, QMessageBox::No ) == QMessageBox::Yes ) {
661  d->m_mapsModel->deleteMapFiles( index );
662  d->m_plugin->reloadMaps();
663  d->updateInstalledMapsView();
664  }
665 }
666 
667 void MonavConfigWidget::upgradeMap( int index )
668 {
669  QString payload = d->m_mapsModel->payload( index );
670  if ( !payload.isEmpty() ) {
671  foreach( const MonavStuffEntry &entry, d->m_remoteMaps ) {
672  if ( entry.payload().endsWith( '/' + payload ) ) {
673  d->m_currentDownload = entry.payload();
674  d->install();
675  return;
676  }
677  }
678  }
679 }
680 
681 void MonavConfigWidgetPrivate::setBusy( bool busy, const QString &message ) const
682 {
683  if ( busy ) {
684  m_parent->m_stackedWidget->removeWidget( m_parent->m_settingsPage );
685  m_parent->m_stackedWidget->addWidget( m_parent->m_progressPage );
686  } else {
687  m_parent->m_stackedWidget->removeWidget( m_parent->m_progressPage );
688  m_parent->m_stackedWidget->addWidget( m_parent->m_settingsPage );
689  }
690 
691  QString const defaultMessage = QObject::tr( "Nothing to do." );
692  m_parent->m_progressLabel->setText( message.isEmpty() ? defaultMessage : message );
693 }
694 
695 }
696 
697 #include "MonavConfigWidget.moc"
QVariant::toUrl
QUrl toUrl() const
QModelIndex
QDomElement::elementsByTagName
QDomNodeList elementsByTagName(const QString &tagname) const
QDomNodeList::item
QDomNode item(int index) const
QWidget::setupUi
void setupUi(QWidget *widget)
QMessageBox::StandardButtons
typedef StandardButtons
QByteArray
QString::split
QStringList split(const QString &sep, SplitBehavior behavior, Qt::CaseSensitivity cs) const
QNetworkReply
QDomNodeList
Marble::MonavPlugin
Definition: MonavPlugin.h:23
QList::at
const T & at(int i) const
QMap< QString, QString >
QComboBox::clear
void clear()
Marble::MarbleDirs::localPath
static QString localPath()
Definition: MarbleDirs.cpp:223
QDomDocument::documentElement
QDomElement documentElement() const
QDomNode
Marble::MonavConfigWidget::loadSettings
virtual void loadSettings(const QHash< QString, QVariant > &settings)
Definition: MonavConfigWidget.cpp:361
QIODevice::isReadable
bool isReadable() const
Marble::MonavConfigWidget::MonavConfigWidget
MonavConfigWidget(MonavPlugin *plugin)
Definition: MonavConfigWidget.cpp:327
MonavPlugin.h
QObject::disconnect
bool disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
MarbleDebug.h
QObject::tr
QString tr(const char *sourceText, const char *disambiguation, int n)
Marble::MonavConfigWidget::settings
virtual QHash< QString, QVariant > settings() const
Definition: MonavConfigWidget.cpp:391
QFile
QProcessEnvironment::value
QString value(const QString &name, const QString &defaultValue) const
QList::size
int size() const
QString::lastIndexOf
int lastIndexOf(QChar ch, int from, Qt::CaseSensitivity cs) const
QComboBox::addItem
void addItem(const QString &text, const QVariant &userData)
QDomNode::toElement
QDomElement toElement() const
MonavMapsModel.h
QRegExp
QNetworkRequest
QWidget::setEnabled
void setEnabled(bool)
QWidget::showEvent
virtual void showEvent(QShowEvent *event)
QMapIterator
QDomElement::text
QString text() const
QVariant::isNull
bool isNull() const
Marble::MonavConfigWidget::~MonavConfigWidget
~MonavConfigWidget()
Definition: MonavConfigWidget.cpp:356
QHash< QString, QVariant >
QMessageBox::question
StandardButton question(QWidget *parent, const QString &title, const QString &text, QFlags< QMessageBox::StandardButton > buttons, StandardButton defaultButton)
QProcess
QShowEvent
QList::isEmpty
bool isEmpty() const
MarbleDirs.h
QString::isEmpty
bool isEmpty() const
QModelIndex::row
int row() const
QIODevice::readAll
QByteArray readAll()
QEvent::spontaneous
bool spontaneous() const
QSet< QString >
QString
QtConcurrent::map
QFuture< void > map(Sequence &sequence, MapFunction function)
QStringList
QFileInfo
Marble::RoutingRunnerPlugin::statusMessage
QString statusMessage() const
A status message showing whether the plugin will be able to deliver results.
Definition: RoutingRunnerPlugin.cpp:96
QUrl
QLatin1Char
QSortFilterProxyModel
QDomDocument
QDir
QNetworkAccessManager
Marble::MonavConfigWidget::showEvent
virtual void showEvent(QShowEvent *event)
Definition: MonavConfigWidget.cpp:583
QString::mid
QString mid(int position, int n) const
QVector< MonavStuffEntry >
QTest::toString
char * toString(const T &value)
QLatin1String
QList::last
T & last()
QNetworkReply::attribute
QVariant attribute(QNetworkRequest::Attribute code) const
QSet::toList
QList< T > toList() const
QPushButton
QMap::insert
iterator insert(const Key &key, const T &value)
QWidget::setAutoFillBackground
void setAutoFillBackground(bool enabled)
QComboBox::addItems
void addItems(const QStringList &texts)
QProcessEnvironment::systemEnvironment
QProcessEnvironment systemEnvironment()
MonavConfigWidget.h
QWidget::setToolTip
void setToolTip(const QString &)
QDomNodeList::size
int size() const
QDomNodeList::length
uint length() const
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QDomElement
QString::arg
QString arg(qlonglong a, int fieldWidth, int base, const QChar &fillChar) const
Marble::mDebug
QDebug mDebug()
a function to replace qDebug() in Marble library code
Definition: MarbleDebug.cpp:36
QSignalMapper
QIcon
QDomNodeList::at
QDomNode at(int index) const
QDomDocument::setContent
bool setContent(const QByteArray &data, bool namespaceProcessing, QString *errorMsg, int *errorLine, int *errorColumn)
QVariant
QComboBox
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:13:41 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