From c2209908a0ddcff6a79f7d42fedf30e72e6975fe Mon Sep 17 00:00:00 2001 From: AdenKoperczak Date: Wed, 2 Oct 2024 11:34:52 -0400 Subject: [PATCH] initial poi manager and types code --- .../source/scwx/qt/manager/poi_manager.cpp | 109 ++++++++++++++++++ .../source/scwx/qt/manager/poi_manager.hpp | 30 +++++ scwx-qt/source/scwx/qt/types/poi_types.hpp | 30 +++++ 3 files changed, 169 insertions(+) create mode 100644 scwx-qt/source/scwx/qt/manager/poi_manager.cpp create mode 100644 scwx-qt/source/scwx/qt/manager/poi_manager.hpp create mode 100644 scwx-qt/source/scwx/qt/types/poi_types.hpp diff --git a/scwx-qt/source/scwx/qt/manager/poi_manager.cpp b/scwx-qt/source/scwx/qt/manager/poi_manager.cpp new file mode 100644 index 00000000..658ae4da --- /dev/null +++ b/scwx-qt/source/scwx/qt/manager/poi_manager.cpp @@ -0,0 +1,109 @@ +#include +#include +#include + +#include + +#include + +namespace scwx +{ +namespace qt +{ +namespace manager +{ + +static const std::string logPrefix_ = "scwx::qt::manager::placefile_manager"; +static const auto logger_ = scwx::util::Logger::Create(logPrefix_); + +static const std::string kNameName_ = "name"; +static const std::string kLatitudeName_ = "latitude"; +static const std::string kLongitudeName_ = "longitude"; + +class POIManager::Impl +{ +public: + class PointOfInterest; + + explicit Impl(POIManager* self) : self_ {self} {} + + std::string poiSettingsPath_ {}; + + POIManager* self_; + + void ReadPOISettings(); + +}; + +class POIManager::Impl::PointOfInterest +{ +public: + PointOfInterest(std::string name, double latitude, double longitude) : + name_ {name}, latitude_ {latitude}, longitude_ {longitude} + { + } + + std::string name_; + double latitude_; + double longitude_; + + friend void tag_invoke(boost::json::value_from_tag, + boost::json::value& jv, + const std::shared_ptr& record) + { + jv = {{kNameName_, record->name_}, + {kLatitudeName_, record->latitude_}, + {kLongitudeName_, record->longitude_}}; + } + + friend PointOfInterest tag_invoke(boost::json::value_to_tag, + const boost::json::value& jv) + { + return PointOfInterest( + boost::json::value_to(jv.at(kNameName_)), + boost::json::value_to(jv.at(kLatitudeName_)), + boost::json::value_to(jv.at(kLongitudeName_))); + } +}; + +POIManager::POIManager() : p(std::make_unique(this)) {} + +void POIManager::Impl::ReadPOISettings() +{ + logger_->info("Reading point of intrest settings"); + + boost::json::value poiJson = nullptr; + + // Determine if poi settings exists + if (std::filesystem::exists(poiSettingsPath_)) + { + poiJson = util::json::ReadJsonFile(poiSettingsPath_); + } + + if (poiJson != nullptr && poiJson.is_array()) + { + // For each poi entry + auto& poiArray = poiJson.as_array(); + for (auto& poiEntry : poiArray) + { + try + { + PointOfInterest record = + boost::json::value_to(poiEntry); + + if (!record.name_.empty()) + { + // Add record + } + } + catch (const std::exception& ex) + { + logger_->warn("Invalid point of interest entry: {}", ex.what()); + } + } + } +} + +} // namespace manager +} // namespace qt +} // namespace scwx diff --git a/scwx-qt/source/scwx/qt/manager/poi_manager.hpp b/scwx-qt/source/scwx/qt/manager/poi_manager.hpp new file mode 100644 index 00000000..b0bc574d --- /dev/null +++ b/scwx-qt/source/scwx/qt/manager/poi_manager.hpp @@ -0,0 +1,30 @@ +#pragma once + +#include + +#include + +namespace scwx +{ +namespace qt +{ +namespace manager +{ + +class POIManager : public QObject +{ + Q_OBJECT + +public: + explicit POIManager(); + ~POIManager(); + + +private: + class Impl; + std::unique_ptr p; +}; + +} // namespace manager +} // namespace qt +} // namespace scwx diff --git a/scwx-qt/source/scwx/qt/types/poi_types.hpp b/scwx-qt/source/scwx/qt/types/poi_types.hpp new file mode 100644 index 00000000..922ea364 --- /dev/null +++ b/scwx-qt/source/scwx/qt/types/poi_types.hpp @@ -0,0 +1,30 @@ +#pragma once + +#include + +namespace scwx +{ +namespace qt +{ +namespace types +{ + +struct PointOfInterest +{ + PointOfInterest(std::string name, + double latitude, + double longitude) : + name_ {name}, + latitude_ {latitude}, + longitude_ {longitude} + { + } + + std::string name_; + double latitude_; + double longitude_; +}; + +} // namespace types +} // namespace qt +} // namespace scwx