Revision control
++ // Copyright (C) 2023 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
++
++ #include "controller.h"
++ #include "laststrikeinfo.h"
++ #include "lightningitemmodel.h"
++ #include "lightningprovider.h"
++
++ namespace {
++ constexpr int NOTIFICATION_RADIUS = 100000; // meters
++ }
++
++ Controller::Controller(QObject *parent)
++ : QObject{parent}
++ {
++ connect(&m_provider, &LightningProvider::dataReady, this, &Controller::onDataReceived);
++ }
++
++ Controller::~Controller()
++ {
++ }
++
++ QAbstractItemModel *Controller::getModel()
++ {
++ return &m_model;
++ }
++
++ int Controller::getLastStrikeTime()
++ {
++ return m_lastStrikeInfo.isValid() ? m_lastStrikeInfo.timestamp.count() : -1;
++ }
++
++ double Controller::getLastStrikeDistance()
++ {
++ return m_lastStrikeInfo.isValid() ? m_lastStrikeInfo.distance : -1;
++ }
++
++ double Controller::getLastStrikeDirection()
++ {
++ return m_lastStrikeInfo.isValid() ? m_lastStrikeInfo.direction : -1;
++ }
++
++ bool Controller::isDistanceTimeLayerEnabled() const
++ {
++ return m_distanceTimeLayerEnabled;
++ }
++
++ void Controller::updateDistanceTime()
++ {
++ if (!isDistanceTimeLayerEnabled())
++ return;
++
++ m_lastStrikeInfo.invalidate();
++ m_model.getLatestStrikeInfo(m_userLocation, NOTIFICATION_RADIUS, &m_lastStrikeInfo);
++
++ emit lastStrikeInfoUpdated();
++ }
++
++ void Controller::updateDistanceTime(const LightningItemData &data)
++ {
++ if (!isDistanceTimeLayerEnabled())
++ return;
++
++ LastStrikeInfo strikeInfo(data.getDistanceTo(m_userLocation),
++ data.timestamp,
++ data.getDirectionFrom(m_userLocation));
++ if (strikeInfo.distance > NOTIFICATION_RADIUS)
++ return;
++
++ m_lastStrikeInfo = strikeInfo;
++
++ emit lastStrikeInfoUpdated();
++ }
++
++ void Controller::onDataReceived(const LightningItemData &data)
++ {
++ m_model.insertData(data);
++
++ updateDistanceTime(data);
++ }
++
++ void Controller::setUserLocation(const QGeoCoordinate &coordinate)
++ {
++ if (m_userLocation == coordinate)
++ return;
++ m_userLocation = coordinate;
++
++ updateDistanceTime();
++ }
++
++ void Controller::setDistanceTimeLayerEnabled(bool enabled)
++ {
++ if (m_distanceTimeLayerEnabled == enabled)
++ return;
++ m_distanceTimeLayerEnabled = enabled;
++ emit distanceTimeLayerEnabledChanged();
++
++ updateDistanceTime();
++ }