File indexing completed on 2024-05-05 07:50:22
0001 // SPDX-License-Identifier: LGPL-2.1-or-later 0002 // 0003 // SPDX-FileCopyrightText: 2011 Thibaut Gridel <tgridel@free.fr> 0004 // 0005 0006 #include "GpsInfo.h" 0007 0008 0009 #include <QIcon> 0010 0011 #include "MarbleDebug.h" 0012 #include "MarbleLocale.h" 0013 #include "MarbleModel.h" 0014 #include "PositionTracking.h" 0015 #include "WidgetGraphicsItem.h" 0016 #include "MarbleGraphicsGridLayout.h" 0017 #include "ViewportParams.h" 0018 #include "GeoDataAccuracy.h" 0019 0020 namespace Marble 0021 { 0022 0023 GpsInfo::GpsInfo() 0024 : AbstractFloatItem( nullptr ), 0025 m_locale( nullptr ), 0026 m_widgetItem( nullptr ) 0027 { 0028 } 0029 0030 GpsInfo::GpsInfo( const MarbleModel *marbleModel ) 0031 : AbstractFloatItem( marbleModel, QPointF( 10.5, 110 ), QSizeF( 135.0, 80.0 ) ), 0032 m_locale( nullptr ), 0033 m_widgetItem( nullptr ) 0034 { 0035 setVisible( false ); 0036 } 0037 0038 GpsInfo::~GpsInfo() 0039 { 0040 } 0041 0042 QStringList GpsInfo::backendTypes() const 0043 { 0044 return QStringList(QStringLiteral("GpsInfo")); 0045 } 0046 0047 QString GpsInfo::name() const 0048 { 0049 return tr("GpsInfo"); 0050 } 0051 0052 QString GpsInfo::guiString() const 0053 { 0054 return tr("&GpsInfo"); 0055 } 0056 0057 QString GpsInfo::nameId() const 0058 { 0059 return QStringLiteral("GpsInfo"); 0060 } 0061 0062 QString GpsInfo::version() const 0063 { 0064 return QStringLiteral("1.0"); 0065 } 0066 0067 QString GpsInfo::description() const 0068 { 0069 return tr("This is a float item that provides Gps Information."); 0070 } 0071 0072 QString GpsInfo::copyrightYears() const 0073 { 0074 return QStringLiteral("2011"); 0075 } 0076 0077 QVector<PluginAuthor> GpsInfo::pluginAuthors() const 0078 { 0079 return QVector<PluginAuthor>() 0080 << PluginAuthor(QStringLiteral("Thibaut Gridel"), QStringLiteral("tgridel@free.fr")); 0081 } 0082 0083 QIcon GpsInfo::icon () const 0084 { 0085 return QIcon(QStringLiteral(":/icons/gps.png")); 0086 } 0087 0088 void GpsInfo::initialize () 0089 { 0090 if ( !m_widgetItem ) 0091 { 0092 QWidget *widget = new QWidget; 0093 m_widget.setupUi( widget ); 0094 m_widgetItem = new WidgetGraphicsItem( this ); 0095 m_widgetItem->setWidget( widget ); 0096 0097 MarbleGraphicsGridLayout *layout = new MarbleGraphicsGridLayout( 1, 1 ); 0098 layout->addItem( m_widgetItem, 0, 0 ); 0099 setLayout( layout ); 0100 setPadding( 0 ); 0101 0102 m_locale = MarbleGlobal::getInstance()->locale(); 0103 connect( marbleModel()->positionTracking(), SIGNAL(gpsLocation(GeoDataCoordinates,qreal)), 0104 this, SLOT(updateLocation(GeoDataCoordinates,qreal)) ); 0105 } 0106 } 0107 0108 bool GpsInfo::isInitialized () const 0109 { 0110 return m_widgetItem; 0111 } 0112 0113 void GpsInfo::updateLocation( const GeoDataCoordinates& coordinates, qreal) 0114 { 0115 PositionTracking *tracking = marbleModel()->positionTracking(); 0116 qreal speed = tracking->speed(); 0117 qreal direction = tracking->direction(); 0118 qreal altitude = coordinates.altitude(); 0119 qreal precision = tracking->accuracy().horizontal; 0120 QString speedString; 0121 QString distanceString; 0122 0123 switch ( m_locale->measurementSystem() ) { 0124 case MarbleLocale::ImperialSystem: 0125 //miles per hour 0126 speedString = tr("mph"); 0127 speed *= HOUR2SEC * METER2KM * KM2MI; 0128 distanceString = tr("ft"); 0129 altitude *= M2FT; 0130 precision *= M2FT; 0131 break; 0132 0133 case MarbleLocale::MetricSystem: 0134 //kilometers per hour 0135 speedString = tr("km/h"); 0136 speed *= HOUR2SEC * METER2KM; 0137 distanceString = tr("m"); 0138 break; 0139 0140 case MarbleLocale::NauticalSystem: 0141 // nm per hour (knots) 0142 speedString = tr("kt"); 0143 speed *= HOUR2SEC * METER2KM * KM2NM; 0144 distanceString = tr("nm"); 0145 break; 0146 } 0147 0148 m_widget.SpeedValue->setText( QString( " %1 %2" ) 0149 .arg( QLocale().toString(speed, 'f', 1 ) ) 0150 .arg( speedString ) ); 0151 m_widget.AltitudeValue->setText( QString( " %1 %2" ) 0152 .arg( QLocale().toString(altitude, 'f', 1 ) ) 0153 .arg( distanceString ) ); 0154 m_widget.DirectionValue->setText( QString( " %1 %2" ) 0155 .arg( QLocale().toString(direction, 'f', 1 ) ) 0156 .arg( "d" ) ); 0157 m_widget.PrecisionValue->setText( QString( " %1 %2" ) 0158 .arg( QLocale().toString(precision, 'f', 1 ) ) 0159 .arg( distanceString ) ); 0160 0161 int const minimumWidth = m_widgetItem->widget()->sizeHint().width(); 0162 if ( size().width() < minimumWidth ) { 0163 m_widgetItem->setSize( QSizeF( minimumWidth, size().height() ) ); 0164 } 0165 0166 update(); 0167 emit repaintNeeded(); 0168 } 0169 0170 } 0171 0172 #include "moc_GpsInfo.cpp"