• 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
AbstractDataPluginModel.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 2009 Bastian Holst <bastianholst@gmx.de>
9 //
10 
11 // Self
12 #include "AbstractDataPluginModel.h"
13 
14 // Qt
15 #include <QUrl>
16 #include <QTimer>
17 #include <QPointF>
18 #include <QtAlgorithms>
19 #include <QVariant>
20 #include <QAbstractListModel>
21 #include <QMetaProperty>
22 
23 // Marble
24 #include "MarbleDebug.h"
25 #include "AbstractDataPluginItem.h"
26 #include "CacheStoragePolicy.h"
27 #include "GeoDataCoordinates.h"
28 #include "GeoDataLatLonAltBox.h"
29 #include "HttpDownloadManager.h"
30 #include "MarbleModel.h"
31 #include "MarbleDirs.h"
32 #include "ViewportParams.h"
33 
34 #include <cmath>
35 
36 namespace Marble
37 {
38 
39 const QString descriptionPrefix( "description_" );
40 
41 // Time between two tried description file downloads (we decided not to download anything) in ms
42 const int timeBetweenTriedDownloads = 500;
43 // Time between two real description file downloads in ms
44 const int timeBetweenDownloads = 1500;
45 
46 // The factor describing how much the box has to be changed to download a new description file.
47 // A higher factor means more downloads.
48 const qreal boxComparisonFactor = 16.0;
49 
50 // Separator to separate the id of the item from the file type
51 const char fileIdSeparator = '_';
52 
53 class FavoritesModel;
54 
55 class AbstractDataPluginModelPrivate
56 {
57 public:
58  AbstractDataPluginModelPrivate( const QString& name,
59  const MarbleModel *marbleModel,
60  AbstractDataPluginModel * parent );
61 
62  ~AbstractDataPluginModelPrivate();
63 
64  void updateFavoriteItems();
65 
66  AbstractDataPluginModel *m_parent;
67  const QString m_name;
68  const MarbleModel *const m_marbleModel;
69  GeoDataLatLonAltBox m_lastBox;
70  GeoDataLatLonAltBox m_downloadedBox;
71  qint32 m_lastNumber;
72  qint32 m_downloadedNumber;
73  QString m_downloadedTarget;
74  QList<AbstractDataPluginItem*> m_itemSet;
75  QHash<QString, AbstractDataPluginItem*> m_downloadingItems;
76  QList<AbstractDataPluginItem*> m_displayedItems;
77  QTimer m_downloadTimer;
78  quint32 m_descriptionFileNumber;
79  QHash<QString, QVariant> m_itemSettings;
80  QStringList m_favoriteItems;
81  bool m_favoriteItemsOnly;
82 
83  CacheStoragePolicy m_storagePolicy;
84  HttpDownloadManager m_downloadManager;
85  FavoritesModel* m_favoritesModel;
86  QMetaObject m_metaObject;
87  bool m_hasMetaObject;
88  bool m_needsSorting;
89 };
90 
91 class FavoritesModel : public QAbstractListModel
92 {
93 public:
94  AbstractDataPluginModelPrivate* d;
95 
96  explicit FavoritesModel( AbstractDataPluginModelPrivate* d, QObject* parent = 0 );
97 
98  virtual int rowCount ( const QModelIndex & parent = QModelIndex() ) const;
99 
100  QVariant data ( const QModelIndex & index, int role = Qt::DisplayRole ) const;
101 
102  void reset();
103 
104 #if QT_VERSION >= 0x050000
105  QHash<int, QByteArray> roleNames() const;
106 
107 private:
108  QHash<int, QByteArray> m_roleNames;
109 #endif
110 };
111 
112 AbstractDataPluginModelPrivate::AbstractDataPluginModelPrivate( const QString& name,
113  const MarbleModel *marbleModel,
114  AbstractDataPluginModel * parent )
115  : m_parent( parent ),
116  m_name( name ),
117  m_marbleModel( marbleModel ),
118  m_lastBox(),
119  m_downloadedBox(),
120  m_lastNumber( 0 ),
121  m_downloadedNumber( 0 ),
122  m_downloadTimer( m_parent ),
123  m_descriptionFileNumber( 0 ),
124  m_itemSettings(),
125  m_favoriteItemsOnly( false ),
126  m_storagePolicy( MarbleDirs::localPath() + "/cache/" + m_name + '/' ),
127  m_downloadManager( &m_storagePolicy ),
128  m_favoritesModel( 0 ),
129  m_hasMetaObject( false ),
130  m_needsSorting( false )
131 {
132 }
133 
134 AbstractDataPluginModelPrivate::~AbstractDataPluginModelPrivate() {
135  QList<AbstractDataPluginItem*>::iterator lIt = m_itemSet.begin();
136  QList<AbstractDataPluginItem*>::iterator const lItEnd = m_itemSet.end();
137  for (; lIt != lItEnd; ++lIt ) {
138  (*lIt)->deleteLater();
139  }
140 
141  QHash<QString,AbstractDataPluginItem*>::iterator hIt = m_downloadingItems.begin();
142  QHash<QString,AbstractDataPluginItem*>::iterator const hItEnd = m_downloadingItems.end();
143  for (; hIt != hItEnd; ++hIt ) {
144  (*hIt)->deleteLater();
145  }
146 
147  m_storagePolicy.clearCache();
148 }
149 
150 void AbstractDataPluginModelPrivate::updateFavoriteItems()
151 {
152  if ( m_favoriteItemsOnly ) {
153  foreach( const QString &id, m_favoriteItems ) {
154  if ( !m_parent->findItem( id ) ) {
155  m_parent->getItem( id );
156  }
157  }
158  }
159 }
160 
161 static bool lessThanByPointer( const AbstractDataPluginItem *item1,
162  const AbstractDataPluginItem *item2 )
163 {
164  if( item1 && item2 ) {
165  // Compare by sticky and favorite status (sticky first, then favorites), last by operator<
166  bool const sticky1 = item1->isSticky();
167  bool const favorite1 = item1->isFavorite();
168  if ( sticky1 != item2->isSticky() ) {
169  return sticky1;
170  } else if ( favorite1 != item2->isFavorite() ) {
171  return favorite1;
172  } else {
173  return item1->operator<( item2 );
174  }
175  }
176  else {
177  return false;
178  }
179 }
180 
181 FavoritesModel::FavoritesModel( AbstractDataPluginModelPrivate *_d, QObject* parent ) :
182  QAbstractListModel( parent ), d(_d)
183 {
184  QHash<int,QByteArray> roles;
185  int const size = d->m_hasMetaObject ? d->m_metaObject.propertyCount() : 0;
186  for ( int i=0; i<size; ++i ) {
187  QMetaProperty property = d->m_metaObject.property( i );
188  roles[Qt::UserRole+i] = property.name();
189  }
190  roles[Qt::DisplayRole] = "display";
191  roles[Qt::DecorationRole] = "decoration";
192 #if QT_VERSION < 0x050000
193  setRoleNames( roles );
194 #else
195  m_roleNames = roles;
196 #endif
197 }
198 
199 int FavoritesModel::rowCount ( const QModelIndex &parent ) const
200 {
201  if ( parent.isValid() ) {
202  return 0;
203  }
204 
205  int count = 0;
206  foreach( AbstractDataPluginItem* item, d->m_itemSet ) {
207  if ( item->initialized() && item->isFavorite() ) {
208  ++count;
209  }
210  }
211 
212  return count;
213 }
214 
215 QVariant FavoritesModel::data( const QModelIndex &index, int role ) const
216 {
217  int const row = index.row();
218  if ( row >= 0 && row < rowCount() ) {
219  int count = 0;
220  foreach( AbstractDataPluginItem* item, d->m_itemSet ) {
221  if ( item->initialized() && item->isFavorite() ) {
222  if ( count == row ) {
223  QString const roleName = roleNames().value( role );
224  return item->property( roleName.toLatin1() );
225  }
226  ++count;
227  }
228  }
229  }
230 
231  return QVariant();
232 }
233 
234 void FavoritesModel::reset()
235 {
236  beginResetModel();
237  endResetModel();
238 }
239 
240 #if QT_VERSION >= 0x050000
241 QHash<int, QByteArray> FavoritesModel::roleNames() const
242 {
243  return m_roleNames;
244 }
245 #endif
246 
247 AbstractDataPluginModel::AbstractDataPluginModel( const QString &name, const MarbleModel *marbleModel, QObject *parent )
248  : QObject( parent ),
249  d( new AbstractDataPluginModelPrivate( name, marbleModel, this ) )
250 {
251  Q_ASSERT( marbleModel != 0 );
252 
253  // Initializing file and download System
254  connect( &d->m_downloadManager, SIGNAL(downloadComplete(QString,QString)),
255  this , SLOT(processFinishedJob(QString,QString)) );
256 
257  // We want to download a new description file every timeBetweenDownloads ms
258  connect( &d->m_downloadTimer, SIGNAL(timeout()),
259  this, SLOT(handleChangedViewport()),
260  Qt::QueuedConnection );
261  d->m_downloadTimer.start( timeBetweenDownloads );
262 }
263 
264 AbstractDataPluginModel::~AbstractDataPluginModel()
265 {
266  delete d;
267 }
268 
269 const MarbleModel *AbstractDataPluginModel::marbleModel() const
270 {
271  return d->m_marbleModel;
272 }
273 
274 QList<AbstractDataPluginItem*> AbstractDataPluginModel::items( const ViewportParams *viewport,
275  qint32 number )
276 {
277  GeoDataLatLonAltBox currentBox = viewport->viewLatLonAltBox();
278  QString target = d->m_marbleModel->planetId();
279  QList<AbstractDataPluginItem*> list;
280 
281  Q_ASSERT( !d->m_displayedItems.contains( 0 ) && "Null item in m_displayedItems. Please report a bug to marble-devel@kde.org" );
282  Q_ASSERT( !d->m_itemSet.contains( 0 ) && "Null item in m_itemSet. Please report a bug to marble-devel@kde.org" );
283 
284  QList<AbstractDataPluginItem*> candidates = d->m_displayedItems + d->m_itemSet;
285 
286  if ( d->m_needsSorting ) {
287  // Both the candidates list and the list of all items need to be sorted
288  qSort( candidates.begin(), candidates.end(), lessThanByPointer );
289  qSort( d->m_itemSet.begin(), d->m_itemSet.end(), lessThanByPointer );
290  d->m_needsSorting = false;
291  }
292 
293  QList<AbstractDataPluginItem*>::const_iterator i = candidates.constBegin();
294  QList<AbstractDataPluginItem*>::const_iterator end = candidates.constEnd();
295 
296  // Items that are already shown have the highest priority
297  for (; i != end && list.size() < number; ++i ) {
298  // Only show items that are initialized
299  if( !(*i)->initialized() ) {
300  continue;
301  }
302 
303  // Only show items that are on the current planet
304  if( (*i)->target() != target ) {
305  continue;
306  }
307 
308  // Hide non-favorite items if necessary
309  if( d->m_favoriteItemsOnly && !(*i)->isFavorite() ) {
310  continue;
311  }
312 
313  (*i)->setProjection( viewport );
314  if( (*i)->positions().isEmpty() ) {
315  continue;
316  }
317 
318  // If the item was added initially at a nearer position, they don't have priority,
319  // because we zoomed out since then.
320  bool const alreadyDisplayed = d->m_displayedItems.contains( *i );
321  if( !list.contains( *i ) && ( !alreadyDisplayed || (*i)->addedAngularResolution() >= viewport->angularResolution() ) ) {
322  bool collides = false;
323  int const length = list.length();
324  for ( int j=0; !collides && j<length; ++j ) {
325  foreach( const QRectF &rect, list[j]->boundingRects() ) {
326  foreach( const QRectF &itemRect, (*i)->boundingRects() ) {
327  if ( rect.intersects( itemRect ) )
328  collides = true;
329  }
330  }
331  }
332 
333  if ( !collides ) {
334  list.append( *i );
335  (*i)->setSettings( d->m_itemSettings );
336 
337  // We want to save the angular resolution of the first time the item got added.
338  if( !alreadyDisplayed ) {
339  (*i)->setAddedAngularResolution( viewport->angularResolution() );
340  }
341  }
342  }
343  // TODO: Do we have to cleanup at some point? The list of all items keeps growing
344  }
345 
346  d->m_lastBox = currentBox;
347  d->m_lastNumber = number;
348  d->m_displayedItems = list;
349  return list;
350 }
351 
352 QList<AbstractDataPluginItem *> AbstractDataPluginModel::whichItemAt( const QPoint& curpos )
353 {
354  QList<AbstractDataPluginItem *> itemsAt;
355 
356  foreach( AbstractDataPluginItem* item, d->m_displayedItems ) {
357  if( item && item->contains( QPointF( curpos ) ) )
358  itemsAt.append( item );
359  }
360 
361  return itemsAt;
362 }
363 
364 void AbstractDataPluginModel::parseFile( const QByteArray& file )
365 {
366  Q_UNUSED( file );
367 }
368 
369 void AbstractDataPluginModel::downloadItemData( const QUrl& url,
370  const QString& type,
371  AbstractDataPluginItem *item )
372 {
373  downloadItem( url, type, item );
374  connect( item, SIGNAL(destroyed(QObject*)), this, SLOT(removeItem(QObject*)) );
375  addItemToList( item );
376 }
377 
378 void AbstractDataPluginModel::downloadItem( const QUrl& url,
379  const QString& type,
380  AbstractDataPluginItem *item )
381 {
382  if( !item ) {
383  return;
384  }
385 
386  QString id = generateFilename( item->id(), type );
387 
388  d->m_downloadManager.addJob( url, id, id, DownloadBrowse );
389  d->m_downloadingItems.insert( id, item );
390 }
391 
392 void AbstractDataPluginModel::downloadDescriptionFile( const QUrl& url )
393 {
394  if( !url.isEmpty() ) {
395  QString name( descriptionPrefix );
396  name += QString::number( d->m_descriptionFileNumber );
397 
398  d->m_downloadManager.addJob( url, name, name, DownloadBrowse );
399  d->m_descriptionFileNumber++;
400  }
401 }
402 
403 void AbstractDataPluginModel::addItemToList( AbstractDataPluginItem *item )
404 {
405  addItemsToList( QList<AbstractDataPluginItem*>() << item );
406 }
407 
408 void AbstractDataPluginModel::addItemsToList( const QList<AbstractDataPluginItem *> &items )
409 {
410  bool needsUpdate = false;
411  bool favoriteChanged = false;
412  foreach( AbstractDataPluginItem *item, items ) {
413  if( !item ) {
414  continue;
415  }
416 
417  // If the item is already in our list, don't add it.
418  if ( d->m_itemSet.contains( item ) ) {
419  continue;
420  }
421 
422  if( itemExists( item->id() ) ) {
423  item->deleteLater();
424  continue;
425  }
426 
427  mDebug() << "New item " << item->id();
428 
429  // This find the right position in the sorted to insert the new item
430  QList<AbstractDataPluginItem*>::iterator i = qLowerBound( d->m_itemSet.begin(),
431  d->m_itemSet.end(),
432  item,
433  lessThanByPointer );
434  // Insert the item on the right position in the list
435  d->m_itemSet.insert( i, item );
436 
437  connect( item, SIGNAL(stickyChanged()), this, SLOT(scheduleItemSort()) );
438  connect( item, SIGNAL(destroyed(QObject*)), this, SLOT(removeItem(QObject*)) );
439  connect( item, SIGNAL(updated()), this, SIGNAL(itemsUpdated()) );
440  connect( item, SIGNAL(favoriteChanged(QString,bool)), this,
441  SLOT(favoriteItemChanged(QString,bool)) );
442 
443  if ( !needsUpdate && item->initialized() ) {
444  needsUpdate = true;
445  }
446 
447  if ( !favoriteChanged && item->initialized() && item->isFavorite() ) {
448  favoriteChanged = true;
449  }
450  }
451 
452  if ( favoriteChanged && d->m_favoritesModel ) {
453  d->m_favoritesModel->reset();
454  }
455 
456  if ( needsUpdate ) {
457  emit itemsUpdated();
458  }
459 }
460 
461 void AbstractDataPluginModel::getItem( const QString & )
462 {
463  qWarning() << "Retrieving items by identifier is not implemented by this plugin";
464 }
465 
466 void AbstractDataPluginModel::setFavoriteItems( const QStringList& list )
467 {
468  if ( d->m_favoriteItems != list) {
469  d->m_favoriteItems = list;
470  d->updateFavoriteItems();
471  if ( d->m_favoritesModel ) {
472  d->m_favoritesModel->reset();
473  }
474  emit favoriteItemsChanged( d->m_favoriteItems );
475  }
476 }
477 
478 QStringList AbstractDataPluginModel::favoriteItems() const
479 {
480  return d->m_favoriteItems;
481 }
482 
483 void AbstractDataPluginModel::setFavoriteItemsOnly( bool favoriteOnly )
484 {
485  if ( isFavoriteItemsOnly() != favoriteOnly ) {
486  d->m_favoriteItemsOnly = favoriteOnly;
487  d->updateFavoriteItems();
488  emit favoriteItemsOnlyChanged();
489  }
490 }
491 
492 bool AbstractDataPluginModel::isFavoriteItemsOnly() const
493 {
494  return d->m_favoriteItemsOnly;
495 }
496 
497 QObject *AbstractDataPluginModel::favoritesModel()
498 {
499  if ( !d->m_favoritesModel ) {
500  d->m_favoritesModel = new FavoritesModel( d, this );
501  d->updateFavoriteItems();
502  }
503 
504  return d->m_favoritesModel;
505 }
506 
507 void AbstractDataPluginModel::favoriteItemChanged( const QString& id, bool isFavorite )
508 {
509  QStringList favorites = d->m_favoriteItems;
510 
511  if ( isFavorite ) {
512  if ( !favorites.contains(id) )
513  favorites.append( id );
514  } else {
515  favorites.removeOne( id );
516  }
517 
518  setFavoriteItems( favorites );
519  scheduleItemSort();
520 }
521 
522 void AbstractDataPluginModel::scheduleItemSort()
523 {
524  d->m_needsSorting = true;
525 }
526 
527 QString AbstractDataPluginModel::generateFilename( const QString& id, const QString& type ) const
528 {
529  QString name;
530  name += id;
531  name += fileIdSeparator;
532  name += type;
533 
534  return name;
535 }
536 
537 QString AbstractDataPluginModel::generateFilepath( const QString& id, const QString& type ) const
538 {
539  return MarbleDirs::localPath() + "/cache/" + d->m_name + '/' + generateFilename( id, type );
540 }
541 
542 bool AbstractDataPluginModel::fileExists( const QString& fileName ) const
543 {
544  return d->m_storagePolicy.fileExists( fileName );
545 }
546 
547 bool AbstractDataPluginModel::fileExists( const QString& id, const QString& type ) const
548 {
549  return fileExists( generateFilename( id, type ) );
550 }
551 
552 AbstractDataPluginItem *AbstractDataPluginModel::findItem( const QString& id ) const
553 {
554  foreach ( AbstractDataPluginItem *item, d->m_itemSet ) {
555  if( item->id() == id ) {
556  return item;
557  }
558  }
559 
560  return 0;
561 }
562 
563 bool AbstractDataPluginModel::itemExists( const QString& id ) const
564 {
565  return findItem( id );
566 }
567 
568 void AbstractDataPluginModel::setItemSettings( QHash<QString,QVariant> itemSettings )
569 {
570  d->m_itemSettings = itemSettings;
571 }
572 
573 void AbstractDataPluginModel::handleChangedViewport()
574 {
575  if( d->m_favoriteItemsOnly ) {
576  return;
577  }
578 
579  // All this is to prevent to often downloads
580  if( d->m_lastNumber != 0
581  // We don't need to download if nothing changed
582  && ( !( d->m_downloadedBox == d->m_lastBox )
583  || d->m_downloadedNumber != d->m_lastNumber
584  || d->m_downloadedTarget != d->m_marbleModel->planetId() )
585  // We try to filter little changes of the bounding box
586  && ( fabs( d->m_downloadedBox.east() - d->m_lastBox.east() ) * boxComparisonFactor
587  > d->m_lastBox.width()
588  || fabs( d->m_downloadedBox.south() - d->m_lastBox.south() ) * boxComparisonFactor
589  > d->m_lastBox.height()
590  || fabs( d->m_downloadedBox.north() - d->m_lastBox.north() ) * boxComparisonFactor
591  > d->m_lastBox.height()
592  || fabs( d->m_downloadedBox.west() - d->m_lastBox.west() ) * boxComparisonFactor
593  > d->m_lastBox.width() ) )
594  {
595  // We will wait a little bit longer to start the
596  // next download as we will really download something now.
597  d->m_downloadTimer.setInterval( timeBetweenDownloads );
598 
599  // Save the download parameter
600  d->m_downloadedBox = d->m_lastBox;
601  d->m_downloadedNumber = d->m_lastNumber;
602  d->m_downloadedTarget = d->m_marbleModel->planetId();
603 
604  // Get items
605  getAdditionalItems( d->m_lastBox, d->m_lastNumber );
606  }
607  else {
608  // Don't wait to long to start the next download as we decided not to download anything.
609  // This will enhance response.
610  d->m_downloadTimer.setInterval( timeBetweenTriedDownloads );
611  }
612 }
613 
614 void AbstractDataPluginModel::processFinishedJob( const QString& relativeUrlString,
615  const QString& id )
616 {
617  Q_UNUSED( relativeUrlString );
618 
619  if( id.startsWith( descriptionPrefix ) ) {
620  parseFile( d->m_storagePolicy.data( id ) );
621  }
622  else {
623  // The downloaded file contains item data.
624 
625  // Splitting the id in itemId and fileType
626  QStringList fileInformation = id.split( fileIdSeparator );
627 
628  if( fileInformation.size() < 2) {
629  mDebug() << "Strange file information " << id;
630  return;
631  }
632  QString itemId = fileInformation.at( 0 );
633  fileInformation.removeAt( 0 );
634  QString fileType = fileInformation.join( QString( fileIdSeparator ) );
635 
636  // Searching for the right item in m_downloadingItems
637  QHash<QString, AbstractDataPluginItem *>::iterator i = d->m_downloadingItems.find( id );
638  if( i != d->m_downloadingItems.end() ) {
639  if( itemId != (*i)->id() ) {
640  return;
641  }
642 
643  (*i)->addDownloadedFile( generateFilepath( itemId, fileType ),
644  fileType );
645 
646  d->m_downloadingItems.erase( i );
647  }
648  }
649 }
650 
651 void AbstractDataPluginModel::removeItem( QObject *item )
652 {
653  AbstractDataPluginItem * pluginItem = qobject_cast<AbstractDataPluginItem*>( item );
654  d->m_itemSet.removeAll( pluginItem );
655  QHash<QString, AbstractDataPluginItem *>::iterator i;
656  for( i = d->m_downloadingItems.begin(); i != d->m_downloadingItems.end(); ++i ) {
657  if( *i == pluginItem ) {
658  i = d->m_downloadingItems.erase( i );
659  }
660  }
661 }
662 
663 void AbstractDataPluginModel::clear()
664 {
665  d->m_displayedItems.clear();
666  QList<AbstractDataPluginItem*>::iterator iter = d->m_itemSet.begin();
667  QList<AbstractDataPluginItem*>::iterator const end = d->m_itemSet.end();
668  for (; iter != end; ++iter ) {
669  (*iter)->deleteLater();
670  }
671  d->m_itemSet.clear();
672  emit itemsUpdated();
673 }
674 
675 void AbstractDataPluginModel::registerItemProperties( const QMetaObject &item )
676 {
677  d->m_metaObject = item;
678  d->m_hasMetaObject = true;
679 }
680 
681 } // namespace Marble
682 
683 #include "AbstractDataPluginModel.moc"
QModelIndex
GeoDataCoordinates.h
Marble::AbstractDataPluginModel::items
QList< AbstractDataPluginItem * > items(const ViewportParams *viewport, qint32 number=10)
Get the items on the viewport Returns the currently downloaded images in the viewport.
Definition: AbstractDataPluginModel.cpp:274
Marble::timeBetweenTriedDownloads
const int timeBetweenTriedDownloads
Definition: AbstractDataPluginModel.cpp:42
AbstractDataPluginModel.h
Marble::AbstractDataPluginModel::fileExists
bool fileExists(const QString &fileName) const
Testing the existence of the file fileName.
Definition: AbstractDataPluginModel.cpp:542
QByteArray
Marble::AbstractDataPluginModel::generateFilename
QString generateFilename(const QString &id, const QString &type) const
Generates the filename relative to the download path from id and type.
Definition: AbstractDataPluginModel.cpp:527
QList::length
int length() const
Marble::AbstractDataPluginItem
Definition: AbstractDataPluginItem.h:28
Marble::AbstractDataPluginModel::setFavoriteItems
virtual void setFavoriteItems(const QStringList &list)
Definition: AbstractDataPluginModel.cpp:466
Marble::AbstractDataPluginModel::itemExists
bool itemExists(const QString &id) const
Testing the existence of the item id in the list.
Definition: AbstractDataPluginModel.cpp:563
Marble::AbstractDataPluginModel::~AbstractDataPluginModel
virtual ~AbstractDataPluginModel()
Definition: AbstractDataPluginModel.cpp:264
MarbleModel.h
This file contains the headers for MarbleModel.
Marble::ViewportParams::angularResolution
qreal angularResolution() const
Definition: ViewportParams.cpp:322
QList::at
const T & at(int i) const
QList::removeAt
void removeAt(int i)
QStringList::contains
bool contains(const QString &str, Qt::CaseSensitivity cs) const
HttpDownloadManager.h
Marble::AbstractDataPluginModel
An abstract data model (not based on QAbstractModel) for a AbstractDataPlugin.
Definition: AbstractDataPluginModel.h:45
Marble::ViewportParams::viewLatLonAltBox
const GeoDataLatLonAltBox & viewLatLonAltBox() const
Definition: ViewportParams.cpp:305
Marble::DownloadBrowse
Browsing mode, normal operation of Marble, like a web browser.
Definition: MarbleGlobal.h:166
Marble::AbstractDataPluginModel::marbleModel
const MarbleModel * marbleModel() const
Definition: AbstractDataPluginModel.cpp:269
QRectF::intersects
bool intersects(const QRectF &rectangle) const
Marble::MarbleDirs::localPath
static QString localPath()
Definition: MarbleDirs.cpp:223
Marble::boxComparisonFactor
const qreal boxComparisonFactor
Definition: AbstractDataPluginModel.cpp:48
Marble::AbstractDataPluginItem::isSticky
bool isSticky() const
Definition: AbstractDataPluginItem.cpp:104
QPoint
QStringList::join
QString join(const QString &separator) const
QUrl::isEmpty
bool isEmpty() const
Marble::AbstractDataPluginModel::parseFile
virtual void parseFile(const QByteArray &file)
Parse the file and generate items.
Definition: AbstractDataPluginModel.cpp:364
MarbleDebug.h
Marble::AbstractDataPluginItem::id
QString id() const
Definition: AbstractDataPluginItem.cpp:81
Marble::timeBetweenDownloads
const int timeBetweenDownloads
Definition: AbstractDataPluginModel.cpp:44
Marble::CacheStoragePolicy
Definition: CacheStoragePolicy.h:25
CacheStoragePolicy.h
QList::size
int size() const
Marble::AbstractDataPluginModel::itemsUpdated
void itemsUpdated()
QPointF
QHash::iterator
Marble::AbstractDataPluginModel::downloadDescriptionFile
void downloadDescriptionFile(const QUrl &url)
Download the description file from the url.
Definition: AbstractDataPluginModel.cpp:392
QObject::name
const char * name() const
QModelIndex::isValid
bool isValid() const
QString::number
QString number(int n, int base)
Marble::MarbleGraphicsItem::contains
bool contains(const QPointF &point) const
Returns true if the Item contains point in parent coordinates.
Definition: MarbleGraphicsItem.cpp:110
QList::append
void append(const T &value)
Marble::AbstractDataPluginModel::isFavoriteItemsOnly
bool isFavoriteItemsOnly() const
Definition: AbstractDataPluginModel.cpp:492
QMetaObject
Marble::AbstractDataPluginModel::clear
void clear()
Removes all items.
Definition: AbstractDataPluginModel.cpp:663
QTimer
Marble::AbstractDataPluginModel::setItemSettings
void setItemSettings(QHash< QString, QVariant > itemSettings)
Sets the settings for all items.
Definition: AbstractDataPluginModel.cpp:568
QHash
QObject
Marble::AbstractDataPluginModel::favoriteItemsOnlyChanged
void favoriteItemsOnlyChanged()
QAbstractListModel
MarbleDirs.h
QModelIndex::row
int row() const
Marble::AbstractDataPluginModel::getItem
virtual void getItem(const QString &id)
Retrieve data for a specific item.
Definition: AbstractDataPluginModel.cpp:461
Marble::AbstractDataPluginModel::getAdditionalItems
virtual void getAdditionalItems(const GeoDataLatLonAltBox &box, qint32 number=10)=0
Managing to get number additional items in box.
QObject::deleteLater
void deleteLater()
Marble::lessThanByPointer
static bool lessThanByPointer(const AbstractDataPluginItem *item1, const AbstractDataPluginItem *item2)
Definition: AbstractDataPluginModel.cpp:161
QString
QList< AbstractDataPluginItem * >
Marble::AbstractDataPluginModel::findItem
AbstractDataPluginItem * findItem(const QString &id) const
Finds the item with id in the list.
Definition: AbstractDataPluginModel.cpp:552
QStringList
Marble::ViewportParams
A public class that controls what is visible in the viewport of a Marble map.
Definition: ViewportParams.h:44
Marble::descriptionPrefix
const QString descriptionPrefix("description_")
QList::end
iterator end()
QUrl
QList::contains
bool contains(const T &value) const
ViewportParams.h
This file contains the headers for ViewportParams.
Marble::AbstractDataPluginModel::registerItemProperties
void registerItemProperties(const QMetaObject &item)
Definition: AbstractDataPluginModel.cpp:675
Marble::MarbleModel
The data model (not based on QAbstractModel) for a MarbleWidget.
Definition: MarbleModel.h:97
Marble::AbstractDataPluginItem::initialized
virtual bool initialized() const =0
QString::toLatin1
QByteArray toLatin1() const
Marble::AbstractDataPluginModel::favoriteItems
QStringList favoriteItems() const
Definition: AbstractDataPluginModel.cpp:478
Marble::AbstractDataPluginModel::whichItemAt
QList< AbstractDataPluginItem * > whichItemAt(const QPoint &curpos)
Get all items that contain the given point Returns a list of all items that contain the point curpos...
Definition: AbstractDataPluginModel.cpp:352
QRectF
GeoDataLatLonAltBox.h
Marble::AbstractDataPluginModel::favoritesModel
QObject * favoritesModel()
QStringList::split
QStringList split(const QString &sep, const QString &str, bool allowEmptyEntries)
Marble::AbstractDataPluginModel::setFavoriteItemsOnly
void setFavoriteItemsOnly(bool favoriteOnly)
Definition: AbstractDataPluginModel.cpp:483
Marble::AbstractDataPluginModel::generateFilepath
QString generateFilepath(const QString &id, const QString &type) const
Generates the absolute filepath of the from id and type.
Definition: AbstractDataPluginModel.cpp:537
Marble::AbstractDataPluginModel::addItemToList
void addItemToList(AbstractDataPluginItem *item)
Convenience method to add one item to the list.
Definition: AbstractDataPluginModel.cpp:403
QList::constEnd
const_iterator constEnd() const
QList::constBegin
const_iterator constBegin() const
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
Marble::AbstractDataPluginItem::isFavorite
bool isFavorite() const
Definition: AbstractDataPluginItem.cpp:91
Marble::mDebug
QDebug mDebug()
a function to replace qDebug() in Marble library code
Definition: MarbleDebug.cpp:36
QList::removeOne
bool removeOne(const T &value)
QList::begin
iterator begin()
Marble::AbstractDataPluginModel::downloadItem
void downloadItem(const QUrl &url, const QString &type, AbstractDataPluginItem *item)
Downloads the file from url.
Definition: AbstractDataPluginModel.cpp:378
Marble::GeoDataLatLonAltBox
A class that defines a 3D bounding box for geographic data.
Definition: GeoDataLatLonAltBox.h:49
QObject::destroyed
void destroyed(QObject *obj)
AbstractDataPluginItem.h
QMetaProperty
Marble::AbstractDataPluginModel::addItemsToList
void addItemsToList(const QList< AbstractDataPluginItem * > &items)
Adds the items to the list of initialized items.
Definition: AbstractDataPluginModel.cpp:408
Marble::HttpDownloadManager
This class manages scheduled downloads.
Definition: HttpDownloadManager.h:44
QVariant
Marble::fileIdSeparator
const char fileIdSeparator
Definition: AbstractDataPluginModel.cpp:51
Marble::AbstractDataPluginModel::favoriteItemsChanged
void favoriteItemsChanged(const QStringList &favoriteItems)
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:13:38 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