mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-31 18:40:05 +00:00 
			
		
		
		
	Update alert lines on settings update
This commit is contained in:
		
							parent
							
								
									295bbda921
								
							
						
					
					
						commit
						f672ff553a
					
				
					 1 changed files with 82 additions and 17 deletions
				
			
		|  | @ -9,6 +9,7 @@ | ||||||
| 
 | 
 | ||||||
| #include <chrono> | #include <chrono> | ||||||
| #include <mutex> | #include <mutex> | ||||||
|  | #include <ranges> | ||||||
| #include <unordered_map> | #include <unordered_map> | ||||||
| #include <unordered_set> | #include <unordered_set> | ||||||
| 
 | 
 | ||||||
|  | @ -40,6 +41,8 @@ struct AlertTypeHash<std::pair<awips::Phenomenon, bool>> | ||||||
|    size_t operator()(const std::pair<awips::Phenomenon, bool>& x) const; |    size_t operator()(const std::pair<awips::Phenomenon, bool>& x) const; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | static bool IsAlertActive(const std::shared_ptr<const awips::Segment>& segment); | ||||||
|  | 
 | ||||||
| class AlertLayerHandler : public QObject | class AlertLayerHandler : public QObject | ||||||
| { | { | ||||||
|    Q_OBJECT |    Q_OBJECT | ||||||
|  | @ -160,7 +163,7 @@ public: | ||||||
|                             const QPointF& mouseGlobalPos); |                             const QPointF& mouseGlobalPos); | ||||||
|    void ScheduleRefresh(); |    void ScheduleRefresh(); | ||||||
| 
 | 
 | ||||||
|    LineData& GetLineData(std::shared_ptr<const awips::Segment>& segment, |    LineData& GetLineData(const std::shared_ptr<const awips::Segment>& segment, | ||||||
|                          bool alertActive); |                          bool alertActive); | ||||||
|    void      UpdateLineData(); |    void      UpdateLineData(); | ||||||
| 
 | 
 | ||||||
|  | @ -182,6 +185,7 @@ public: | ||||||
|                  bool                                   enableHover, |                  bool                                   enableHover, | ||||||
|                  boost::container::stable_vector< |                  boost::container::stable_vector< | ||||||
|                     std::shared_ptr<gl::draw::GeoLineDrawItem>>& drawItems); |                     std::shared_ptr<gl::draw::GeoLineDrawItem>>& drawItems); | ||||||
|  |    void UpdateLines(); | ||||||
| 
 | 
 | ||||||
|    static LineData CreateLineData(const settings::LineSettings& lineSettings); |    static LineData CreateLineData(const settings::LineSettings& lineSettings); | ||||||
| 
 | 
 | ||||||
|  | @ -218,6 +222,8 @@ public: | ||||||
| 
 | 
 | ||||||
|    std::shared_ptr<const gl::draw::GeoLineDrawItem> lastHoverDi_ {nullptr}; |    std::shared_ptr<const gl::draw::GeoLineDrawItem> lastHoverDi_ {nullptr}; | ||||||
|    std::string                                      tooltip_ {}; |    std::string                                      tooltip_ {}; | ||||||
|  | 
 | ||||||
|  |    std::vector<boost::signals2::scoped_connection> connections_ {}; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| AlertLayer::AlertLayer(std::shared_ptr<MapContext> context, | AlertLayer::AlertLayer(std::shared_ptr<MapContext> context, | ||||||
|  | @ -302,6 +308,15 @@ void AlertLayer::Deinitialize() | ||||||
|    DrawLayer::Deinitialize(); |    DrawLayer::Deinitialize(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | bool IsAlertActive(const std::shared_ptr<const awips::Segment>& segment) | ||||||
|  | { | ||||||
|  |    auto& vtec        = segment->header_->vtecString_.front(); | ||||||
|  |    auto  action      = vtec.pVtec_.action(); | ||||||
|  |    bool  alertActive = (action != awips::PVtec::Action::Canceled); | ||||||
|  | 
 | ||||||
|  |    return alertActive; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void AlertLayerHandler::HandleAlert(const types::TextEventKey& key, | void AlertLayerHandler::HandleAlert(const types::TextEventKey& key, | ||||||
|                                     size_t                     messageIndex) |                                     size_t                     messageIndex) | ||||||
| { | { | ||||||
|  | @ -345,9 +360,8 @@ void AlertLayerHandler::HandleAlert(const types::TextEventKey& key, | ||||||
|       } |       } | ||||||
| 
 | 
 | ||||||
|       auto&             vtec        = segment->header_->vtecString_.front(); |       auto&             vtec        = segment->header_->vtecString_.front(); | ||||||
|       auto              action     = vtec.pVtec_.action(); |  | ||||||
|       awips::Phenomenon phenomenon  = vtec.pVtec_.phenomenon(); |       awips::Phenomenon phenomenon  = vtec.pVtec_.phenomenon(); | ||||||
|       bool alertActive             = (action != awips::PVtec::Action::Canceled); |       bool              alertActive = IsAlertActive(segment); | ||||||
| 
 | 
 | ||||||
|       auto& segmentsForType = segmentsByType_[{key.phenomenon_, alertActive}]; |       auto& segmentsForType = segmentsByType_[{key.phenomenon_, alertActive}]; | ||||||
| 
 | 
 | ||||||
|  | @ -406,6 +420,8 @@ void AlertLayer::Impl::ConnectAlertHandlerSignals() | ||||||
| 
 | 
 | ||||||
| void AlertLayer::Impl::ConnectSignals() | void AlertLayer::Impl::ConnectSignals() | ||||||
| { | { | ||||||
|  |    auto& alertPaletteSettings = | ||||||
|  |       settings::PaletteSettings::Instance().alert_palette(phenomenon_); | ||||||
|    auto timelineManager = manager::TimelineManager::Instance(); |    auto timelineManager = manager::TimelineManager::Instance(); | ||||||
| 
 | 
 | ||||||
|    QObject::connect(timelineManager.get(), |    QObject::connect(timelineManager.get(), | ||||||
|  | @ -413,6 +429,13 @@ void AlertLayer::Impl::ConnectSignals() | ||||||
|                     receiver_.get(), |                     receiver_.get(), | ||||||
|                     [this](std::chrono::system_clock::time_point dateTime) |                     [this](std::chrono::system_clock::time_point dateTime) | ||||||
|                     { selectedTime_ = dateTime; }); |                     { selectedTime_ = dateTime; }); | ||||||
|  | 
 | ||||||
|  |    connections_.push_back(alertPaletteSettings.changed_signal().connect( | ||||||
|  |       [this]() | ||||||
|  |       { | ||||||
|  |          UpdateLineData(); | ||||||
|  |          UpdateLines(); | ||||||
|  |       })); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void AlertLayer::Impl::ScheduleRefresh() | void AlertLayer::Impl::ScheduleRefresh() | ||||||
|  | @ -452,9 +475,7 @@ void AlertLayer::Impl::AddAlert( | ||||||
| { | { | ||||||
|    auto& segment = segmentRecord->segment_; |    auto& segment = segmentRecord->segment_; | ||||||
| 
 | 
 | ||||||
|    auto& vtec        = segment->header_->vtecString_.front(); |    bool  alertActive = IsAlertActive(segment); | ||||||
|    auto  action      = vtec.pVtec_.action(); |  | ||||||
|    bool  alertActive = (action != awips::PVtec::Action::Canceled); |  | ||||||
|    auto& startTime   = segmentRecord->segmentBegin_; |    auto& startTime   = segmentRecord->segmentBegin_; | ||||||
|    auto& endTime     = segmentRecord->segmentEnd_; |    auto& endTime     = segmentRecord->segmentEnd_; | ||||||
| 
 | 
 | ||||||
|  | @ -534,10 +555,7 @@ void AlertLayer::Impl::UpdateAlert( | ||||||
|    if (it != linesBySegment_.cend()) |    if (it != linesBySegment_.cend()) | ||||||
|    { |    { | ||||||
|       auto& segment     = segmentRecord->segment_; |       auto& segment     = segmentRecord->segment_; | ||||||
| 
 |       bool  alertActive = IsAlertActive(segment); | ||||||
|       auto& vtec        = segment->header_->vtecString_.front(); |  | ||||||
|       auto  action      = vtec.pVtec_.action(); |  | ||||||
|       bool  alertActive = (action != awips::PVtec::Action::Canceled); |  | ||||||
| 
 | 
 | ||||||
|       auto& geoLines = geoLines_.at(alertActive); |       auto& geoLines = geoLines_.at(alertActive); | ||||||
| 
 | 
 | ||||||
|  | @ -624,6 +642,54 @@ void AlertLayer::Impl::AddLine(std::shared_ptr<gl::draw::GeoLines>& geoLines, | ||||||
|    } |    } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void AlertLayer::Impl::UpdateLines() | ||||||
|  | { | ||||||
|  |    std::unique_lock lock {linesMutex_}; | ||||||
|  | 
 | ||||||
|  |    for (auto& segmentLine : linesBySegment_) | ||||||
|  |    { | ||||||
|  |       auto& segmentRecord    = segmentLine.first; | ||||||
|  |       auto& geoLineDrawItems = segmentLine.second; | ||||||
|  |       auto& segment          = segmentRecord->segment_; | ||||||
|  |       bool  alertActive      = IsAlertActive(segment); | ||||||
|  |       auto& lineData         = GetLineData(segment, alertActive); | ||||||
|  |       auto& geoLines         = geoLines_.at(alertActive); | ||||||
|  | 
 | ||||||
|  |       const float borderWidth    = lineData.borderWidth_; | ||||||
|  |       const float highlightWidth = lineData.highlightWidth_; | ||||||
|  |       const float lineWidth      = lineData.lineWidth_; | ||||||
|  | 
 | ||||||
|  |       const float totalHighlightWidth = lineWidth + (highlightWidth * 2.0f); | ||||||
|  |       const float totalBorderWidth = totalHighlightWidth + (borderWidth * 2.0f); | ||||||
|  | 
 | ||||||
|  |       // Border, highlight and line
 | ||||||
|  |       std::size_t linesPerType = geoLineDrawItems.size() / 3; | ||||||
|  | 
 | ||||||
|  |       // Border
 | ||||||
|  |       for (auto& borderLine : geoLineDrawItems | std::views::take(linesPerType)) | ||||||
|  |       { | ||||||
|  |          geoLines->SetLineModulate(borderLine, lineData.borderColor_); | ||||||
|  |          geoLines->SetLineWidth(borderLine, totalBorderWidth); | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|  |       // Highlight
 | ||||||
|  |       for (auto& highlightLine : geoLineDrawItems | | ||||||
|  |                                     std::views::drop(linesPerType) | | ||||||
|  |                                     std::views::take(linesPerType)) | ||||||
|  |       { | ||||||
|  |          geoLines->SetLineModulate(highlightLine, lineData.highlightColor_); | ||||||
|  |          geoLines->SetLineWidth(highlightLine, totalHighlightWidth); | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|  |       // Line
 | ||||||
|  |       for (auto& line : geoLineDrawItems | std::views::drop(linesPerType * 2)) | ||||||
|  |       { | ||||||
|  |          geoLines->SetLineModulate(line, lineData.lineColor_); | ||||||
|  |          geoLines->SetLineWidth(line, lineWidth); | ||||||
|  |       } | ||||||
|  |    } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void AlertLayer::Impl::HandleGeoLinesEvent( | void AlertLayer::Impl::HandleGeoLinesEvent( | ||||||
|    std::shared_ptr<gl::draw::GeoLineDrawItem>& di, QEvent* ev) |    std::shared_ptr<gl::draw::GeoLineDrawItem>& di, QEvent* ev) | ||||||
| { | { | ||||||
|  | @ -713,9 +779,8 @@ void AlertLayer::Impl::UpdateLineData() | ||||||
|    inactiveLineData_ = CreateLineData(alertPalette.inactive()); |    inactiveLineData_ = CreateLineData(alertPalette.inactive()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| AlertLayer::Impl::LineData& | AlertLayer::Impl::LineData& AlertLayer::Impl::GetLineData( | ||||||
| AlertLayer::Impl::GetLineData(std::shared_ptr<const awips::Segment>& segment, |    const std::shared_ptr<const awips::Segment>& segment, bool alertActive) | ||||||
|                               bool alertActive) |  | ||||||
| { | { | ||||||
|    if (!alertActive) |    if (!alertActive) | ||||||
|    { |    { | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Dan Paulat
						Dan Paulat