mirror of
https://github.com/ciphervance/supercell-wx.git
synced 2025-10-30 22:40:05 +00:00
205 lines
5.8 KiB
C++
205 lines
5.8 KiB
C++
#include <scwx/qt/model/radar_site_model.hpp>
|
|
#include <scwx/qt/config/radar_site.hpp>
|
|
#include <scwx/qt/types/qt_types.hpp>
|
|
#include <scwx/qt/util/geographic_lib.hpp>
|
|
#include <scwx/common/geographic.hpp>
|
|
#include <scwx/util/logger.hpp>
|
|
|
|
namespace scwx
|
|
{
|
|
namespace qt
|
|
{
|
|
namespace model
|
|
{
|
|
|
|
static const std::string logPrefix_ = "scwx::qt::model::radar_site_model";
|
|
static const auto logger_ = scwx::util::Logger::Create(logPrefix_);
|
|
|
|
static constexpr size_t kColumnSiteId = 0u;
|
|
static constexpr size_t kColumnPlace = 1u;
|
|
static constexpr size_t kColumnState = 2u;
|
|
static constexpr size_t kColumnCountry = 3u;
|
|
static constexpr size_t kColumnLatitude = 4u;
|
|
static constexpr size_t kColumnLongitude = 5u;
|
|
static constexpr size_t kColumnType = 6u;
|
|
static constexpr size_t kColumnDistance = 7u;
|
|
static constexpr size_t kNumColumns = 8u;
|
|
|
|
class RadarSiteModelImpl
|
|
{
|
|
public:
|
|
explicit RadarSiteModelImpl();
|
|
~RadarSiteModelImpl() = default;
|
|
|
|
QList<std::shared_ptr<config::RadarSite>> radarSites_;
|
|
|
|
const GeographicLib::Geodesic& geodesic_;
|
|
|
|
std::unordered_map<std::string, double> distanceMap_;
|
|
scwx::common::DistanceType distanceDisplay_;
|
|
scwx::common::Coordinate previousPosition_;
|
|
};
|
|
|
|
RadarSiteModel::RadarSiteModel(QObject* parent) :
|
|
QAbstractTableModel(parent), p(std::make_unique<RadarSiteModelImpl>())
|
|
{
|
|
}
|
|
RadarSiteModel::~RadarSiteModel() = default;
|
|
|
|
int RadarSiteModel::rowCount(const QModelIndex& parent) const
|
|
{
|
|
return parent.isValid() ? 0 : p->radarSites_.size();
|
|
}
|
|
|
|
int RadarSiteModel::columnCount(const QModelIndex& parent) const
|
|
{
|
|
return parent.isValid() ? 0 : static_cast<int>(kNumColumns);
|
|
}
|
|
|
|
QVariant RadarSiteModel::data(const QModelIndex& index, int role) const
|
|
{
|
|
if (index.isValid() && index.row() >= 0 &&
|
|
index.row() < p->radarSites_.size() &&
|
|
(role == Qt::DisplayRole || role == types::SortRole))
|
|
{
|
|
const auto& site = p->radarSites_.at(index.row());
|
|
|
|
switch (index.column())
|
|
{
|
|
case kColumnSiteId:
|
|
return QString::fromStdString(site->id());
|
|
case kColumnPlace:
|
|
return QString::fromStdString(site->place());
|
|
case kColumnState:
|
|
return QString::fromStdString(site->state());
|
|
case kColumnCountry:
|
|
return QString::fromStdString(site->country());
|
|
case kColumnLatitude:
|
|
if (role == Qt::DisplayRole)
|
|
{
|
|
return QString::fromStdString(
|
|
scwx::common::GetLatitudeString(site->latitude()));
|
|
}
|
|
else
|
|
{
|
|
return site->latitude();
|
|
}
|
|
case kColumnLongitude:
|
|
if (role == Qt::DisplayRole)
|
|
{
|
|
return QString::fromStdString(
|
|
scwx::common::GetLongitudeString(site->longitude()));
|
|
}
|
|
else
|
|
{
|
|
return site->longitude();
|
|
}
|
|
case kColumnType:
|
|
return QString::fromStdString(site->type_name());
|
|
case kColumnDistance:
|
|
if (role == Qt::DisplayRole)
|
|
{
|
|
if (p->distanceDisplay_ == scwx::common::DistanceType::Miles)
|
|
{
|
|
return QString("%1 mi").arg(
|
|
static_cast<uint32_t>(p->distanceMap_.at(site->id()) *
|
|
scwx::common::kMilesPerMeter));
|
|
}
|
|
else
|
|
{
|
|
return QString("%1 km").arg(
|
|
static_cast<uint32_t>(p->distanceMap_.at(site->id()) *
|
|
scwx::common::kKilometersPerMeter));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return p->distanceMap_.at(site->id());
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
return QVariant();
|
|
}
|
|
|
|
QVariant RadarSiteModel::headerData(int section,
|
|
Qt::Orientation orientation,
|
|
int role) const
|
|
{
|
|
if (role == Qt::DisplayRole)
|
|
{
|
|
if (orientation == Qt::Horizontal)
|
|
{
|
|
switch (section)
|
|
{
|
|
case kColumnSiteId:
|
|
return tr("Site ID");
|
|
case kColumnPlace:
|
|
return tr("Place");
|
|
case kColumnState:
|
|
return tr("State");
|
|
case kColumnCountry:
|
|
return tr("Country");
|
|
case kColumnLatitude:
|
|
return tr("Latitude");
|
|
case kColumnLongitude:
|
|
return tr("Longitude");
|
|
case kColumnType:
|
|
return tr("Type");
|
|
case kColumnDistance:
|
|
return tr("Distance");
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return QVariant();
|
|
}
|
|
|
|
void RadarSiteModel::HandleMapUpdate(double latitude, double longitude)
|
|
{
|
|
logger_->trace("Handle map update: {}, {}", latitude, longitude);
|
|
|
|
double distanceInMeters;
|
|
|
|
for (const auto& site : p->radarSites_)
|
|
{
|
|
p->geodesic_.Inverse(latitude,
|
|
longitude,
|
|
site->latitude(),
|
|
site->longitude(),
|
|
distanceInMeters);
|
|
p->distanceMap_[site->id()] = distanceInMeters;
|
|
}
|
|
|
|
QModelIndex topLeft = createIndex(0, kColumnDistance);
|
|
QModelIndex bottomRight = createIndex(rowCount() - 1, kColumnDistance);
|
|
|
|
Q_EMIT dataChanged(topLeft, bottomRight);
|
|
}
|
|
|
|
RadarSiteModelImpl::RadarSiteModelImpl() :
|
|
radarSites_ {},
|
|
geodesic_(util::GeographicLib::DefaultGeodesic()),
|
|
distanceMap_ {},
|
|
distanceDisplay_ {scwx::common::DistanceType::Miles},
|
|
previousPosition_ {}
|
|
{
|
|
// Get all loaded radar sites
|
|
std::vector<std::shared_ptr<config::RadarSite>> radarSites =
|
|
config::RadarSite::GetAll();
|
|
|
|
// Setup radar site list
|
|
for (auto& site : radarSites)
|
|
{
|
|
distanceMap_[site->id()] = 0.0;
|
|
radarSites_.emplace_back(std::move(site));
|
|
}
|
|
}
|
|
|
|
} // namespace model
|
|
} // namespace qt
|
|
} // namespace scwx
|