void PositionSource::updatePosition() { if ( m_marbleModel ) { bool const hasPosition = m_marbleModel->positionTracking()->status() == Marble::PositionProviderStatusAvailable; if ( hasPosition ) { Marble::GeoDataCoordinates position = m_marbleModel->positionTracking()->currentLocation(); m_position.setLongitude( position.longitude( Marble::GeoDataCoordinates::Degree ) ); m_position.setLatitude( position.latitude( Marble::GeoDataCoordinates::Degree ) ); m_position.setAltitude( position.altitude() ); } m_speed = m_marbleModel->positionTracking()->speed() * Marble::METER2KM / Marble::SEC2HOUR; emit speedChanged(); if ( hasPosition != m_hasPosition ) { m_hasPosition = hasPosition; emit hasPositionChanged(); } if ( hasPosition ) { emit positionChanged(); } } }
void Tracking::updatePositionMarker() { if ( m_marbleQuickItem && m_positionMarker && m_positionMarkerType == Circle ) { Coordinate* position = 0; bool visible = (m_marbleQuickItem->model()->planetId() == QLatin1String("earth")); if ( m_positionSource && m_positionSource->hasPosition() ) { position = m_positionSource->position(); } else if ( hasLastKnownPosition() ) { position = lastKnownPosition(); } else { visible = false; } qreal x(0), y(0); if ( position ) { Marble::GeoDataCoordinates const pos( position->longitude(), position->latitude(), 0.0, GeoDataCoordinates::Degree ); visible = visible && m_marbleQuickItem->map()->viewport()->screenCoordinates( pos.longitude(), pos.latitude(), x, y ); QQuickItem* item = qobject_cast<QQuickItem*>( m_positionMarker ); if ( item ) { item->setVisible( visible ); if ( visible ) { item->setX( x - item->width() / 2.0 ); item->setY( y - item->height() / 2.0 ); } } } } else if ( m_positionMarkerType != Circle ) { QQuickItem* item = qobject_cast<QQuickItem*>( m_positionMarker ); if ( item ) { item->setVisible( false ); } } }
void AbstractDataPlugin::handleViewportChange( const ViewportParams *viewport ) { QList<AbstractDataPluginItem*> orphane = d->m_delegateInstances.keys(); QList<AbstractDataPluginItem*> const items = d->m_model->items( viewport, numberOfItems() ); foreach( AbstractDataPluginItem* item, items ) { qreal x, y; Marble::GeoDataCoordinates const coordinates = item->coordinate(); bool const visible = viewport->screenCoordinates( coordinates.longitude(), coordinates.latitude(), x, y ); if ( !d->m_delegateInstances.contains( item ) ) { if ( !visible ) { // We don't have, but don't need it either. Shouldn't happen though as the model checks for it already. continue; } // Create a new QML object instance using the delegate as the factory. The original // data plugin item is set as the context object, i.e. all its properties are available // to QML directly with their names QQmlContext *context = new QQmlContext( qmlContext( d->m_delegate ) ); context->setContextObject( item ); QList<QByteArray> const dynamicProperties = item->dynamicPropertyNames(); foreach( const QByteArray &property, dynamicProperties ) { context->setContextProperty( property, item->property( property ) ); } QObject* component = d->m_delegate->create( context ); QQuickItem* newItem = qobject_cast<QQuickItem*>( component ); QGraphicsItem* graphicsItem = qobject_cast<QGraphicsItem*>( component ); if ( graphicsItem && newItem ) { graphicsItem->setParentItem( d->m_delegateParent ); } if ( newItem ) { d->m_delegateInstances[item] = newItem; } else { mDebug() << "Failed to create delegate"; continue; } } else if ( !visible ) {