• 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
  • plugins
  • declarative
DeclarativeDataPlugin.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 2012 Anton Chernov <chernov.anton.mail@gmail.com>
9 // Copyright 2012 "LOTES TM" LLC <lotes.sis@gmail.com>
10 // Copyright 2012 Dennis Nienhüser <earthwings@gentoo.org>
11 //
12 
13 #include "DeclarativeDataPlugin.h"
14 #include "DeclarativeDataPluginModel.h"
15 #include "MarbleDeclarativeWidget.h"
16 #include "DeclarativeDataPluginItem.h"
17 
18 #include "MarbleDebug.h"
19 #include "MarbleWidget.h"
20 #include "MarbleModel.h"
21 
22 #include <QMetaObject>
23 #include <QMetaProperty>
24 #include <QScriptValue>
25 #include <QScriptValueIterator>
26 
27 #if QT_VERSION < 0x050000
28  typedef QDeclarativeComponent QQmlComponent;
29 #endif
30 
31 using namespace Marble;
32 
33 class DeclarativeDataPluginPrivate {
34 public:
35  DeclarativeDataPlugin* q;
36  QString m_planet;
37  QString m_name;
38  QString m_nameId;
39  QString m_version;
40  QString m_guiString;
41  QString m_copyrightYears;
42  QString m_description;
43  QList<Marble::PluginAuthor> m_authors;
44  QString m_aboutText;
45  bool m_isInitialized;
46  QList<AbstractDataPluginItem *> m_items;
47  QList<DeclarativeDataPluginModel*> m_modelInstances;
48  QQmlComponent* m_delegate;
49  QVariant m_model;
50  static int m_global_counter;
51  int m_counter;
52 
53  DeclarativeDataPluginPrivate( DeclarativeDataPlugin* q );
54 
55  void parseChunk( DeclarativeDataPluginItem * item, GeoDataCoordinates &coordinates, const QString &key, const QVariant &value );
56 
57  void addItem( DeclarativeDataPluginItem* item, const GeoDataCoordinates &coordinates );
58 
59  void parseListModel( QAbstractListModel* listModel );
60 
61  void parseObject( QObject* object );
62 };
63 
64 int DeclarativeDataPluginPrivate::m_global_counter = 0;
65 
66 DeclarativeDataPluginPrivate::DeclarativeDataPluginPrivate( DeclarativeDataPlugin* parent ) :
67  q( parent ), m_planet( "earth"), m_isInitialized( false ), m_delegate( 0 ), m_counter( m_global_counter )
68 {
69  ++m_global_counter;
70 }
71 
72 void DeclarativeDataPluginPrivate::parseChunk( DeclarativeDataPluginItem *item, GeoDataCoordinates &coordinates, const QString &key, const QVariant &value )
73 {
74  if( key == "lat" || key == "latitude" ) {
75  coordinates.setLatitude( value.toDouble(), GeoDataCoordinates::Degree );
76  } else if( key == "lon" || key == "longitude" ) {
77  coordinates.setLongitude( value.toDouble(), GeoDataCoordinates::Degree );
78  } else if( key == "alt" || key == "altitude" ) {
79  coordinates.setAltitude( value.toDouble() );
80  } else {
81  item->setProperty( key.toLatin1(), value );
82  }
83 }
84 
85 void DeclarativeDataPluginPrivate::addItem( DeclarativeDataPluginItem *item, const GeoDataCoordinates &coordinates )
86 {
87  if ( coordinates.isValid() ) {
88  item->setCoordinate( coordinates );
89  item->setTarget( m_planet );
90  QVariant const idValue = item->property( "identifier" );
91  if ( idValue.isValid() && !idValue.toString().isEmpty() ) {
92  item->setId( idValue.toString() );
93  } else {
94  item->setId( coordinates.toString() ) ;
95  }
96  m_items.append( item );
97  } else {
98  delete item;
99  }
100 }
101 
102 void DeclarativeDataPluginPrivate::parseListModel( QAbstractListModel *listModel )
103 {
104  QHash< int, QByteArray > roles = listModel->roleNames();
105  for( int i = 0; i < listModel->rowCount(); ++i ) {
106  GeoDataCoordinates coordinates;
107  QMap< int, QVariant > const itemData = listModel->itemData( listModel->index( i ) );
108  QHash< int, QByteArray >::const_iterator it = roles.constBegin();
109  DeclarativeDataPluginItem * item = new DeclarativeDataPluginItem( q );
110  for ( ; it != roles.constEnd(); ++it ) {
111  parseChunk( item, coordinates, it.value(), itemData.value( it.key() ) );
112  }
113 
114  addItem( item, coordinates );
115  }
116 }
117 
118 void DeclarativeDataPluginPrivate::parseObject( QObject *object )
119 {
120  int count = 0;
121  QMetaObject const * meta = object->metaObject();
122  for( int i = 0; i < meta->propertyCount(); ++i ) {
123  if( qstrcmp( meta->property(i).name(), "count" ) == 0 ) {
124  count = meta->property(i).read( object ).toInt();
125  }
126  }
127 
128  for( int i = 0; i < meta->methodCount(); ++i ) {
129 #if QT_VERSION < 0x050000
130  if( qstrcmp( meta->method(i).signature(), "get(int)" ) == 0 ) {
131 #else
132  if( meta->method(i).methodSignature() == "get(int)" ) {
133 #endif
134  for( int j=0; j < count; ++j ) {
135  QScriptValue value;
136  meta->method(i).invoke( object, Qt::AutoConnection, Q_RETURN_ARG( QScriptValue , value), Q_ARG( int, j ) );
137  QObject * propertyObject = value.toQObject();
138  GeoDataCoordinates coordinates;
139  DeclarativeDataPluginItem * item = new DeclarativeDataPluginItem( q );
140  if ( propertyObject ) {
141  for( int k = 0; k < propertyObject->metaObject()->propertyCount(); ++k ) {
142  QString const propertyName = propertyObject->metaObject()->property( k ).name();
143  QVariant const value = propertyObject->metaObject()->property( k ).read( propertyObject );
144  parseChunk( item, coordinates, propertyName, value );
145  }
146  } else {
147  QScriptValueIterator it( value );
148  while ( it.hasNext() ) {
149  it.next();
150  parseChunk( item, coordinates, it.name(), it.value().toVariant() );
151  }
152  }
153  addItem( item, coordinates );
154  }
155  }
156  }
157 }
158 
159 Marble::RenderPlugin *DeclarativeDataPlugin::newInstance(const Marble::MarbleModel *marbleModel) const
160 {
161  DeclarativeDataPlugin* instance = new DeclarativeDataPlugin( marbleModel );
162  instance->d->m_planet = d->m_planet;
163  instance->d->m_name = d->m_name;
164  instance->d->m_nameId = d->m_nameId;
165  instance->d->m_version = d->m_version;
166  instance->d->m_guiString = d->m_guiString;
167  instance->d->m_copyrightYears = d->m_copyrightYears;
168  instance->d->m_description = d->m_description;
169  instance->d->m_authors = d->m_authors;
170  instance->d->m_aboutText = d->m_aboutText;
171  instance->d->m_isInitialized = d->m_isInitialized;
172  instance->d->m_items = d->m_items;
173  instance->d->m_delegate = d->m_delegate;
174  instance->d->m_model = d->m_model;
175  instance->d->m_counter = d->m_counter;
176  instance->setNumberOfItems( numberOfItems() );
177  instance->setFavoriteItemsOnly( isFavoriteItemsOnly() );
178 
179  DeclarativeDataPluginModel* dataModel = new DeclarativeDataPluginModel( marbleModel );
180  dataModel->addItemsToList( d->m_items );
181  instance->setModel( dataModel );
182  connect( dataModel, SIGNAL(dataRequest(qreal,qreal,qreal,qreal)), this, SIGNAL(dataRequest(qreal,qreal,qreal,qreal)) );
183  d->m_modelInstances << dataModel;
184  return instance;
185 }
186 
187 DeclarativeDataPlugin::DeclarativeDataPlugin( const Marble::MarbleModel *marbleModel )
188  : AbstractDataPlugin( marbleModel ), d( new DeclarativeDataPluginPrivate( this ) )
189 {
190  setEnabled( true );
191  setVisible( true );
192 }
193 
194 DeclarativeDataPlugin::~DeclarativeDataPlugin()
195 {
196  delete d;
197 }
198 
199 QString DeclarativeDataPlugin::planet() const
200 {
201  return d->m_planet;
202 }
203 
204 void DeclarativeDataPlugin::setPlanet( const QString &planet )
205 {
206  if ( d->m_planet != planet ) {
207  d->m_planet = planet;
208  emit planetChanged();
209  }
210 }
211 
212 QString DeclarativeDataPlugin::name() const
213 {
214  return d->m_name.isEmpty() ? "Anonymous DeclarativeDataPlugin" : d->m_name;
215 }
216 
217 QString DeclarativeDataPlugin::guiString() const
218 {
219  return d->m_guiString.isEmpty() ? name() : d->m_guiString;
220 }
221 
222 QString DeclarativeDataPlugin::nameId() const
223 {
224  return d->m_nameId.isEmpty() ? QString( "DeclarativeDataPlugin_%1" ).arg( d->m_counter ) : d->m_nameId;
225 }
226 
227 QString DeclarativeDataPlugin::version() const
228 {
229  return d->m_version.isEmpty() ? "1.0" : d->m_version;
230 }
231 
232 QString DeclarativeDataPlugin::description() const
233 {
234  return d->m_description;
235 }
236 
237 QString DeclarativeDataPlugin::copyrightYears() const
238 {
239  return d->m_copyrightYears;
240 }
241 
242 QList<PluginAuthor> DeclarativeDataPlugin::pluginAuthors() const
243 {
244  return d->m_authors;
245 }
246 
247 QStringList DeclarativeDataPlugin::authors() const
248 {
249  QStringList authors;
250  foreach( const PluginAuthor& author, d->m_authors ) {
251  authors<< author.name << author.email;
252  }
253  return authors;
254 }
255 
256 QString DeclarativeDataPlugin::aboutDataText() const
257 {
258  return d->m_aboutText;
259 }
260 
261 QIcon DeclarativeDataPlugin::icon() const
262 {
263  return QIcon();
264 }
265 
266 void DeclarativeDataPlugin::setName( const QString & name )
267 {
268  if( d->m_name != name ) {
269  d->m_name = name;
270  emit nameChanged();
271  }
272 }
273 
274 void DeclarativeDataPlugin::setGuiString( const QString & guiString )
275 {
276  if( d->m_guiString != guiString ) {
277  d->m_guiString = guiString;
278  emit guiStringChanged();
279  }
280 }
281 
282 void DeclarativeDataPlugin::setNameId( const QString & nameId )
283 {
284  if( d->m_nameId != nameId ) {
285  d->m_nameId = nameId;
286  emit nameIdChanged();
287  }
288 }
289 
290 void DeclarativeDataPlugin::setVersion( const QString & version )
291 {
292  if( d->m_version != version ) {
293  d->m_version = version;
294  emit versionChanged();
295  }
296 }
297 
298 void DeclarativeDataPlugin::setCopyrightYears( const QString & copyrightYears )
299 {
300  if( d->m_copyrightYears != copyrightYears ) {
301  d->m_copyrightYears = copyrightYears;
302  emit copyrightYearsChanged();
303  }
304 }
305 
306 void DeclarativeDataPlugin::setDescription( const QString description )
307 {
308  if( d->m_description != description ) {
309  d->m_description = description;
310  emit descriptionChanged();
311  }
312 }
313 
314 void DeclarativeDataPlugin::setAuthors( const QStringList & pluginAuthors )
315 {
316  if( pluginAuthors.size() % 2 == 0 ) {
317  QStringList::const_iterator it = pluginAuthors.constBegin();
318  while ( it != pluginAuthors.constEnd() ) {
319  QString name = *(++it);
320  QString email = *(++it);;
321  d->m_authors.append( PluginAuthor( name, email) );
322  }
323  emit authorsChanged();
324  }
325 }
326 
327 void DeclarativeDataPlugin::setAboutDataText( const QString & aboutDataText )
328 {
329  if( d->m_aboutText != aboutDataText ) {
330  d->m_aboutText = aboutDataText;
331  emit aboutDataTextChanged();
332  }
333 }
334 
335 QQmlComponent *DeclarativeDataPlugin::delegate()
336 {
337  return d->m_delegate;
338 }
339 
340 void DeclarativeDataPlugin::setDelegate( QQmlComponent *delegate )
341 {
342  if ( delegate != d->m_delegate ) {
343  d->m_delegate = delegate;
344  emit delegateChanged();
345  }
346 }
347 
348 void DeclarativeDataPlugin::initialize()
349 {
350  if( !model() ) {
351  setModel( new DeclarativeDataPluginModel( marbleModel(), this ) );
352  }
353  d->m_isInitialized = true;
354 }
355 
356 bool DeclarativeDataPlugin::isInitialized() const
357 {
358  return d->m_isInitialized;
359 }
360 
361 void DeclarativeDataPlugin::setDeclarativeModel( const QVariant &model )
362 {
363  d->m_model = model;
364  d->m_items.clear();
365 
366  QObject* object = model.value<QObject*>();
367  if( qobject_cast< QAbstractListModel* >( object ) ) {
368  d->parseListModel( qobject_cast< QAbstractListModel *>( object ) );
369  } else {
370  d->parseObject( object );
371  }
372 
375  foreach( DeclarativeDataPluginModel* model, d->m_modelInstances ) {
376  model->addItemsToList( d->m_items );
377  }
378 
379  emit declarativeModelChanged();
380 }
381 
382 QVariant DeclarativeDataPlugin::declarativeModel()
383 {
384  return d->m_model;
385 }
386 
387 #include "DeclarativeDataPlugin.moc"
DeclarativeDataPlugin::authorsChanged
void authorsChanged()
DeclarativeDataPlugin::setDelegate
void setDelegate(QDeclarativeComponent *delegate)
Definition: DeclarativeDataPlugin.cpp:340
Marble::AbstractDataPlugin::setNumberOfItems
void setNumberOfItems(quint32 number)
Set the number of items to be shown at the same time.
Definition: AbstractDataPlugin.cpp:151
DeclarativeDataPlugin::planet
QString planet() const
DeclarativeDataPlugin::authors
QStringList authors() const
Definition: DeclarativeDataPlugin.cpp:247
DeclarativeDataPlugin::setAboutDataText
void setAboutDataText(const QString &aboutDataText)
Definition: DeclarativeDataPlugin.cpp:327
DeclarativeDataPlugin::nameId
virtual QString nameId() const
Returns the unique name of the plugin.
Marble::AbstractDataPluginItem::setTarget
void setTarget(const QString &target)
Definition: AbstractDataPluginItem.cpp:66
Marble::GeoDataCoordinates
A 3d point representation.
Definition: GeoDataCoordinates.h:52
DeclarativeDataPlugin::declarativeModel
QVariant declarativeModel()
Definition: DeclarativeDataPlugin.cpp:382
DeclarativeDataPlugin::isInitialized
virtual bool isInitialized() const
Definition: DeclarativeDataPlugin.cpp:356
Marble::GeoDataCoordinates::setAltitude
void setAltitude(const qreal altitude)
set the altitude of the Point in meters
Definition: GeoDataCoordinates.cpp:1191
DeclarativeDataPlugin::guiString
virtual QString guiString() const
String that should be displayed in GUI.
MarbleDeclarativeWidget.h
MarbleModel.h
This file contains the headers for MarbleModel.
Marble::AbstractDataPluginItem::setId
void setId(const QString &id)
Definition: AbstractDataPluginItem.cpp:86
Marble::PluginAuthor::email
QString email
Definition: PluginInterface.h:38
Marble::PluginAuthor
Definition: PluginInterface.h:28
DeclarativeDataPlugin.h
DeclarativeDataPlugin::declarativeModelChanged
void declarativeModelChanged()
Marble::AbstractDataPlugin::setFavoriteItemsOnly
void setFavoriteItemsOnly(bool favoriteOnly)
Convenience method to set the favorite item state on the current model.
Definition: AbstractDataPlugin.cpp:184
DeclarativeDataPluginItem.h
DeclarativeDataPlugin::name
QString name() const
Returns the user-visible name of the plugin.
Marble::AbstractDataPlugin
An abstract class for plugins that show data that has a geo coordinate.
Definition: AbstractDataPlugin.h:45
DeclarativeDataPlugin::newInstance
Marble::RenderPlugin * newInstance(const Marble::MarbleModel *marbleModel) const
Creation a new instance of the plugin.
Definition: DeclarativeDataPlugin.cpp:159
DeclarativeDataPlugin::nameChanged
void nameChanged()
DeclarativeDataPlugin::descriptionChanged
void descriptionChanged()
Marble::DeclarativeDataPluginItem
Definition: DeclarativeDataPluginItem.h:21
QObject
MarbleDebug.h
DeclarativeDataPlugin::dataRequest
void dataRequest(qreal north, qreal south, qreal east, qreal west)
Additional data for the currently visible map region is requested.
DeclarativeDataPlugin::aboutDataText
virtual QString aboutDataText() const
Returns about text (credits) for external data the plugin uses.
DeclarativeDataPluginModel.h
DeclarativeDataPlugin::setPlanet
void setPlanet(const QString &planet)
Definition: DeclarativeDataPlugin.cpp:204
Marble::AbstractDataPlugin::model
AbstractDataPluginModel * model() const
Definition: AbstractDataPlugin.cpp:124
DeclarativeDataPlugin::setCopyrightYears
void setCopyrightYears(const QString &copyrightYears)
Definition: DeclarativeDataPlugin.cpp:298
Marble::AbstractDataPlugin::numberOfItems
quint32 numberOfItems() const
DeclarativeDataPlugin::~DeclarativeDataPlugin
virtual ~DeclarativeDataPlugin()
Definition: DeclarativeDataPlugin.cpp:194
DeclarativeDataPlugin::pluginAuthors
virtual QList< Marble::PluginAuthor > pluginAuthors() const
DeclarativeDataPlugin::guiStringChanged
void guiStringChanged()
DeclarativeDataPlugin::nameIdChanged
void nameIdChanged()
DeclarativeDataPlugin::setVersion
void setVersion(const QString &version)
Definition: DeclarativeDataPlugin.cpp:290
Marble::PluginAuthor::name
QString name
Definition: PluginInterface.h:36
DeclarativeDataPlugin
Definition: DeclarativeDataPlugin.h:25
Marble::AbstractDataPlugin::isFavoriteItemsOnly
bool isFavoriteItemsOnly() const
Definition: AbstractDataPlugin.cpp:191
Marble::RenderPlugin::setVisible
void setVisible(bool visible)
settting visible
Definition: RenderPlugin.cpp:149
Marble::AbstractDataPlugin::setModel
void setModel(AbstractDataPluginModel *model)
Set the model of the plugin.
Definition: AbstractDataPlugin.cpp:129
DeclarativeDataPlugin::setAuthors
void setAuthors(const QStringList &pluginAuthors)
Definition: DeclarativeDataPlugin.cpp:314
DeclarativeDataPlugin::icon
virtual QIcon icon() const
Returns an icon for the plugin.
Definition: DeclarativeDataPlugin.cpp:261
DeclarativeDataPlugin::description
virtual QString description() const
Returns a user description of the plugin.
DeclarativeDataPlugin::copyrightYearsChanged
void copyrightYearsChanged()
DeclarativeDataPlugin::delegateChanged
void delegateChanged()
Marble::GeoDataCoordinates::setLatitude
void setLatitude(qreal lat, GeoDataCoordinates::Unit unit=GeoDataCoordinates::Radian)
set the longitude in a GeoDataCoordinates object
Definition: GeoDataCoordinates.cpp:699
DeclarativeDataPlugin::planetChanged
void planetChanged()
Marble::GeoDataCoordinates::setLongitude
void setLongitude(qreal lon, GeoDataCoordinates::Unit unit=GeoDataCoordinates::Radian)
set the longitude in a GeoDataCoordinates object
Definition: GeoDataCoordinates.cpp:679
Marble::MarbleModel
The data model (not based on QAbstractModel) for a MarbleWidget.
Definition: MarbleModel.h:96
DeclarativeDataPlugin::initialize
virtual void initialize()
Definition: DeclarativeDataPlugin.cpp:348
Marble::RenderPlugin::setEnabled
void setEnabled(bool enabled)
settting enabled
Definition: RenderPlugin.cpp:137
DeclarativeDataPlugin::setName
void setName(const QString &name)
Definition: DeclarativeDataPlugin.cpp:266
DeclarativeDataPlugin::DeclarativeDataPlugin
DeclarativeDataPlugin(const Marble::MarbleModel *marbleModel=0)
Definition: DeclarativeDataPlugin.cpp:187
Marble::DeclarativeDataPluginModel
Definition: DeclarativeDataPluginModel.h:21
QQmlComponent
QDeclarativeComponent QQmlComponent
Definition: AbstractDataPlugin.cpp:32
Marble::GeoDataCoordinates::toString
QString toString() const
return a string representation of the coordinate this is a convenience function which uses the defaul...
Definition: GeoDataCoordinates.cpp:921
MarbleWidget.h
This file contains the headers for MarbleWidget.
DeclarativeDataPlugin::versionChanged
void versionChanged()
DeclarativeDataPlugin::aboutDataTextChanged
void aboutDataTextChanged()
QQmlComponent
QDeclarativeComponent QQmlComponent
Definition: DeclarativeDataPlugin.cpp:28
DeclarativeDataPlugin::setNameId
void setNameId(const QString &nameId)
Definition: DeclarativeDataPlugin.cpp:282
DeclarativeDataPlugin::setGuiString
void setGuiString(const QString &guiString)
Definition: DeclarativeDataPlugin.cpp:274
Marble::GeoDataCoordinates::isValid
bool isValid() const
Returns.
Definition: GeoDataCoordinates.cpp:624
DeclarativeDataPlugin::setDeclarativeModel
void setDeclarativeModel(const QVariant &model)
Definition: DeclarativeDataPlugin.cpp:361
Marble::RenderPlugin::marbleModel
const MarbleModel * marbleModel() const
Access to the MarbleModel.
Definition: RenderPlugin.cpp:81
Marble::BillboardGraphicsItem::setCoordinate
void setCoordinate(const GeoDataCoordinates &coordinates)
Definition: BillboardGraphicsItem.cpp:98
DeclarativeDataPlugin::delegate
QDeclarativeComponent * delegate()
DeclarativeDataPlugin::version
virtual QString version() const
DeclarativeDataPlugin::setDescription
void setDescription(const QString description)
Definition: DeclarativeDataPlugin.cpp:306
DeclarativeDataPlugin::copyrightYears
virtual QString copyrightYears() const
Marble::RenderPlugin
The abstract class that creates a renderable item.
Definition: RenderPlugin.h:43
Marble::AbstractDataPluginModel::addItemsToList
void addItemsToList(const QList< AbstractDataPluginItem * > &items)
Adds the items to the list of initialized items.
Definition: AbstractDataPluginModel.cpp:408
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:38:49 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