From 1bf93c6318c3734272c606acf8b0913e64bf3774 Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Sun, 14 Jul 2024 00:40:15 -0500 Subject: [PATCH] Initialize geoLines with existing alert segments on layer creation --- scwx-qt/source/scwx/qt/map/alert_layer.cpp | 36 +++++++++++++++++++--- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/scwx-qt/source/scwx/qt/map/alert_layer.cpp b/scwx-qt/source/scwx/qt/map/alert_layer.cpp index c87b4922..d7495d3d 100644 --- a/scwx-qt/source/scwx/qt/map/alert_layer.cpp +++ b/scwx-qt/source/scwx/qt/map/alert_layer.cpp @@ -94,7 +94,7 @@ public: std::shared_ptr textEventManager_ { manager::TextEventManager::Instance()}; - std::mutex alertMutex_ {}; + std::shared_mutex alertMutex_ {}; signals: void AlertAdded(const std::shared_ptr& segmentRecord, @@ -136,6 +136,7 @@ public: const std::shared_ptr& segmentRecord); void UpdateAlert( const std::shared_ptr& segmentRecord); + void ConnectAlertHandlerSignals(); void ConnectSignals(); static void AddLine(std::shared_ptr& geoLines, @@ -193,13 +194,33 @@ void AlertLayer::Initialize() DrawLayer::Initialize(); + auto& alertLayerHandler = AlertLayerHandler::Instance(); + + // Take a shared lock to prevent handling additional alerts while populating + // initial lists + std::shared_lock lock {alertLayerHandler.alertMutex_}; + for (auto alertActive : {false, true}) { auto& geoLines = p->geoLines_.at(alertActive); geoLines->StartLines(); + + // Populate initial segments + auto segmentsIt = + alertLayerHandler.segmentsByType_.find({p->phenomenon_, alertActive}); + if (segmentsIt != alertLayerHandler.segmentsByType_.cend()) + { + for (auto& segment : segmentsIt->second) + { + p->AddAlert(segment); + } + } + geoLines->FinishLines(); } + + p->ConnectAlertHandlerSignals(); } void AlertLayer::Render(const QMapLibre::CustomLayerRenderParameters& params) @@ -311,12 +332,12 @@ void AlertLayerHandler::HandleAlert(const types::TextEventKey& key, } } -void AlertLayer::Impl::ConnectSignals() +void AlertLayer::Impl::ConnectAlertHandlerSignals() { - auto timelineManager = manager::TimelineManager::Instance(); + auto& alertLayerHandler = AlertLayerHandler::Instance(); QObject::connect( - &AlertLayerHandler::Instance(), + &alertLayerHandler, &AlertLayerHandler::AlertAdded, receiver_.get(), [this]( @@ -329,7 +350,7 @@ void AlertLayer::Impl::ConnectSignals() } }); QObject::connect( - &AlertLayerHandler::Instance(), + &alertLayerHandler, &AlertLayerHandler::AlertUpdated, receiver_.get(), [this]( @@ -340,6 +361,11 @@ void AlertLayer::Impl::ConnectSignals() UpdateAlert(segmentRecord); } }); +} + +void AlertLayer::Impl::ConnectSignals() +{ + auto timelineManager = manager::TimelineManager::Instance(); QObject::connect(timelineManager.get(), &manager::TimelineManager::SelectedTimeUpdated,