mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-31 18:10:05 +00:00 
			
		
		
		
	Add initial radar site model
This commit is contained in:
		
							parent
							
								
									b6e7c829ee
								
							
						
					
					
						commit
						60a85a6b14
					
				
					 5 changed files with 189 additions and 4 deletions
				
			
		|  | @ -82,9 +82,11 @@ set(SRC_MAP source/scwx/qt/map/color_table_layer.cpp | ||||||
|             source/scwx/qt/map/radar_product_layer.cpp |             source/scwx/qt/map/radar_product_layer.cpp | ||||||
|             source/scwx/qt/map/radar_range_layer.cpp) |             source/scwx/qt/map/radar_range_layer.cpp) | ||||||
| set(HDR_MODEL source/scwx/qt/model/radar_product_model.hpp | set(HDR_MODEL source/scwx/qt/model/radar_product_model.hpp | ||||||
|  |               source/scwx/qt/model/radar_site_model.hpp | ||||||
|               source/scwx/qt/model/tree_item.hpp |               source/scwx/qt/model/tree_item.hpp | ||||||
|               source/scwx/qt/model/tree_model.hpp) |               source/scwx/qt/model/tree_model.hpp) | ||||||
| set(SRC_MODEL source/scwx/qt/model/radar_product_model.cpp | set(SRC_MODEL source/scwx/qt/model/radar_product_model.cpp | ||||||
|  |               source/scwx/qt/model/radar_site_model.cpp | ||||||
|               source/scwx/qt/model/tree_item.cpp |               source/scwx/qt/model/tree_item.cpp | ||||||
|               source/scwx/qt/model/tree_model.cpp) |               source/scwx/qt/model/tree_model.cpp) | ||||||
| set(HDR_REQUEST source/scwx/qt/request/nexrad_file_request.hpp) | set(HDR_REQUEST source/scwx/qt/request/nexrad_file_request.hpp) | ||||||
|  |  | ||||||
|  | @ -4,6 +4,7 @@ | ||||||
| #include <scwx/util/logger.hpp> | #include <scwx/util/logger.hpp> | ||||||
| 
 | 
 | ||||||
| #include <format> | #include <format> | ||||||
|  | #include <shared_mutex> | ||||||
| #include <unordered_map> | #include <unordered_map> | ||||||
| 
 | 
 | ||||||
| namespace scwx | namespace scwx | ||||||
|  | @ -22,6 +23,7 @@ static const std::string defaultRadarSiteFile_ = | ||||||
| static std::unordered_map<std::string, std::shared_ptr<RadarSite>> | static std::unordered_map<std::string, std::shared_ptr<RadarSite>> | ||||||
|                                                     radarSiteMap_; |                                                     radarSiteMap_; | ||||||
| static std::unordered_map<std::string, std::string> siteIdMap_; | static std::unordered_map<std::string, std::string> siteIdMap_; | ||||||
|  | static std::shared_mutex                            siteMutex_; | ||||||
| 
 | 
 | ||||||
| static bool ValidateJsonEntry(const boost::json::object& o); | static bool ValidateJsonEntry(const boost::json::object& o); | ||||||
| 
 | 
 | ||||||
|  | @ -53,7 +55,7 @@ public: | ||||||
| RadarSite::RadarSite() : p(std::make_unique<RadarSiteImpl>()) {} | RadarSite::RadarSite() : p(std::make_unique<RadarSiteImpl>()) {} | ||||||
| RadarSite::~RadarSite() = default; | RadarSite::~RadarSite() = default; | ||||||
| 
 | 
 | ||||||
| RadarSite::RadarSite(RadarSite&&) noexcept = default; | RadarSite::RadarSite(RadarSite&&) noexcept            = default; | ||||||
| RadarSite& RadarSite::operator=(RadarSite&&) noexcept = default; | RadarSite& RadarSite::operator=(RadarSite&&) noexcept = default; | ||||||
| 
 | 
 | ||||||
| std::string RadarSite::type() const | std::string RadarSite::type() const | ||||||
|  | @ -116,6 +118,7 @@ std::string RadarSite::location_name() const | ||||||
| 
 | 
 | ||||||
| std::shared_ptr<RadarSite> RadarSite::Get(const std::string& id) | std::shared_ptr<RadarSite> RadarSite::Get(const std::string& id) | ||||||
| { | { | ||||||
|  |    std::shared_lock           lock(siteMutex_); | ||||||
|    std::shared_ptr<RadarSite> radarSite = nullptr; |    std::shared_ptr<RadarSite> radarSite = nullptr; | ||||||
| 
 | 
 | ||||||
|    if (radarSiteMap_.contains(id)) |    if (radarSiteMap_.contains(id)) | ||||||
|  | @ -126,9 +129,25 @@ std::shared_ptr<RadarSite> RadarSite::Get(const std::string& id) | ||||||
|    return radarSite; |    return radarSite; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | std::vector<std::shared_ptr<RadarSite>> RadarSite::GetAll() | ||||||
|  | { | ||||||
|  |    std::shared_lock                        lock(siteMutex_); | ||||||
|  |    std::vector<std::shared_ptr<RadarSite>> radarSites; | ||||||
|  | 
 | ||||||
|  |    radarSites.reserve(radarSiteMap_.size()); | ||||||
|  | 
 | ||||||
|  |    for (const auto& site : radarSiteMap_) | ||||||
|  |    { | ||||||
|  |       radarSites.push_back(site.second); | ||||||
|  |    } | ||||||
|  | 
 | ||||||
|  |    return std::move(radarSites); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| std::string GetRadarIdFromSiteId(const std::string& siteId) | std::string GetRadarIdFromSiteId(const std::string& siteId) | ||||||
| { | { | ||||||
|    std::string id = "???"; |    std::shared_lock lock(siteMutex_); | ||||||
|  |    std::string      id = "???"; | ||||||
| 
 | 
 | ||||||
|    if (siteIdMap_.contains(siteId)) |    if (siteIdMap_.contains(siteId)) | ||||||
|    { |    { | ||||||
|  | @ -156,6 +175,8 @@ size_t RadarSite::ReadConfig(const std::string& path) | ||||||
| 
 | 
 | ||||||
|    if (dataValid) |    if (dataValid) | ||||||
|    { |    { | ||||||
|  |       std::unique_lock lock(siteMutex_); | ||||||
|  | 
 | ||||||
|       for (auto& v : j.as_array()) |       for (auto& v : j.as_array()) | ||||||
|       { |       { | ||||||
|          auto& o = v.as_object(); |          auto& o = v.as_object(); | ||||||
|  |  | ||||||
|  | @ -2,6 +2,7 @@ | ||||||
| 
 | 
 | ||||||
| #include <memory> | #include <memory> | ||||||
| #include <string> | #include <string> | ||||||
|  | #include <vector> | ||||||
| 
 | 
 | ||||||
| namespace scwx | namespace scwx | ||||||
| { | { | ||||||
|  | @ -18,7 +19,7 @@ public: | ||||||
|    explicit RadarSite(); |    explicit RadarSite(); | ||||||
|    ~RadarSite(); |    ~RadarSite(); | ||||||
| 
 | 
 | ||||||
|    RadarSite(const RadarSite&) = delete; |    RadarSite(const RadarSite&)            = delete; | ||||||
|    RadarSite& operator=(const RadarSite&) = delete; |    RadarSite& operator=(const RadarSite&) = delete; | ||||||
| 
 | 
 | ||||||
|    RadarSite(RadarSite&&) noexcept; |    RadarSite(RadarSite&&) noexcept; | ||||||
|  | @ -33,7 +34,8 @@ public: | ||||||
|    std::string place() const; |    std::string place() const; | ||||||
|    std::string location_name() const; |    std::string location_name() const; | ||||||
| 
 | 
 | ||||||
|    static std::shared_ptr<RadarSite> Get(const std::string& id); |    static std::shared_ptr<RadarSite>              Get(const std::string& id); | ||||||
|  |    static std::vector<std::shared_ptr<RadarSite>> GetAll(); | ||||||
| 
 | 
 | ||||||
|    static void   Initialize(); |    static void   Initialize(); | ||||||
|    static size_t ReadConfig(const std::string& path); |    static size_t ReadConfig(const std::string& path); | ||||||
|  |  | ||||||
							
								
								
									
										121
									
								
								scwx-qt/source/scwx/qt/model/radar_site_model.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								scwx-qt/source/scwx/qt/model/radar_site_model.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,121 @@ | ||||||
|  | #include <scwx/qt/model/radar_site_model.hpp> | ||||||
|  | #include <scwx/qt/config/radar_site.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 kNumColumns = 7u; | ||||||
|  | 
 | ||||||
|  | class RadarSiteModelImpl | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |    explicit RadarSiteModelImpl(); | ||||||
|  |    ~RadarSiteModelImpl() = default; | ||||||
|  | 
 | ||||||
|  |    QList<std::shared_ptr<config::RadarSite>> radarSites_; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 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) | ||||||
|  |    { | ||||||
|  |       const auto& site = p->radarSites_.at(index.row()); | ||||||
|  | 
 | ||||||
|  |       switch (index.column()) | ||||||
|  |       { | ||||||
|  |       case 0: | ||||||
|  |          return QString::fromStdString(site->id()); | ||||||
|  |       case 1: | ||||||
|  |          return QString::fromStdString(site->place()); | ||||||
|  |       case 2: | ||||||
|  |          return QString::fromStdString(site->state()); | ||||||
|  |       case 3: | ||||||
|  |          return QString::fromStdString(site->country()); | ||||||
|  |       case 4: | ||||||
|  |          return QString("%1").arg(site->latitude()); | ||||||
|  |       case 5: | ||||||
|  |          return QString("%1").arg(site->longitude()); | ||||||
|  |       case 6: | ||||||
|  |          return QString::fromStdString(site->type()); | ||||||
|  |       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 0: | ||||||
|  |             return tr("Site ID"); | ||||||
|  |          case 1: | ||||||
|  |             return tr("Place"); | ||||||
|  |          case 2: | ||||||
|  |             return tr("State"); | ||||||
|  |          case 3: | ||||||
|  |             return tr("Country"); | ||||||
|  |          case 4: | ||||||
|  |             return tr("Latitude"); | ||||||
|  |          case 5: | ||||||
|  |             return tr("Longitude"); | ||||||
|  |          case 6: | ||||||
|  |             return tr("Type"); | ||||||
|  |          default: | ||||||
|  |             break; | ||||||
|  |          } | ||||||
|  |       } | ||||||
|  |    } | ||||||
|  | 
 | ||||||
|  |    return QVariant(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | RadarSiteModelImpl::RadarSiteModelImpl() : radarSites_ {} | ||||||
|  | { | ||||||
|  |    // Get all loaded radar sites
 | ||||||
|  |    std::vector<std::shared_ptr<config::RadarSite>> radarSites = | ||||||
|  |       config::RadarSite::GetAll(); | ||||||
|  | 
 | ||||||
|  |    // Setup radar site list
 | ||||||
|  |    for (auto& site : radarSites) | ||||||
|  |    { | ||||||
|  |       radarSites_.emplace_back(std::move(site)); | ||||||
|  |    } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | } // namespace model
 | ||||||
|  | } // namespace qt
 | ||||||
|  | } // namespace scwx
 | ||||||
							
								
								
									
										39
									
								
								scwx-qt/source/scwx/qt/model/radar_site_model.hpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								scwx-qt/source/scwx/qt/model/radar_site_model.hpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,39 @@ | ||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #include <memory> | ||||||
|  | 
 | ||||||
|  | #include <QAbstractTableModel> | ||||||
|  | 
 | ||||||
|  | namespace scwx | ||||||
|  | { | ||||||
|  | namespace qt | ||||||
|  | { | ||||||
|  | namespace model | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | class RadarSiteModelImpl; | ||||||
|  | 
 | ||||||
|  | class RadarSiteModel : public QAbstractTableModel | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |    explicit RadarSiteModel(QObject* parent = nullptr); | ||||||
|  |    ~RadarSiteModel(); | ||||||
|  | 
 | ||||||
|  |    int rowCount(const QModelIndex& parent = QModelIndex()) const override; | ||||||
|  |    int columnCount(const QModelIndex& parent = QModelIndex()) const override; | ||||||
|  | 
 | ||||||
|  |    QVariant data(const QModelIndex& index, | ||||||
|  |                  int                role = Qt::DisplayRole) const override; | ||||||
|  |    QVariant headerData(int             section, | ||||||
|  |                        Qt::Orientation orientation, | ||||||
|  |                        int             role = Qt::DisplayRole) const override; | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  |    std::unique_ptr<RadarSiteModelImpl> p; | ||||||
|  | 
 | ||||||
|  |    friend class RadarSiteModelImpl; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | } // namespace model
 | ||||||
|  | } // namespace qt
 | ||||||
|  | } // namespace scwx
 | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Dan Paulat
						Dan Paulat