mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-31 00:10:06 +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
				
			
		|  | @ -4,6 +4,7 @@ | |||
| #include <scwx/util/logger.hpp> | ||||
| 
 | ||||
| #include <format> | ||||
| #include <shared_mutex> | ||||
| #include <unordered_map> | ||||
| 
 | ||||
| namespace scwx | ||||
|  | @ -22,6 +23,7 @@ static const std::string defaultRadarSiteFile_ = | |||
| static std::unordered_map<std::string, std::shared_ptr<RadarSite>> | ||||
|                                                     radarSiteMap_; | ||||
| static std::unordered_map<std::string, std::string> siteIdMap_; | ||||
| static std::shared_mutex                            siteMutex_; | ||||
| 
 | ||||
| static bool ValidateJsonEntry(const boost::json::object& o); | ||||
| 
 | ||||
|  | @ -53,7 +55,7 @@ public: | |||
| RadarSite::RadarSite() : p(std::make_unique<RadarSiteImpl>()) {} | ||||
| RadarSite::~RadarSite() = default; | ||||
| 
 | ||||
| RadarSite::RadarSite(RadarSite&&) noexcept = default; | ||||
| RadarSite::RadarSite(RadarSite&&) noexcept            = default; | ||||
| RadarSite& RadarSite::operator=(RadarSite&&) noexcept = default; | ||||
| 
 | ||||
| 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_lock           lock(siteMutex_); | ||||
|    std::shared_ptr<RadarSite> radarSite = nullptr; | ||||
| 
 | ||||
|    if (radarSiteMap_.contains(id)) | ||||
|  | @ -126,9 +129,25 @@ std::shared_ptr<RadarSite> RadarSite::Get(const std::string& id) | |||
|    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 id = "???"; | ||||
|    std::shared_lock lock(siteMutex_); | ||||
|    std::string      id = "???"; | ||||
| 
 | ||||
|    if (siteIdMap_.contains(siteId)) | ||||
|    { | ||||
|  | @ -156,6 +175,8 @@ size_t RadarSite::ReadConfig(const std::string& path) | |||
| 
 | ||||
|    if (dataValid) | ||||
|    { | ||||
|       std::unique_lock lock(siteMutex_); | ||||
| 
 | ||||
|       for (auto& v : j.as_array()) | ||||
|       { | ||||
|          auto& o = v.as_object(); | ||||
|  |  | |||
|  | @ -2,6 +2,7 @@ | |||
| 
 | ||||
| #include <memory> | ||||
| #include <string> | ||||
| #include <vector> | ||||
| 
 | ||||
| namespace scwx | ||||
| { | ||||
|  | @ -18,7 +19,7 @@ public: | |||
|    explicit RadarSite(); | ||||
|    ~RadarSite(); | ||||
| 
 | ||||
|    RadarSite(const RadarSite&) = delete; | ||||
|    RadarSite(const RadarSite&)            = delete; | ||||
|    RadarSite& operator=(const RadarSite&) = delete; | ||||
| 
 | ||||
|    RadarSite(RadarSite&&) noexcept; | ||||
|  | @ -33,7 +34,8 @@ public: | |||
|    std::string place() 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 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