Initialize geoLines with existing alert segments on layer creation

This commit is contained in:
Dan Paulat 2024-07-14 00:40:15 -05:00
parent 09cdb03699
commit 1bf93c6318

View file

@ -94,7 +94,7 @@ public:
std::shared_ptr<manager::TextEventManager> textEventManager_ { std::shared_ptr<manager::TextEventManager> textEventManager_ {
manager::TextEventManager::Instance()}; manager::TextEventManager::Instance()};
std::mutex alertMutex_ {}; std::shared_mutex alertMutex_ {};
signals: signals:
void AlertAdded(const std::shared_ptr<SegmentRecord>& segmentRecord, void AlertAdded(const std::shared_ptr<SegmentRecord>& segmentRecord,
@ -136,6 +136,7 @@ public:
const std::shared_ptr<AlertLayerHandler::SegmentRecord>& segmentRecord); const std::shared_ptr<AlertLayerHandler::SegmentRecord>& segmentRecord);
void UpdateAlert( void UpdateAlert(
const std::shared_ptr<AlertLayerHandler::SegmentRecord>& segmentRecord); const std::shared_ptr<AlertLayerHandler::SegmentRecord>& segmentRecord);
void ConnectAlertHandlerSignals();
void ConnectSignals(); void ConnectSignals();
static void AddLine(std::shared_ptr<gl::draw::GeoLines>& geoLines, static void AddLine(std::shared_ptr<gl::draw::GeoLines>& geoLines,
@ -193,13 +194,33 @@ void AlertLayer::Initialize()
DrawLayer::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}) for (auto alertActive : {false, true})
{ {
auto& geoLines = p->geoLines_.at(alertActive); auto& geoLines = p->geoLines_.at(alertActive);
geoLines->StartLines(); 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(); geoLines->FinishLines();
} }
p->ConnectAlertHandlerSignals();
} }
void AlertLayer::Render(const QMapLibre::CustomLayerRenderParameters& params) 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( QObject::connect(
&AlertLayerHandler::Instance(), &alertLayerHandler,
&AlertLayerHandler::AlertAdded, &AlertLayerHandler::AlertAdded,
receiver_.get(), receiver_.get(),
[this]( [this](
@ -329,7 +350,7 @@ void AlertLayer::Impl::ConnectSignals()
} }
}); });
QObject::connect( QObject::connect(
&AlertLayerHandler::Instance(), &alertLayerHandler,
&AlertLayerHandler::AlertUpdated, &AlertLayerHandler::AlertUpdated,
receiver_.get(), receiver_.get(),
[this]( [this](
@ -340,6 +361,11 @@ void AlertLayer::Impl::ConnectSignals()
UpdateAlert(segmentRecord); UpdateAlert(segmentRecord);
} }
}); });
}
void AlertLayer::Impl::ConnectSignals()
{
auto timelineManager = manager::TimelineManager::Instance();
QObject::connect(timelineManager.get(), QObject::connect(timelineManager.get(),
&manager::TimelineManager::SelectedTimeUpdated, &manager::TimelineManager::SelectedTimeUpdated,