diff --git a/scwx-qt/source/scwx/qt/map/map_widget.cpp b/scwx-qt/source/scwx/qt/map/map_widget.cpp index 33d70477..12b3acd9 100644 --- a/scwx-qt/source/scwx/qt/map/map_widget.cpp +++ b/scwx-qt/source/scwx/qt/map/map_widget.cpp @@ -83,6 +83,8 @@ public: const std::string& before = {}); void AutoRefreshConnect(); void AutoRefreshDisconnect(); + void RadarProductViewConnect(); + void RadarProductViewDisconnect(); void SetRadarSite(const std::string& radarSite); bool UpdateStoredMapParameters(); @@ -132,8 +134,7 @@ MapWidget::MapWidget(const QMapboxGLSettings& settings) : MapWidget::~MapWidget() { - // Make sure we have a valid context so we - // can delete the QMapboxGL. + // Make sure we have a valid context so we can delete the QMapboxGL. makeCurrent(); } @@ -250,68 +251,61 @@ void MapWidget::SelectElevation(float elevation) void MapWidget::SelectRadarProduct(common::Level2Product product) { - float currentElevation = 0.0f; + bool radarProductViewCreated = false; std::shared_ptr& radarProductView = p->context_->radarProductView_; - if (p->context_->radarProductView_ != nullptr) + if (radarProductView == nullptr || + radarProductView->GetRadarProductGroup() != + common::RadarProductGroup::Level2 || + p->selectedLevel2Product_ != product) { - currentElevation = p->context_->radarProductView_->elevation(); - } + p->RadarProductViewDisconnect(); - radarProductView = view::RadarProductViewFactory::Create( - product, currentElevation, p->radarProductManager_); + radarProductView = view::RadarProductViewFactory::Create( + product, p->radarProductManager_); + + p->RadarProductViewConnect(); + + radarProductViewCreated = true; + } radarProductView->SelectTime(p->selectedTime_); p->selectedLevel2Product_ = product; - connect( - radarProductView.get(), - &view::RadarProductView::ColorTableUpdated, - this, - [&]() { update(); }, - Qt::QueuedConnection); - connect( - radarProductView.get(), - &view::RadarProductView::SweepComputed, - this, - [&]() - { - std::shared_ptr radarSite = - p->radarProductManager_->radar_site(); - - RadarRangeLayer::Update( - p->map_, - radarProductView->range(), - {radarSite->latitude(), radarSite->longitude()}); - update(); - emit RadarSweepUpdated(); - }, - Qt::QueuedConnection); - - util::async( - [=]() - { - std::string colorTableFile = - manager::SettingsManager::palette_settings()->palette( - common::GetLevel2Palette(product)); - if (!colorTableFile.empty()) - { - std::shared_ptr colorTable = - common::ColorTable::Load(colorTableFile); - radarProductView->LoadColorTable(colorTable); - } - - radarProductView->Initialize(); - }); - - if (p->map_ != nullptr) + if (radarProductViewCreated) { - AddLayers(); + util::async( + [=]() + { + std::string colorTableFile = + manager::SettingsManager::palette_settings()->palette( + common::GetLevel2Palette(product)); + if (!colorTableFile.empty()) + { + std::shared_ptr colorTable = + common::ColorTable::Load(colorTableFile); + radarProductView->LoadColorTable(colorTable); + } + + radarProductView->Initialize(); + }); + + if (p->map_ != nullptr) + { + AddLayers(); + } + } + else + { + radarProductView->Update(); } - p->radarProductManager_->EnableLevel2Refresh(true); + if (p->autoRefreshEnabled_) + { + p->radarProductManager_->EnableLevel2Refresh(true); + } } void MapWidget::SelectRadarProduct( @@ -353,7 +347,7 @@ void MapWidget::SelectRadarProduct( manager::RadarProductManager::Instance(radarId); std::shared_ptr radarProductView = view::RadarProductViewFactory::Create( - group, product, productCode, 0.0f, radarProductManager); + group, product, productCode, radarProductManager); if (radarProductView == nullptr) { @@ -361,34 +355,14 @@ void MapWidget::SelectRadarProduct( return; } + p->RadarProductViewDisconnect(); + p->context_->radarProductView_ = radarProductView; p->SetRadarSite(radarId); p->selectedTime_ = time; radarProductView->SelectTime(p->selectedTime_); - connect( - radarProductView.get(), - &view::RadarProductView::ColorTableUpdated, - this, - [&]() { update(); }, - Qt::QueuedConnection); - connect( - radarProductView.get(), - &view::RadarProductView::SweepComputed, - this, - [=]() - { - std::shared_ptr radarSite = - p->radarProductManager_->radar_site(); - - RadarRangeLayer::Update( - p->map_, - radarProductView->range(), - {radarSite->latitude(), radarSite->longitude()}); - update(); - emit RadarSweepUpdated(); - }, - Qt::QueuedConnection); + p->RadarProductViewConnect(); util::async( [=]() @@ -448,6 +422,8 @@ void MapWidget::changeStyle() void MapWidget::AddLayers() { + logger_->debug("AddLayers()"); + // Clear custom layers for (const std::string& id : p->layerList_) { @@ -594,6 +570,8 @@ void MapWidget::wheelEvent(QWheelEvent* ev) void MapWidget::initializeGL() { + logger_->debug("initializeGL()"); + makeCurrent(); p->context_->gl_.initializeOpenGLFunctions(); @@ -653,29 +631,35 @@ void MapWidgetImpl::AutoRefreshConnect() this, [&](std::chrono::system_clock::time_point latestTime) { - // Create file request - std::shared_ptr request = - std::make_shared(); + if (autoRefreshEnabled_ && context_->radarProductView_ != nullptr && + context_->radarProductView_->GetRadarProductGroup() == + common::RadarProductGroup::Level2) + { + // Create file request + std::shared_ptr request = + std::make_shared(); - // File request callback - connect(request.get(), - &request::NexradFileRequest::RequestComplete, - this, - [&](std::shared_ptr request) - { - // Select loaded record - auto record = request->radar_product_record(); - - if (record != nullptr) + // File request callback + connect(request.get(), + &request::NexradFileRequest::RequestComplete, + this, + [&](std::shared_ptr request) { - widget_->SelectRadarProduct(record); - } - }); + // Select loaded record + auto record = request->radar_product_record(); - // Load file - util::async( - [=]() - { radarProductManager_->LoadLevel2Data(latestTime, request); }); + if (record != nullptr) + { + widget_->SelectRadarProduct(record); + } + }); + + // Load file + util::async( + [=]() { + radarProductManager_->LoadLevel2Data(latestTime, request); + }); + } }, Qt::QueuedConnection); } @@ -692,6 +676,51 @@ void MapWidgetImpl::AutoRefreshDisconnect() } } +void MapWidgetImpl::RadarProductViewConnect() +{ + if (context_->radarProductView_ != nullptr) + { + connect( + context_->radarProductView_.get(), + &view::RadarProductView::ColorTableUpdated, + this, + [&]() { widget_->update(); }, + Qt::QueuedConnection); + connect( + context_->radarProductView_.get(), + &view::RadarProductView::SweepComputed, + this, + [&]() + { + std::shared_ptr radarSite = + radarProductManager_->radar_site(); + + RadarRangeLayer::Update( + map_, + context_->radarProductView_->range(), + {radarSite->latitude(), radarSite->longitude()}); + widget_->update(); + emit widget_->RadarSweepUpdated(); + }, + Qt::QueuedConnection); + } +} + +void MapWidgetImpl::RadarProductViewDisconnect() +{ + if (context_->radarProductView_ != nullptr) + { + disconnect(context_->radarProductView_.get(), + &view::RadarProductView::ColorTableUpdated, + this, + nullptr); + disconnect(context_->radarProductView_.get(), + &view::RadarProductView::SweepComputed, + this, + nullptr); + } +} + void MapWidgetImpl::SetRadarSite(const std::string& radarSite) { // Check if radar site has changed diff --git a/scwx-qt/source/scwx/qt/view/level2_product_view.cpp b/scwx-qt/source/scwx/qt/view/level2_product_view.cpp index 8f49eaac..d8c63a0b 100644 --- a/scwx-qt/source/scwx/qt/view/level2_product_view.cpp +++ b/scwx-qt/source/scwx/qt/view/level2_product_view.cpp @@ -43,11 +43,10 @@ class Level2ProductViewImpl public: explicit Level2ProductViewImpl( common::Level2Product product, - float elevation, std::shared_ptr radarProductManager) : product_ {product}, radarProductManager_ {radarProductManager}, - selectedElevation_ {elevation}, + selectedElevation_ {0.0f}, selectedTime_ {}, elevationScan_ {nullptr}, momentDataBlock0_ {nullptr}, @@ -117,10 +116,8 @@ public: Level2ProductView::Level2ProductView( common::Level2Product product, - float elevation, std::shared_ptr radarProductManager) : - p(std::make_unique( - product, elevation, radarProductManager)) + p(std::make_unique(product, radarProductManager)) { } Level2ProductView::~Level2ProductView() = default; @@ -642,11 +639,9 @@ void Level2ProductView::ComputeSweep() std::shared_ptr Level2ProductView::Create( common::Level2Product product, - float elevation, std::shared_ptr radarProductManager) { - return std::make_shared( - product, elevation, radarProductManager); + return std::make_shared(product, radarProductManager); } } // namespace view diff --git a/scwx-qt/source/scwx/qt/view/level2_product_view.hpp b/scwx-qt/source/scwx/qt/view/level2_product_view.hpp index 50de666e..25ecddf9 100644 --- a/scwx-qt/source/scwx/qt/view/level2_product_view.hpp +++ b/scwx-qt/source/scwx/qt/view/level2_product_view.hpp @@ -25,7 +25,6 @@ class Level2ProductView : public RadarProductView public: explicit Level2ProductView( common::Level2Product product, - float elevation, std::shared_ptr radarProductManager); ~Level2ProductView(); @@ -51,7 +50,6 @@ public: static std::shared_ptr Create(common::Level2Product product, - float elevation, std::shared_ptr radarProductManager); protected: diff --git a/scwx-qt/source/scwx/qt/view/radar_product_view_factory.cpp b/scwx-qt/source/scwx/qt/view/radar_product_view_factory.cpp index 0ee67825..d21536fd 100644 --- a/scwx-qt/source/scwx/qt/view/radar_product_view_factory.cpp +++ b/scwx-qt/source/scwx/qt/view/radar_product_view_factory.cpp @@ -35,7 +35,6 @@ std::shared_ptr RadarProductViewFactory::Create( common::RadarProductGroup productGroup, const std::string& productName, int16_t productCode, - float elevation, std::shared_ptr radarProductManager) { std::shared_ptr view = nullptr; @@ -50,7 +49,7 @@ std::shared_ptr RadarProductViewFactory::Create( } else { - view = Create(product, elevation, radarProductManager); + view = Create(product, radarProductManager); } } else if (productGroup == common::RadarProductGroup::Level3) @@ -75,10 +74,9 @@ std::shared_ptr RadarProductViewFactory::Create( std::shared_ptr RadarProductViewFactory::Create( common::Level2Product product, - float elevation, std::shared_ptr radarProductManager) { - return Level2ProductView::Create(product, elevation, radarProductManager); + return Level2ProductView::Create(product, radarProductManager); } } // namespace view diff --git a/scwx-qt/source/scwx/qt/view/radar_product_view_factory.hpp b/scwx-qt/source/scwx/qt/view/radar_product_view_factory.hpp index 87fdf74f..8f53f471 100644 --- a/scwx-qt/source/scwx/qt/view/radar_product_view_factory.hpp +++ b/scwx-qt/source/scwx/qt/view/radar_product_view_factory.hpp @@ -31,11 +31,9 @@ public: Create(common::RadarProductGroup productGroup, const std::string& productName, int16_t productCode, - float elevation, std::shared_ptr radarProductManager); static std::shared_ptr Create(common::Level2Product product, - float elevation, std::shared_ptr radarProductManager); };