mirror of
https://github.com/ciphervance/supercell-wx.git
synced 2025-10-30 19:10:06 +00:00
201 lines
5.6 KiB
C++
201 lines
5.6 KiB
C++
#include "gps_info_dialog.hpp"
|
|
#include "ui_gps_info_dialog.h"
|
|
|
|
#include <scwx/qt/manager/position_manager.hpp>
|
|
#include <scwx/common/geographic.hpp>
|
|
#include <scwx/util/time.hpp>
|
|
|
|
#include <units/angle.h>
|
|
#include <units/length.h>
|
|
#include <units/velocity.h>
|
|
#include <QClipboard>
|
|
#include <QGeoPositionInfo>
|
|
|
|
namespace scwx
|
|
{
|
|
namespace qt
|
|
{
|
|
namespace ui
|
|
{
|
|
|
|
static const QString kDisabledString_ = "---";
|
|
|
|
class GpsInfoDialog::Impl
|
|
{
|
|
public:
|
|
explicit Impl(GpsInfoDialog* self) : self_ {self} {};
|
|
~Impl() = default;
|
|
|
|
std::shared_ptr<manager::PositionManager> positionManager_ {
|
|
manager::PositionManager::Instance()};
|
|
|
|
void Update(const QGeoPositionInfo& info, bool updateTime = true);
|
|
|
|
GpsInfoDialog* self_;
|
|
};
|
|
|
|
GpsInfoDialog::GpsInfoDialog(QWidget* parent) :
|
|
QDialog(parent), p {std::make_unique<Impl>(this)}, ui(new Ui::GpsInfoDialog)
|
|
{
|
|
ui->setupUi(this);
|
|
|
|
p->Update({}, false);
|
|
|
|
connect(p->positionManager_.get(),
|
|
&manager::PositionManager::PositionUpdated,
|
|
this,
|
|
[this](const QGeoPositionInfo& info) { p->Update(info); });
|
|
|
|
connect(ui->copyCoordinateButton,
|
|
&QAbstractButton::clicked,
|
|
this,
|
|
[this]()
|
|
{
|
|
QClipboard* clipboard = QGuiApplication::clipboard();
|
|
clipboard->setText(ui->coordinateLabel->text());
|
|
});
|
|
}
|
|
|
|
GpsInfoDialog::~GpsInfoDialog()
|
|
{
|
|
delete ui;
|
|
}
|
|
|
|
void GpsInfoDialog::Impl::Update(const QGeoPositionInfo& info, bool updateTime)
|
|
{
|
|
auto coordinate = info.coordinate();
|
|
|
|
if (coordinate.isValid())
|
|
{
|
|
const QString latitude = QString::fromStdString(
|
|
common::GetLatitudeString(coordinate.latitude()));
|
|
const QString longitude = QString::fromStdString(
|
|
common::GetLongitudeString(coordinate.longitude()));
|
|
|
|
self_->ui->coordinateLabel->setText(
|
|
QString("%1, %2").arg(latitude).arg(longitude));
|
|
}
|
|
else
|
|
{
|
|
self_->ui->coordinateLabel->setText(kDisabledString_);
|
|
}
|
|
|
|
if (coordinate.type() == QGeoCoordinate::CoordinateType::Coordinate3D)
|
|
{
|
|
units::length::meters<double> altitude {coordinate.altitude()};
|
|
self_->ui->altitudeLabel->setText(
|
|
QString::fromStdString(units::to_string(altitude)));
|
|
}
|
|
else
|
|
{
|
|
self_->ui->altitudeLabel->setText(kDisabledString_);
|
|
}
|
|
|
|
if (info.hasAttribute(QGeoPositionInfo::Attribute::Direction))
|
|
{
|
|
units::angle::degrees<double> direction {
|
|
info.attribute(QGeoPositionInfo::Attribute::Direction)};
|
|
self_->ui->directionLabel->setText(
|
|
QString::fromStdString(units::to_string(direction)));
|
|
}
|
|
else
|
|
{
|
|
self_->ui->directionLabel->setText(kDisabledString_);
|
|
}
|
|
|
|
if (info.hasAttribute(QGeoPositionInfo::Attribute::GroundSpeed))
|
|
{
|
|
units::velocity::meters_per_second<double> groundSpeed {
|
|
info.attribute(QGeoPositionInfo::Attribute::GroundSpeed)};
|
|
self_->ui->groundSpeedLabel->setText(
|
|
QString::fromStdString(units::to_string(groundSpeed)));
|
|
}
|
|
else
|
|
{
|
|
self_->ui->groundSpeedLabel->setText(kDisabledString_);
|
|
}
|
|
|
|
if (info.hasAttribute(QGeoPositionInfo::Attribute::VerticalSpeed))
|
|
{
|
|
units::velocity::meters_per_second<double> verticalSpeed {
|
|
info.attribute(QGeoPositionInfo::Attribute::VerticalSpeed)};
|
|
self_->ui->verticalSpeedLabel->setText(
|
|
QString::fromStdString(units::to_string(verticalSpeed)));
|
|
}
|
|
else
|
|
{
|
|
self_->ui->verticalSpeedLabel->setText(kDisabledString_);
|
|
}
|
|
|
|
if (info.hasAttribute(QGeoPositionInfo::Attribute::MagneticVariation))
|
|
{
|
|
units::angle::degrees<double> magneticVariation {
|
|
info.attribute(QGeoPositionInfo::Attribute::MagneticVariation)};
|
|
self_->ui->magneticVariationLabel->setText(
|
|
QString::fromStdString(units::to_string(magneticVariation)));
|
|
}
|
|
else
|
|
{
|
|
self_->ui->magneticVariationLabel->setText(kDisabledString_);
|
|
}
|
|
|
|
if (info.hasAttribute(QGeoPositionInfo::Attribute::HorizontalAccuracy))
|
|
{
|
|
units::length::meters<double> horizontalAccuracy {
|
|
info.attribute(QGeoPositionInfo::Attribute::HorizontalAccuracy)};
|
|
if (!std::isnan(horizontalAccuracy.value()))
|
|
{
|
|
self_->ui->horizontalAccuracyLabel->setText(
|
|
QString::fromStdString(units::to_string(horizontalAccuracy)));
|
|
}
|
|
else
|
|
{
|
|
self_->ui->horizontalAccuracyLabel->setText(kDisabledString_);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
self_->ui->horizontalAccuracyLabel->setText(kDisabledString_);
|
|
}
|
|
|
|
if (info.hasAttribute(QGeoPositionInfo::Attribute::VerticalAccuracy))
|
|
{
|
|
units::length::meters<double> verticalAccuracy {
|
|
info.attribute(QGeoPositionInfo::Attribute::VerticalAccuracy)};
|
|
if (!std::isnan(verticalAccuracy.value()))
|
|
{
|
|
self_->ui->verticalAccuracyLabel->setText(
|
|
QString::fromStdString(units::to_string(verticalAccuracy)));
|
|
}
|
|
else
|
|
{
|
|
self_->ui->verticalAccuracyLabel->setText(kDisabledString_);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
self_->ui->verticalAccuracyLabel->setText(kDisabledString_);
|
|
}
|
|
|
|
if (info.hasAttribute(QGeoPositionInfo::Attribute::DirectionAccuracy))
|
|
{
|
|
units::angle::degrees<double> directionAccuracy {
|
|
info.attribute(QGeoPositionInfo::Attribute::DirectionAccuracy)};
|
|
self_->ui->directionAccuracyLabel->setText(
|
|
QString::fromStdString(units::to_string(directionAccuracy)));
|
|
}
|
|
else
|
|
{
|
|
self_->ui->directionAccuracyLabel->setText(kDisabledString_);
|
|
}
|
|
|
|
if (updateTime)
|
|
{
|
|
self_->ui->lastUpdateLabel->setText(
|
|
info.timestamp().toString(Qt::DateFormat::ISODate));
|
|
}
|
|
}
|
|
|
|
} // namespace ui
|
|
} // namespace qt
|
|
} // namespace scwx
|