• 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
  • cloudsync
CloudRouteModel.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 2013 Utku Aydın <utkuaydin34@gmail.com>
9 //
10 
11 #include "CloudRouteModel.h"
12 
13 #include "MarbleDebug.h"
14 #include "MarbleDirs.h"
15 
16 #include <QSet>
17 #include <QVector>
18 #include <QScriptValue>
19 #include <QScriptEngine>
20 #include <QScriptValueIterator>
21 #include <QNetworkAccessManager>
22 
23 namespace Marble {
24 
25 class CloudRouteModel::Private {
26 
27 public:
28  Private();
29 
30  QVector<RouteItem> m_items;
31  QString m_cacheDir;
32  QPersistentModelIndex m_downloading;
33  qint64 m_totalSize;
34  qint64 m_downloadedSize;
35 
36  QNetworkAccessManager m_network;
37  QMap<QNetworkReply*, int> m_previewQueue;
38  QSet<QString> m_requestedPreviews;
39 
40 #if QT_VERSION >= 0x050000
41  QHash<int, QByteArray> m_roleNames;
42 #endif
43 };
44 
45 CloudRouteModel::Private::Private() :
46  m_totalSize( -1 ),
47  m_downloadedSize( 0 )
48 {
49  m_cacheDir = MarbleDirs::localPath() + "/cloudsync/cache/routes/";
50 }
51 
52 CloudRouteModel::CloudRouteModel( QObject* parent ) :
53  QAbstractListModel( parent ), d( new Private() )
54 {
55  connect( &(d->m_network), SIGNAL(finished(QNetworkReply*)),
56  this, SLOT(setPreview(QNetworkReply*)) );
57 
58  QHash<int, QByteArray> roles = roleNames();
59  roles[ Name ] = "name";
60  roles[ Timestamp ] = "identifier";
61  roles[ PreviewUrl ] = "previewUrl";
62  roles[ Distance ] = "distance";
63  roles[ Duration ] = "duration";
64  roles[ IsCached ] = "isCached";
65  roles[ IsDownloading ] = "isDownloading";
66  roles[ IsOnCloud ] = "isOnCloud";
67 #if QT_VERSION < 0x050000
68  setRoleNames( roles );
69 #else
70  d->m_roleNames = roles;
71 #endif
72 }
73 
74 QVariant CloudRouteModel::data( const QModelIndex& index, int role ) const
75 {
76  if ( index.isValid() && index.row() >= 0 && index.row() < d->m_items.size() ) {
77  switch( role ) {
78  case Qt::DecorationRole: return preview( index );
79  case Timestamp: return d->m_items.at( index.row() ).identifier();
80  case Name: return d->m_items.at( index.row() ).name();
81  case PreviewUrl: return d->m_items.at( index.row() ).previewUrl();
82  case Distance: return d->m_items.at( index.row() ).distance();
83  case Duration: return d->m_items.at( index.row() ).duration();
84  case IsCached: return isCached( index );
85  case IsDownloading: return isDownloading( index );
86  case IsOnCloud: return d->m_items.at( index.row() ).onCloud();
87  }
88  }
89 
90  return QVariant();
91 }
92 
93 int CloudRouteModel::rowCount( const QModelIndex &parent ) const
94 {
95  return parent.isValid() ? 0 : d->m_items.count();
96 }
97 
98 #if QT_VERSION >= 0x050000
99 QHash<int, QByteArray> CloudRouteModel::roleNames() const
100 {
101  return d->m_roleNames;
102 }
103 #endif
104 
105 void CloudRouteModel::setItems( const QVector<RouteItem> &items )
106 {
107  beginResetModel();
108  d->m_items = items;
109  d->m_previewQueue.clear();
110  d->m_requestedPreviews.clear();
111  endResetModel();
112 }
113 
114 bool CloudRouteModel::isCached( const QModelIndex &index ) const
115 {
116  QFileInfo cacheDir( d->m_cacheDir + index.data( Timestamp ).toString() + ".kml" );
117  return cacheDir.exists();
118 }
119 
120 QPersistentModelIndex CloudRouteModel::downloadingItem() const
121 {
122  return d->m_downloading;
123 }
124 
125 void CloudRouteModel::setDownloadingItem(const QPersistentModelIndex &index )
126 {
127  d->m_downloading = index;
128 }
129 
130 bool CloudRouteModel::isDownloading( const QModelIndex &index ) const
131 {
132  return d->m_downloading == index;
133 }
134 
135 qint64 CloudRouteModel::totalSize() const
136 {
137  return d->m_totalSize;
138 }
139 
140 qint64 CloudRouteModel::downloadedSize() const
141 {
142  return d->m_downloadedSize;
143 }
144 
145 QIcon CloudRouteModel::preview( const QModelIndex &index ) const
146 {
147  QString timestamp = d->m_items.at( index.row() ).identifier();
148  if( d->m_items.at( index.row() ).preview().isNull() && !d->m_requestedPreviews.contains( timestamp ) ) {
149  QUrl url( d->m_items.at( index.row() ).previewUrl() );
150  QNetworkRequest request( url );
151  QNetworkReply *reply = d->m_network.get( request );
152  d->m_previewQueue.insert( reply, index.row() );
153  d->m_requestedPreviews.insert( timestamp );
154  }
155 
156  return d->m_items.at( index.row() ).preview();
157 }
158 
159 void CloudRouteModel::setPreview( QNetworkReply *reply )
160 {
161  int position = d->m_previewQueue.take( reply );
162 
163  if( position >= d->m_items.count() ) {
164  return;
165  }
166 
167  RouteItem &route = d->m_items[ position ];
168  QIcon icon( QPixmap::fromImage( QImage::fromData( reply->readAll() ) ) );
169  route.setPreview( icon );
170  d->m_requestedPreviews.remove( route.identifier() );
171 }
172 
173 void CloudRouteModel::updateProgress( qint64 currentSize, qint64 totalSize )
174 {
175  d->m_totalSize = totalSize;
176  d->m_downloadedSize = currentSize;
177  dataChanged( d->m_downloading, d->m_downloading );
178  if( currentSize == totalSize ) {
179  d->m_downloading = QPersistentModelIndex();
180  d->m_totalSize = -1;
181  d->m_downloadedSize = 0;
182  }
183 }
184 
185 }
186 
187 #include "CloudRouteModel.moc"
Marble::CloudRouteModel::setDownloadingItem
void setDownloadingItem(const QPersistentModelIndex &index)
Marks the route at given index as being downloaded.
Definition: CloudRouteModel.cpp:125
QModelIndex
Marble::CloudRouteModel::updateProgress
void updateProgress(qint64 currentSize, qint64 totalSize)
Definition: CloudRouteModel.cpp:173
QImage::fromData
QImage fromData(const uchar *data, int size, const char *format)
Marble::CloudRouteModel::data
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const
Definition: CloudRouteModel.cpp:74
QAbstractItemModel::setRoleNames
void setRoleNames(const QHash< int, QByteArray > &roleNames)
QNetworkReply
QAbstractItemModel::roleNames
const QHash< int, QByteArray > & roleNames() const
Marble::CloudRouteModel::isCached
bool isCached(const QModelIndex &index) const
Checks if specified route exists in the local cache.
Definition: CloudRouteModel.cpp:114
QMap< QNetworkReply *, int >
Marble::RouteItem::setPreview
void setPreview(const QIcon &preview)
Definition: RouteItem.cpp:76
Marble::CloudRouteModel::Distance
Definition: CloudRouteModel.h:34
Marble::CloudRouteModel::IsCached
Definition: CloudRouteModel.h:36
QPixmap::fromImage
QPixmap fromImage(const QImage &image, QFlags< Qt::ImageConversionFlag > flags)
Marble::MarbleDirs::localPath
static QString localPath()
Definition: MarbleDirs.cpp:223
Marble::RouteItem
Definition: RouteItem.h:20
MarbleDebug.h
CloudRouteModel.h
Marble::RouteItem::identifier
QString identifier() const
Definition: RouteItem.cpp:51
Marble::CloudRouteModel::downloadingItem
QPersistentModelIndex downloadingItem() const
Getter for the item currently being downloaded.
Definition: CloudRouteModel.cpp:120
Marble::CloudRouteModel::isDownloading
bool isDownloading(const QModelIndex &index) const
Checks if route is being downloaded.
Definition: CloudRouteModel.cpp:130
QAbstractItemModel::beginResetModel
void beginResetModel()
QObject::name
const char * name() const
QModelIndex::isValid
bool isValid() const
QNetworkRequest
Marble::CloudRouteModel::CloudRouteModel
CloudRouteModel(QObject *parent=0)
Definition: CloudRouteModel.cpp:52
Marble::CloudRouteModel::setItems
void setItems(const QVector< RouteItem > &items)
Sets the list of routes that will show up in CloudRoutesDialog.
Definition: CloudRouteModel.cpp:105
QAbstractItemModel::dataChanged
void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight)
QHash
QObject
QAbstractListModel::index
virtual QModelIndex index(int row, int column, const QModelIndex &parent) const
QAbstractListModel
MarbleDirs.h
QModelIndex::row
int row() const
QIODevice::readAll
QByteArray readAll()
Marble::CloudRouteModel::IsDownloading
Definition: CloudRouteModel.h:37
QSet< QString >
QString
Marble::CloudRouteModel::preview
QIcon preview(const QModelIndex &index) const
Checks whether a preview for the route available and returns or downloads the preview.
Definition: CloudRouteModel.cpp:145
Marble::CloudRouteModel::Name
Definition: CloudRouteModel.h:32
QFileInfo
QFileInfo::exists
bool exists() const
Marble::CloudRouteModel::setPreview
void setPreview(QNetworkReply *reply)
Definition: CloudRouteModel.cpp:159
QUrl
QNetworkAccessManager
QPersistentModelIndex
Marble::CloudRouteModel::IsOnCloud
Definition: CloudRouteModel.h:38
Marble::CloudRouteModel::totalSize
qint64 totalSize() const
Total size of the item currently being downloaded.
Definition: CloudRouteModel.cpp:135
QVector
QModelIndex::data
QVariant data(int role) const
QIcon::isNull
bool isNull() const
Marble::CloudRouteModel::rowCount
int rowCount(const QModelIndex &parent=QModelIndex()) const
Definition: CloudRouteModel.cpp:93
Marble::CloudRouteModel::downloadedSize
qint64 downloadedSize() const
Returns how much of the route are downloaded as bytes.
Definition: CloudRouteModel.cpp:140
Marble::CloudRouteModel::PreviewUrl
Definition: CloudRouteModel.h:33
Marble::CloudRouteModel::Duration
Definition: CloudRouteModel.h:35
QAbstractItemModel::endResetModel
void endResetModel()
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QVariant::toString
QString toString() const
Marble::CloudRouteModel::Timestamp
Definition: CloudRouteModel.h:31
QIcon
QVariant
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