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"