File indexing completed on 2024-04-21 03:50:14

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"