File indexing completed on 2024-05-05 03:49:19

0001 // SPDX-License-Identifier: LGPL-2.1-or-later
0002 //
0003 // SPDX-FileCopyrightText: 2011 Dennis Nienhüser <nienhueser@kde.org>
0004 // SPDX-FileCopyrightText: 2011 Bernhard Beschow <bbeschow@cs.tu-berlin.de>
0005 //
0006 
0007 #include "PositionSource.h"
0008 
0009 #include "MarbleQuickItem.h"
0010 #include "MarbleModel.h"
0011 #include "PluginManager.h"
0012 #include "PositionTracking.h"
0013 #include "PositionProviderPlugin.h"
0014 
0015 namespace Marble {
0016 
0017 PositionSource::PositionSource( QObject* parent) : QObject( parent ),
0018     m_active( false ),
0019     m_hasPosition( false ),
0020     m_position( 0 ),
0021     m_marbleQuickItem( nullptr ),
0022     m_speed( 0.0 )
0023 {
0024   // nothing to do
0025 }
0026 
0027 bool PositionSource::active() const
0028 {
0029     return m_active;
0030 }
0031 
0032 void PositionSource::setActive( bool active )
0033 {
0034     if ( active != m_active ) {
0035         if ( active ) {
0036             start();
0037         } else if ( m_marbleQuickItem ) {
0038             PositionTracking *tracking = m_marbleQuickItem->model()->positionTracking();
0039             tracking->setPositionProviderPlugin( nullptr );
0040         }
0041 
0042         if ( m_hasPosition ) {
0043             m_hasPosition = false;
0044             emit hasPositionChanged();
0045         }
0046 
0047         m_active = active;
0048         emit activeChanged();
0049     }
0050 }
0051 
0052 QString PositionSource::source() const
0053 {
0054     return m_source;
0055 }
0056 
0057 void PositionSource::setSource( const QString &source )
0058 {
0059     if ( source != m_source ) {
0060         m_source = source;
0061         if ( m_hasPosition ) {
0062             m_hasPosition = false;
0063             emit hasPositionChanged();
0064         }
0065 
0066         if ( active() ) {
0067             start();
0068         }
0069         emit sourceChanged();
0070     }
0071 }
0072 
0073 bool PositionSource::hasPosition() const
0074 {
0075     return m_hasPosition;
0076 }
0077 
0078 Coordinate* PositionSource::position()
0079 {
0080     return &m_position;
0081 }
0082 
0083 void PositionSource::start()
0084 {
0085     if ( !m_marbleQuickItem ) {
0086         return;
0087     }
0088 
0089     const PluginManager* pluginManager = m_marbleQuickItem->model()->pluginManager();
0090     for( const Marble::PositionProviderPlugin *plugin: pluginManager->positionProviderPlugins() ) {
0091         if ( m_source.isEmpty() || plugin->nameId() == m_source ) {
0092             PositionProviderPlugin* instance = plugin->newInstance();
0093             PositionTracking *tracking = m_marbleQuickItem->model()->positionTracking();
0094             tracking->setPositionProviderPlugin( instance );
0095             break;
0096         }
0097     }
0098 }
0099 
0100 MarbleQuickItem *PositionSource::map()
0101 {
0102     return m_marbleQuickItem;
0103 }
0104 
0105 void PositionSource::setMap( MarbleQuickItem *map )
0106 {
0107     if ( map != m_marbleQuickItem ) {
0108         m_marbleQuickItem = map;
0109 
0110         if ( m_marbleQuickItem ) {
0111             connect( m_marbleQuickItem->model()->positionTracking(), SIGNAL(gpsLocation(GeoDataCoordinates,qreal)),
0112                     this, SLOT(updatePosition()) );
0113             connect( m_marbleQuickItem->model()->positionTracking(), SIGNAL(statusChanged(PositionProviderStatus)),
0114                     this, SLOT(updatePosition()) );
0115 
0116             emit mapChanged();
0117         }
0118 
0119         if ( active() ) {
0120             start();
0121         }
0122     }
0123 }
0124 
0125 qreal PositionSource::speed() const
0126 {
0127     return m_speed;
0128 }
0129 
0130 void PositionSource::updatePosition()
0131 {
0132     if ( m_marbleQuickItem ) {
0133         bool const hasPosition = m_marbleQuickItem->model()->positionTracking()->status() == Marble::PositionProviderStatusAvailable;
0134 
0135         if ( hasPosition ) {
0136             Marble::GeoDataCoordinates position = m_marbleQuickItem->model()->positionTracking()->currentLocation();
0137             m_position.setLongitude( position.longitude( Marble::GeoDataCoordinates::Degree ) );
0138             m_position.setLatitude( position.latitude( Marble::GeoDataCoordinates::Degree ) );
0139             m_position.setAltitude( position.altitude() );
0140         }
0141 
0142         m_speed = m_marbleQuickItem->model()->positionTracking()->speed() * Marble::METER2KM / Marble::SEC2HOUR;
0143         emit speedChanged();
0144 
0145         if ( hasPosition != m_hasPosition ) {
0146             m_hasPosition = hasPosition;
0147             emit hasPositionChanged();
0148         }
0149 
0150         if ( hasPosition ) {
0151             emit positionChanged();
0152         }
0153     }
0154 }
0155 
0156 }
0157 
0158 #include "moc_PositionSource.cpp"