Update alert lines on settings update

This commit is contained in:
Dan Paulat 2024-09-30 06:14:17 -05:00
parent 295bbda921
commit f672ff553a

View file

@ -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,8 +163,8 @@ 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();
void AddLine(std::shared_ptr<gl::draw::GeoLines>& geoLines, void AddLine(std::shared_ptr<gl::draw::GeoLines>& geoLines,
@ -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)
{ {
@ -344,10 +359,9 @@ void AlertLayerHandler::HandleAlert(const types::TextEventKey& key,
continue; continue;
} }
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 = IsAlertActive(segment);
bool alertActive = (action != awips::PVtec::Action::Canceled);
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_;
@ -533,11 +554,8 @@ void AlertLayer::Impl::UpdateAlert(
auto it = linesBySegment_.find(segmentRecord); auto it = linesBySegment_.find(segmentRecord);
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)
{ {