mirror of
https://github.com/ciphervance/supercell-wx.git
synced 2025-10-30 21:20:06 +00:00
Add position manager to handle location updates
This commit is contained in:
parent
f515ac7b45
commit
fca6a6484e
3 changed files with 165 additions and 0 deletions
|
|
@ -76,6 +76,7 @@ set(SRC_GL_DRAW source/scwx/qt/gl/draw/draw_item.cpp
|
||||||
source/scwx/qt/gl/draw/rectangle.cpp)
|
source/scwx/qt/gl/draw/rectangle.cpp)
|
||||||
set(HDR_MANAGER source/scwx/qt/manager/font_manager.hpp
|
set(HDR_MANAGER source/scwx/qt/manager/font_manager.hpp
|
||||||
source/scwx/qt/manager/placefile_manager.hpp
|
source/scwx/qt/manager/placefile_manager.hpp
|
||||||
|
source/scwx/qt/manager/position_manager.hpp
|
||||||
source/scwx/qt/manager/radar_product_manager.hpp
|
source/scwx/qt/manager/radar_product_manager.hpp
|
||||||
source/scwx/qt/manager/radar_product_manager_notifier.hpp
|
source/scwx/qt/manager/radar_product_manager_notifier.hpp
|
||||||
source/scwx/qt/manager/resource_manager.hpp
|
source/scwx/qt/manager/resource_manager.hpp
|
||||||
|
|
@ -85,6 +86,7 @@ set(HDR_MANAGER source/scwx/qt/manager/font_manager.hpp
|
||||||
source/scwx/qt/manager/update_manager.hpp)
|
source/scwx/qt/manager/update_manager.hpp)
|
||||||
set(SRC_MANAGER source/scwx/qt/manager/font_manager.cpp
|
set(SRC_MANAGER source/scwx/qt/manager/font_manager.cpp
|
||||||
source/scwx/qt/manager/placefile_manager.cpp
|
source/scwx/qt/manager/placefile_manager.cpp
|
||||||
|
source/scwx/qt/manager/position_manager.cpp
|
||||||
source/scwx/qt/manager/radar_product_manager.cpp
|
source/scwx/qt/manager/radar_product_manager.cpp
|
||||||
source/scwx/qt/manager/radar_product_manager_notifier.cpp
|
source/scwx/qt/manager/radar_product_manager_notifier.cpp
|
||||||
source/scwx/qt/manager/resource_manager.cpp
|
source/scwx/qt/manager/resource_manager.cpp
|
||||||
|
|
|
||||||
121
scwx-qt/source/scwx/qt/manager/position_manager.cpp
Normal file
121
scwx-qt/source/scwx/qt/manager/position_manager.cpp
Normal file
|
|
@ -0,0 +1,121 @@
|
||||||
|
#include <scwx/qt/manager/position_manager.hpp>
|
||||||
|
#include <scwx/common/geographic.hpp>
|
||||||
|
#include <scwx/util/logger.hpp>
|
||||||
|
|
||||||
|
#include <set>
|
||||||
|
|
||||||
|
#include <QGeoPositionInfoSource>
|
||||||
|
|
||||||
|
namespace scwx
|
||||||
|
{
|
||||||
|
namespace qt
|
||||||
|
{
|
||||||
|
namespace manager
|
||||||
|
{
|
||||||
|
|
||||||
|
static const std::string logPrefix_ = "scwx::qt::manager::position_manager";
|
||||||
|
static const auto logger_ = scwx::util::Logger::Create(logPrefix_);
|
||||||
|
|
||||||
|
class PositionManager::Impl
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit Impl(PositionManager* self) : self_ {self}
|
||||||
|
{
|
||||||
|
// TODO: macOS requires permission
|
||||||
|
geoPositionInfoSource_ =
|
||||||
|
QGeoPositionInfoSource::createDefaultSource(self);
|
||||||
|
|
||||||
|
if (geoPositionInfoSource_ != nullptr)
|
||||||
|
{
|
||||||
|
logger_->debug("Using position source: {}",
|
||||||
|
geoPositionInfoSource_->sourceName().toStdString());
|
||||||
|
|
||||||
|
QObject::connect(geoPositionInfoSource_,
|
||||||
|
&QGeoPositionInfoSource::positionUpdated,
|
||||||
|
self_,
|
||||||
|
[this](const QGeoPositionInfo& info)
|
||||||
|
{
|
||||||
|
auto coordinate = info.coordinate();
|
||||||
|
|
||||||
|
if (coordinate != position_.coordinate())
|
||||||
|
{
|
||||||
|
logger_->debug("Position updated: {}, {}",
|
||||||
|
coordinate.latitude(),
|
||||||
|
coordinate.longitude());
|
||||||
|
}
|
||||||
|
|
||||||
|
position_ = info;
|
||||||
|
|
||||||
|
Q_EMIT self_->PositionUpdated(info);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
~Impl() {}
|
||||||
|
|
||||||
|
PositionManager* self_;
|
||||||
|
|
||||||
|
std::set<boost::uuids::uuid> uuids_ {};
|
||||||
|
|
||||||
|
QGeoPositionInfoSource* geoPositionInfoSource_ {};
|
||||||
|
QGeoPositionInfo position_ {};
|
||||||
|
};
|
||||||
|
|
||||||
|
PositionManager::PositionManager() : p(std::make_unique<Impl>(this)) {}
|
||||||
|
PositionManager::~PositionManager() = default;
|
||||||
|
|
||||||
|
QGeoPositionInfo PositionManager::position() const
|
||||||
|
{
|
||||||
|
return p->position_;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PositionManager::TrackLocation(boost::uuids::uuid uuid,
|
||||||
|
bool trackingEnabled)
|
||||||
|
{
|
||||||
|
if (p->geoPositionInfoSource_ == nullptr)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (trackingEnabled)
|
||||||
|
{
|
||||||
|
if (p->uuids_.empty())
|
||||||
|
{
|
||||||
|
p->geoPositionInfoSource_->startUpdates();
|
||||||
|
}
|
||||||
|
|
||||||
|
p->uuids_.insert(uuid);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
p->uuids_.erase(uuid);
|
||||||
|
|
||||||
|
if (p->uuids_.empty())
|
||||||
|
{
|
||||||
|
p->geoPositionInfoSource_->stopUpdates();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<PositionManager> PositionManager::Instance()
|
||||||
|
{
|
||||||
|
static std::weak_ptr<PositionManager> positionManagerReference_ {};
|
||||||
|
static std::mutex instanceMutex_ {};
|
||||||
|
|
||||||
|
std::unique_lock lock(instanceMutex_);
|
||||||
|
|
||||||
|
std::shared_ptr<PositionManager> positionManager =
|
||||||
|
positionManagerReference_.lock();
|
||||||
|
|
||||||
|
if (positionManager == nullptr)
|
||||||
|
{
|
||||||
|
positionManager = std::make_shared<PositionManager>();
|
||||||
|
positionManagerReference_ = positionManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
return positionManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace manager
|
||||||
|
} // namespace qt
|
||||||
|
} // namespace scwx
|
||||||
42
scwx-qt/source/scwx/qt/manager/position_manager.hpp
Normal file
42
scwx-qt/source/scwx/qt/manager/position_manager.hpp
Normal file
|
|
@ -0,0 +1,42 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
#include <boost/uuid/uuid.hpp>
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
|
class QGeoPositionInfo;
|
||||||
|
|
||||||
|
namespace scwx
|
||||||
|
{
|
||||||
|
namespace qt
|
||||||
|
{
|
||||||
|
namespace manager
|
||||||
|
{
|
||||||
|
|
||||||
|
class PositionManager : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
Q_DISABLE_COPY_MOVE(PositionManager)
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit PositionManager();
|
||||||
|
~PositionManager();
|
||||||
|
|
||||||
|
QGeoPositionInfo position() const;
|
||||||
|
|
||||||
|
void TrackLocation(boost::uuids::uuid uuid, bool trackingEnabled);
|
||||||
|
|
||||||
|
static std::shared_ptr<PositionManager> Instance();
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void PositionUpdated(const QGeoPositionInfo& info);
|
||||||
|
|
||||||
|
private:
|
||||||
|
class Impl;
|
||||||
|
std::unique_ptr<Impl> p;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace manager
|
||||||
|
} // namespace qt
|
||||||
|
} // namespace scwx
|
||||||
Loading…
Add table
Add a link
Reference in a new issue