From 316da55000a7f1f2dd98d34ebfdaadbbd0381f41 Mon Sep 17 00:00:00 2001 From: AdenKoperczak Date: Sat, 12 Apr 2025 11:04:15 -0400 Subject: [PATCH 01/11] Modify how level 3 tilts are selected to keep them more consistent --- scwx-qt/source/scwx/qt/map/map_widget.cpp | 107 ++++++++++++++++------ 1 file changed, 80 insertions(+), 27 deletions(-) diff --git a/scwx-qt/source/scwx/qt/map/map_widget.cpp b/scwx-qt/source/scwx/qt/map/map_widget.cpp index ed288a40..9c768509 100644 --- a/scwx-qt/source/scwx/qt/map/map_widget.cpp +++ b/scwx-qt/source/scwx/qt/map/map_widget.cpp @@ -98,7 +98,8 @@ public: prevLongitude_ {0.0}, prevZoom_ {0.0}, prevBearing_ {0.0}, - prevPitch_ {0.0} + prevPitch_ {0.0}, + tiltsToIndices_ {} { // Create views auto overlayProductView = std::make_shared(); @@ -273,6 +274,9 @@ public: bool productAvailabilityUpdated_ {false}; bool productAvailabilityProductSelected_ {false}; + std::unordered_map tiltsToIndices_; + size_t currentTiltIndex_ {0}; + public slots: void Update(); }; @@ -829,6 +833,17 @@ void MapWidget::SelectRadarProduct(common::RadarProductGroup group, productCode = common::GetLevel3ProductCodeByAwipsId(productName); } + if (group == common::RadarProductGroup::Level3) + { + const auto& tiltIndex = p->tiltsToIndices_.find(productName); + p->currentTiltIndex_ = + tiltIndex != p->tiltsToIndices_.cend() ? tiltIndex->second : 0; + } + else + { + p->currentTiltIndex_ = 0; + } + if (radarProductView == nullptr || radarProductView->GetRadarProductGroup() != group || (radarProductView->GetRadarProductGroup() == @@ -933,11 +948,6 @@ void MapWidget::SelectRadarSite(std::shared_ptr radarSite, if (radarProductView != nullptr) { radarProductView->set_radar_product_manager(p->radarProductManager_); - SelectRadarProduct(radarProductView->GetRadarProductGroup(), - radarProductView->GetRadarProductName(), - 0, - radarProductView->selected_time(), - false); } p->AddLayers(); @@ -1756,6 +1766,24 @@ void MapWidgetImpl::RadarProductManagerConnect() this, [this]() { + const common::Level3ProductCategoryMap& categoryMap = + widget_->GetAvailableLevel3Categories(); + + tiltsToIndices_.clear(); + for (const auto& category : categoryMap) + { + for (const auto& product : category.second) + { + for (size_t tiltIndex = 0; + tiltIndex < product.second.size(); + tiltIndex++) + { + tiltsToIndices_.emplace(product.second[tiltIndex], + tiltIndex); + } + } + } + productAvailabilityUpdated_ = true; CheckLevel3Availability(); Q_EMIT widget_->Level3ProductsChanged(); @@ -2058,7 +2086,7 @@ void MapWidgetImpl::CheckLevel3Availability() * has been updated * * productAvailabilityProductSelected_ Only update once the radar site is - * fully selected, including the current product + * fully selected */ if (!(productAvailabilityCheckNeeded_ && productAvailabilityUpdated_ && productAvailabilityProductSelected_)) @@ -2073,6 +2101,9 @@ void MapWidgetImpl::CheckLevel3Availability() return; } + // Get radar product view for fallback selection + auto radarProductView = context_->radar_product_view(); + const common::Level3ProductCategoryMap& categoryMap = widget_->GetAvailableLevel3Categories(); @@ -2083,6 +2114,12 @@ void MapWidgetImpl::CheckLevel3Availability() common::GetLevel3CategoryByProduct(productName); if (productCategory == common::Level3ProductCategory::Unknown) { + // Default to the same as already selected + widget_->SelectRadarProduct(radarProductView->GetRadarProductGroup(), + radarProductView->GetRadarProductName(), + 0, + radarProductView->selected_time(), + false); return; } @@ -2090,38 +2127,54 @@ void MapWidgetImpl::CheckLevel3Availability() // Has no products in this category, do not change categories if (availableProductsIt == categoryMap.cend()) { + // Default to the same as already selected + widget_->SelectRadarProduct(radarProductView->GetRadarProductGroup(), + radarProductView->GetRadarProductName(), + 0, + radarProductView->selected_time(), + false); return; } const auto& availableProducts = availableProductsIt->second; const auto& availableTiltsIt = availableProducts.find(productName); - // Does not have the same product, but has others in the same category. - // Switch to the default product and tilt in this category. - if (availableTiltsIt == availableProducts.cend()) - { - widget_->SelectRadarProduct( - common::RadarProductGroup::Level3, - common::GetLevel3CategoryDefaultProduct(productCategory, categoryMap), - 0, - widget_->GetSelectedTime()); - return; - } - const auto& availableTilts = availableTiltsIt->second; - const auto& tilt = std::ranges::find_if( - availableTilts, - [productTilt](const std::string& tilt) { return productTilt == tilt; }); - // Tilt is not available, set it to first tilt - if (tilt == availableTilts.cend() && availableTilts.size() > 0) + const auto& availableTilts = + availableTiltsIt == availableProducts.cend() ? + // Does not have the same product, but has others in the same category. + // Switch to the default product and tilt in this category. + availableProducts.at(common::GetLevel3ProductByAwipsId( + common::GetLevel3CategoryDefaultProduct(productCategory, + categoryMap))) : + // Has the same product + availableTiltsIt->second; + + // Try to match the tilt to the last tilt. + if (currentTiltIndex_ < availableTilts.size()) { widget_->SelectRadarProduct(common::RadarProductGroup::Level3, - availableTilts[0], + availableTilts[currentTiltIndex_], 0, widget_->GetSelectedTime()); - return; } + else if (availableTilts.size() > 0) + { + widget_->SelectRadarProduct(common::RadarProductGroup::Level3, + availableTilts[availableTilts.size() - 1], + 0, + widget_->GetSelectedTime()); - // Tilt is available, no change needed + } + else + { + // No tilts available in this case, default to the same as already + // selected + widget_->SelectRadarProduct(radarProductView->GetRadarProductGroup(), + radarProductView->GetRadarProductName(), + 0, + radarProductView->selected_time(), + false); + } } } // namespace map From 5968fd981cd80f96ec6e55a40c608ad018b4c7f1 Mon Sep 17 00:00:00 2001 From: AdenKoperczak Date: Sat, 12 Apr 2025 11:05:21 -0400 Subject: [PATCH 02/11] Fix parsing of negative elevations in product description block --- wxdata/source/scwx/wsr88d/rpg/product_description_block.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wxdata/source/scwx/wsr88d/rpg/product_description_block.cpp b/wxdata/source/scwx/wsr88d/rpg/product_description_block.cpp index 4cb525ae..8bd6f331 100644 --- a/wxdata/source/scwx/wsr88d/rpg/product_description_block.cpp +++ b/wxdata/source/scwx/wsr88d/rpg/product_description_block.cpp @@ -726,7 +726,7 @@ units::angle::degrees ProductDescriptionBlock::elevation() const if (p->elevationNumber_ > 0) { - elevation = p->parameters_[2] * 0.1; + elevation = static_cast(p->parameters_[2]) * 0.1; } return units::angle::degrees {elevation}; From be972cdb7e823c23b94579902761b4b225d962fb Mon Sep 17 00:00:00 2001 From: AdenKoperczak Date: Sat, 12 Apr 2025 11:10:42 -0400 Subject: [PATCH 03/11] Add elevation to product label. Mainly for level 3 products --- scwx-qt/source/scwx/qt/map/map_widget.cpp | 3 +-- scwx-qt/source/scwx/qt/map/overlay_layer.cpp | 12 ++++++++++-- scwx-qt/source/scwx/qt/view/level3_radial_view.cpp | 7 +++++++ scwx-qt/source/scwx/qt/view/level3_radial_view.hpp | 10 ++++++---- 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/scwx-qt/source/scwx/qt/map/map_widget.cpp b/scwx-qt/source/scwx/qt/map/map_widget.cpp index 9c768509..55813bb4 100644 --- a/scwx-qt/source/scwx/qt/map/map_widget.cpp +++ b/scwx-qt/source/scwx/qt/map/map_widget.cpp @@ -275,7 +275,7 @@ public: bool productAvailabilityProductSelected_ {false}; std::unordered_map tiltsToIndices_; - size_t currentTiltIndex_ {0}; + size_t currentTiltIndex_ {0}; public slots: void Update(); @@ -2163,7 +2163,6 @@ void MapWidgetImpl::CheckLevel3Availability() availableTilts[availableTilts.size() - 1], 0, widget_->GetSelectedTime()); - } else { diff --git a/scwx-qt/source/scwx/qt/map/overlay_layer.cpp b/scwx-qt/source/scwx/qt/map/overlay_layer.cpp index 36258e75..7c3c22a9 100644 --- a/scwx-qt/source/scwx/qt/map/overlay_layer.cpp +++ b/scwx-qt/source/scwx/qt/map/overlay_layer.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -426,15 +427,22 @@ void OverlayLayer::Render(const QMapLibre::CustomLayerRenderParameters& params) if (radarProductView != nullptr) { // Render product name - std::string productName = radarProductView->GetRadarProductName(); + const std::string productName = radarProductView->GetRadarProductName(); + const float elevation = radarProductView->elevation(); + if (productName.length() > 0 && !productName.starts_with('?')) { + const std::string elevationString = + (QString::number(elevation, 'f', 1) + common::Characters::DEGREE) + .toStdString(); + ImGui::SetNextWindowPos(ImVec2 {0.0f, 0.0f}); ImGui::Begin("Product Name", nullptr, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_AlwaysAutoResize); - ImGui::TextUnformatted(productName.c_str()); + ImGui::TextUnformatted( + fmt::format("{} ({})", productName, elevationString).c_str()); ImGui::End(); } } diff --git a/scwx-qt/source/scwx/qt/view/level3_radial_view.cpp b/scwx-qt/source/scwx/qt/view/level3_radial_view.cpp index 0b3f42fa..05409e68 100644 --- a/scwx-qt/source/scwx/qt/view/level3_radial_view.cpp +++ b/scwx-qt/source/scwx/qt/view/level3_radial_view.cpp @@ -67,6 +67,7 @@ public: float latitude_; float longitude_; + float elevation_; float range_; std::uint16_t vcp_; @@ -91,6 +92,11 @@ boost::asio::thread_pool& Level3RadialView::thread_pool() return p->threadPool_; } +float Level3RadialView::elevation() const +{ + return p->elevation_; +} + float Level3RadialView::range() const { return p->range_; @@ -306,6 +312,7 @@ void Level3RadialView::ComputeSweep() p->latitude_ = descriptionBlock->latitude_of_radar(); p->longitude_ = descriptionBlock->longitude_of_radar(); p->range_ = descriptionBlock->range(); + p->elevation_ = static_cast(descriptionBlock->elevation().value()); p->sweepTime_ = scwx::util::TimePoint(descriptionBlock->volume_scan_date(), descriptionBlock->volume_scan_start_time() * 1000); diff --git a/scwx-qt/source/scwx/qt/view/level3_radial_view.hpp b/scwx-qt/source/scwx/qt/view/level3_radial_view.hpp index f99f4e63..9f6c0a3d 100644 --- a/scwx-qt/source/scwx/qt/view/level3_radial_view.hpp +++ b/scwx-qt/source/scwx/qt/view/level3_radial_view.hpp @@ -23,10 +23,12 @@ public: std::shared_ptr radarProductManager); ~Level3RadialView(); - float range() const override; - std::chrono::system_clock::time_point sweep_time() const override; - std::uint16_t vcp() const override; - const std::vector& vertices() const override; + [[nodiscard]] float elevation() const override; + [[nodiscard]] float range() const override; + [[nodiscard]] std::chrono::system_clock::time_point + sweep_time() const override; + [[nodiscard]] std::uint16_t vcp() const override; + [[nodiscard]] const std::vector& vertices() const override; std::tuple GetMomentData() const override; From 443f5a36158f2f81bcd5b9e5873a28262f2dad1f Mon Sep 17 00:00:00 2001 From: AdenKoperczak Date: Sat, 12 Apr 2025 11:15:45 -0400 Subject: [PATCH 04/11] clang tidy fixes for modify_tilt_selection --- wxdata/source/scwx/wsr88d/rpg/product_description_block.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/wxdata/source/scwx/wsr88d/rpg/product_description_block.cpp b/wxdata/source/scwx/wsr88d/rpg/product_description_block.cpp index 8bd6f331..1fc80d04 100644 --- a/wxdata/source/scwx/wsr88d/rpg/product_description_block.cpp +++ b/wxdata/source/scwx/wsr88d/rpg/product_description_block.cpp @@ -726,6 +726,8 @@ units::angle::degrees ProductDescriptionBlock::elevation() const if (p->elevationNumber_ > 0) { + // Elevation is given in tenths of a degree + // NOLINTNEXTLINE(cppcoreguidelines-avoid-magic-numbers) elevation = static_cast(p->parameters_[2]) * 0.1; } From ac3c986568125d00e177b486f36b77b3e0dd3714 Mon Sep 17 00:00:00 2001 From: AdenKoperczak Date: Sat, 12 Apr 2025 13:03:02 -0400 Subject: [PATCH 05/11] Add button for setting default radar products --- scwx-qt/source/scwx/qt/main/main_window.cpp | 25 ++++ scwx-qt/source/scwx/qt/main/main_window.ui | 109 ++++++++++-------- .../source/scwx/qt/settings/map_settings.cpp | 4 +- 3 files changed, 86 insertions(+), 52 deletions(-) diff --git a/scwx-qt/source/scwx/qt/main/main_window.cpp b/scwx-qt/source/scwx/qt/main/main_window.cpp index 5b25a91a..814ed0fb 100644 --- a/scwx-qt/source/scwx/qt/main/main_window.cpp +++ b/scwx-qt/source/scwx/qt/main/main_window.cpp @@ -267,6 +267,7 @@ MainWindow::MainWindow(QWidget* parent) : ui->vcpLabel->setVisible(false); ui->vcpValueLabel->setVisible(false); ui->vcpDescriptionLabel->setVisible(false); + ui->saveRadarProductsButton->setVisible(true); p->radarSitePresetsMenu_ = new QMenu(this); ui->radarSitePresetsButton->setMenu(p->radarSitePresetsMenu_); @@ -326,6 +327,8 @@ MainWindow::MainWindow(QWidget* parent) : ui->smoothRadarDataCheckBox); p->mapSettingsGroup_->GetContentsLayout()->addWidget( ui->trackLocationCheckBox); + p->mapSettingsGroup_->GetContentsLayout()->addWidget( + ui->saveRadarProductsButton); ui->radarToolboxScrollAreaContents->layout()->replaceWidget( ui->mapSettingsGroupBox, p->mapSettingsGroup_); ui->mapSettingsGroupBox->setVisible(false); @@ -1124,6 +1127,22 @@ void MainWindowImpl::ConnectOtherSignals() // Turn on location tracking positionManager_->TrackLocation(trackingEnabled); }); + connect(mainWindow_->ui->saveRadarProductsButton, + &QAbstractButton::clicked, + mainWindow_, + [this]() + { + auto& mapSettings = settings::MapSettings::Instance(); + for (std::size_t i = 0; i < maps_.size(); i++) + { + const auto& map = maps_.at(i); + mapSettings.radar_product_group(i).StageValue( + common::GetRadarProductGroupName( + map->GetRadarProductGroup())); + mapSettings.radar_product(i).StageValue( + map->GetRadarProductName()); + } + }); connect(level2ProductsWidget_, &ui::Level2ProductsWidget::RadarProductSelected, mainWindow_, @@ -1509,6 +1528,8 @@ void MainWindowImpl::UpdateRadarProductSettings() void MainWindowImpl::UpdateRadarSite() { std::shared_ptr radarSite = activeMap_->GetRadarSite(); + const std::string homeRadarSite = + settings::GeneralSettings::Instance().default_radar_site().GetValue(); if (radarSite != nullptr) { @@ -1523,6 +1544,9 @@ void MainWindowImpl::UpdateRadarSite() radarSite->location_name().c_str()); timelineManager_->SetRadarSite(radarSite->id()); + + mainWindow_->ui->saveRadarProductsButton->setVisible( + radarSite->id() == homeRadarSite); } else { @@ -1530,6 +1554,7 @@ void MainWindowImpl::UpdateRadarSite() mainWindow_->ui->radarSiteValueLabel->setVisible(false); mainWindow_->ui->radarLocationLabel->setVisible(false); + mainWindow_->ui->saveRadarProductsButton->setVisible(false); timelineManager_->SetRadarSite("?"); } diff --git a/scwx-qt/source/scwx/qt/main/main_window.ui b/scwx-qt/source/scwx/qt/main/main_window.ui index 5d856663..94346c68 100644 --- a/scwx-qt/source/scwx/qt/main/main_window.ui +++ b/scwx-qt/source/scwx/qt/main/main_window.ui @@ -155,8 +155,8 @@ 0 0 - 190 - 680 + 205 + 701 @@ -181,32 +181,24 @@ QFrame::Shadow::Raised - - - - - 0 - 0 - - + + - KLSX + 35 - - - - - 0 - 0 - - - - Volume Coverage Pattern - + + - VCP + Clear Air Mode + + + + + + + St. Louis, MO @@ -271,34 +263,6 @@ - - - - Radar Site - - - - - - - St. Louis, MO - - - - - - - 35 - - - - - - - Clear Air Mode - - - @@ -312,6 +276,42 @@ + + + + + 0 + 0 + + + + Volume Coverage Pattern + + + VCP + + + + + + + Radar Site + + + + + + + + 0 + 0 + + + + KLSX + + + @@ -345,6 +345,13 @@ + + + + Set As Default Products + + + diff --git a/scwx-qt/source/scwx/qt/settings/map_settings.cpp b/scwx-qt/source/scwx/qt/settings/map_settings.cpp index 416c0a6d..76c09d30 100644 --- a/scwx-qt/source/scwx/qt/settings/map_settings.cpp +++ b/scwx-qt/source/scwx/qt/settings/map_settings.cpp @@ -76,7 +76,7 @@ public: { common::RadarProductGroup radarProductGroup = common::GetRadarProductGroup( - map_.at(i).radarProductGroup_.GetValue()); + map_.at(i).radarProductGroup_.GetStagedOrValue()); if (radarProductGroup == common::RadarProductGroup::Level2) { @@ -193,6 +193,8 @@ bool MapSettings::Shutdown() dataChanged |= mapRecordSettings.mapStyle_.Commit(); dataChanged |= mapRecordSettings.smoothingEnabled_.Commit(); + dataChanged |= mapRecordSettings.radarProductGroup_.Commit(); + dataChanged |= mapRecordSettings.radarProduct_.Commit(); } return dataChanged; From 484c08c4557fde5dfdea205c77e8b81f26d75d18 Mon Sep 17 00:00:00 2001 From: AdenKoperczak Date: Sat, 12 Apr 2025 13:07:23 -0400 Subject: [PATCH 06/11] clang format fixes for modify_tilt_selection --- scwx-qt/source/scwx/qt/main/main_window.cpp | 35 ++++++++++----------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/scwx-qt/source/scwx/qt/main/main_window.cpp b/scwx-qt/source/scwx/qt/main/main_window.cpp index 814ed0fb..e951de71 100644 --- a/scwx-qt/source/scwx/qt/main/main_window.cpp +++ b/scwx-qt/source/scwx/qt/main/main_window.cpp @@ -1127,22 +1127,21 @@ void MainWindowImpl::ConnectOtherSignals() // Turn on location tracking positionManager_->TrackLocation(trackingEnabled); }); - connect(mainWindow_->ui->saveRadarProductsButton, - &QAbstractButton::clicked, - mainWindow_, - [this]() - { - auto& mapSettings = settings::MapSettings::Instance(); - for (std::size_t i = 0; i < maps_.size(); i++) - { - const auto& map = maps_.at(i); - mapSettings.radar_product_group(i).StageValue( - common::GetRadarProductGroupName( - map->GetRadarProductGroup())); - mapSettings.radar_product(i).StageValue( - map->GetRadarProductName()); - } - }); + connect( + mainWindow_->ui->saveRadarProductsButton, + &QAbstractButton::clicked, + mainWindow_, + [this]() + { + auto& mapSettings = settings::MapSettings::Instance(); + for (std::size_t i = 0; i < maps_.size(); i++) + { + const auto& map = maps_.at(i); + mapSettings.radar_product_group(i).StageValue( + common::GetRadarProductGroupName(map->GetRadarProductGroup())); + mapSettings.radar_product(i).StageValue(map->GetRadarProductName()); + } + }); connect(level2ProductsWidget_, &ui::Level2ProductsWidget::RadarProductSelected, mainWindow_, @@ -1545,8 +1544,8 @@ void MainWindowImpl::UpdateRadarSite() timelineManager_->SetRadarSite(radarSite->id()); - mainWindow_->ui->saveRadarProductsButton->setVisible( - radarSite->id() == homeRadarSite); + mainWindow_->ui->saveRadarProductsButton->setVisible(radarSite->id() == + homeRadarSite); } else { From 24f5f0a3e34612f7e53648759c055f5939dbf2a6 Mon Sep 17 00:00:00 2001 From: AdenKoperczak Date: Sun, 13 Apr 2025 10:59:41 -0400 Subject: [PATCH 07/11] Do not display an elevation number when there is non --- scwx-qt/source/scwx/qt/map/map_widget.cpp | 4 +- scwx-qt/source/scwx/qt/map/map_widget.hpp | 3 +- scwx-qt/source/scwx/qt/map/overlay_layer.cpp | 23 +++-- .../scwx/qt/ui/level2_settings_widget.cpp | 4 +- .../scwx/qt/view/level2_product_view.cpp | 2 +- .../scwx/qt/view/level2_product_view.hpp | 63 ++++++------ .../scwx/qt/view/level3_radial_view.cpp | 9 +- .../scwx/qt/view/level3_radial_view.hpp | 25 +++-- .../scwx/qt/view/radar_product_view.cpp | 4 +- .../scwx/qt/view/radar_product_view.hpp | 69 ++++++------- .../wsr88d/rpg/product_description_block.hpp | 98 +++++++++---------- .../wsr88d/rpg/product_description_block.cpp | 7 +- 12 files changed, 166 insertions(+), 145 deletions(-) diff --git a/scwx-qt/source/scwx/qt/map/map_widget.cpp b/scwx-qt/source/scwx/qt/map/map_widget.cpp index 55813bb4..60c50a98 100644 --- a/scwx-qt/source/scwx/qt/map/map_widget.cpp +++ b/scwx-qt/source/scwx/qt/map/map_widget.cpp @@ -615,7 +615,7 @@ common::Level3ProductCategoryMap MapWidget::GetAvailableLevel3Categories() } } -float MapWidget::GetElevation() const +std::optional MapWidget::GetElevation() const { auto radarProductView = p->context_->radar_product_view(); @@ -625,7 +625,7 @@ float MapWidget::GetElevation() const } else { - return 0.0f; + return {}; } } diff --git a/scwx-qt/source/scwx/qt/map/map_widget.hpp b/scwx-qt/source/scwx/qt/map/map_widget.hpp index 23d38680..6764629e 100644 --- a/scwx-qt/source/scwx/qt/map/map_widget.hpp +++ b/scwx-qt/source/scwx/qt/map/map_widget.hpp @@ -9,6 +9,7 @@ #include #include +#include #include @@ -41,7 +42,7 @@ public: [[nodiscard]] common::Level3ProductCategoryMap GetAvailableLevel3Categories(); - [[nodiscard]] float GetElevation() const; + [[nodiscard]] std::optional GetElevation() const; [[nodiscard]] std::vector GetElevationCuts() const; [[nodiscard]] std::vector GetLevel3Products(); [[nodiscard]] std::string GetMapStyle() const; diff --git a/scwx-qt/source/scwx/qt/map/overlay_layer.cpp b/scwx-qt/source/scwx/qt/map/overlay_layer.cpp index 7c3c22a9..ba692aae 100644 --- a/scwx-qt/source/scwx/qt/map/overlay_layer.cpp +++ b/scwx-qt/source/scwx/qt/map/overlay_layer.cpp @@ -428,21 +428,30 @@ void OverlayLayer::Render(const QMapLibre::CustomLayerRenderParameters& params) { // Render product name const std::string productName = radarProductView->GetRadarProductName(); - const float elevation = radarProductView->elevation(); + const std::optional elevation = radarProductView->elevation(); if (productName.length() > 0 && !productName.starts_with('?')) { - const std::string elevationString = - (QString::number(elevation, 'f', 1) + common::Characters::DEGREE) - .toStdString(); - ImGui::SetNextWindowPos(ImVec2 {0.0f, 0.0f}); ImGui::Begin("Product Name", nullptr, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_AlwaysAutoResize); - ImGui::TextUnformatted( - fmt::format("{} ({})", productName, elevationString).c_str()); + + if (elevation.has_value()) + { + const std::string elevationString = + (QString::number(*elevation, 'f', 1) + + common::Characters::DEGREE) + .toStdString(); + ImGui::TextUnformatted( + fmt::format("{} ({})", productName, elevationString).c_str()); + } + else + { + ImGui::TextUnformatted(productName.c_str()); + } + ImGui::End(); } } diff --git a/scwx-qt/source/scwx/qt/ui/level2_settings_widget.cpp b/scwx-qt/source/scwx/qt/ui/level2_settings_widget.cpp index 85b476c9..0289ee54 100644 --- a/scwx-qt/source/scwx/qt/ui/level2_settings_widget.cpp +++ b/scwx-qt/source/scwx/qt/ui/level2_settings_widget.cpp @@ -242,7 +242,9 @@ void Level2SettingsWidget::UpdateElevationSelection(float elevation) void Level2SettingsWidget::UpdateSettings(map::MapWidget* activeMap) { - float currentElevation = activeMap->GetElevation(); + std::optional currentElevationOption = activeMap->GetElevation(); + float currentElevation = + currentElevationOption.has_value() ? *currentElevationOption : 0.0f; std::vector elevationCuts = activeMap->GetElevationCuts(); if (p->elevationCuts_ != elevationCuts) 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 4e7181e7..6fcc775c 100644 --- a/scwx-qt/source/scwx/qt/view/level2_product_view.cpp +++ b/scwx-qt/source/scwx/qt/view/level2_product_view.cpp @@ -271,7 +271,7 @@ uint16_t Level2ProductView::color_table_max() const } } -float Level2ProductView::elevation() const +std::optional Level2ProductView::elevation() const { return p->elevationCut_; } 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 db8fc45c..64651bfa 100644 --- a/scwx-qt/source/scwx/qt/view/level2_product_view.hpp +++ b/scwx-qt/source/scwx/qt/view/level2_product_view.hpp @@ -8,11 +8,7 @@ #include #include -namespace scwx -{ -namespace qt -{ -namespace view +namespace scwx::qt::view { class Level2ProductView : public RadarProductView @@ -23,38 +19,47 @@ public: explicit Level2ProductView( common::Level2Product product, std::shared_ptr radarProductManager); - ~Level2ProductView(); + ~Level2ProductView() override; - std::shared_ptr color_table() const override; - const std::vector& - color_table_lut() const override; - std::uint16_t color_table_min() const override; - std::uint16_t color_table_max() const override; - float elevation() const override; - float range() const override; - std::chrono::system_clock::time_point sweep_time() const override; - float unit_scale() const override; - std::string units() const override; - std::uint16_t vcp() const override; - const std::vector& vertices() const override; + Level2ProductView(const Level2ProductView&) = delete; + Level2ProductView(Level2ProductView&&) = delete; + Level2ProductView& operator=(const Level2ProductView&) = delete; + Level2ProductView& operator=(Level2ProductView&&) = delete; + + [[nodiscard]] std::shared_ptr + color_table() const override; + [[nodiscard]] const std::vector& + color_table_lut() const override; + [[nodiscard]] std::uint16_t color_table_min() const override; + [[nodiscard]] std::uint16_t color_table_max() const override; + [[nodiscard]] std::optional elevation() const override; + [[nodiscard]] float range() const override; + [[nodiscard]] std::chrono::system_clock::time_point + sweep_time() const override; + [[nodiscard]] float unit_scale() const override; + [[nodiscard]] std::string units() const override; + [[nodiscard]] std::uint16_t vcp() const override; + [[nodiscard]] const std::vector& vertices() const override; void LoadColorTable(std::shared_ptr colorTable) override; void SelectElevation(float elevation) override; void SelectProduct(const std::string& productName) override; - common::RadarProductGroup GetRadarProductGroup() const override; - std::string GetRadarProductName() const override; - std::vector GetElevationCuts() const override; - std::tuple + [[nodiscard]] common::RadarProductGroup + GetRadarProductGroup() const override; + [[nodiscard]] std::string GetRadarProductName() const override; + [[nodiscard]] std::vector GetElevationCuts() const override; + [[nodiscard]] std::tuple GetMomentData() const override; - std::tuple + [[nodiscard]] std::tuple GetCfpMomentData() const override; - std::optional + [[nodiscard]] std::optional GetBinLevel(const common::Coordinate& coordinate) const override; - std::optional - GetDataLevelCode(std::uint16_t level) const override; - std::optional GetDataValue(std::uint16_t level) const override; + [[nodiscard]] std::optional + GetDataLevelCode(std::uint16_t level) const override; + [[nodiscard]] std::optional + GetDataValue(std::uint16_t level) const override; static std::shared_ptr Create(common::Level2Product product, @@ -75,6 +80,4 @@ private: std::unique_ptr p; }; -} // namespace view -} // namespace qt -} // namespace scwx +} // namespace scwx::qt::view diff --git a/scwx-qt/source/scwx/qt/view/level3_radial_view.cpp b/scwx-qt/source/scwx/qt/view/level3_radial_view.cpp index 05409e68..c01e0cd4 100644 --- a/scwx-qt/source/scwx/qt/view/level3_radial_view.cpp +++ b/scwx-qt/source/scwx/qt/view/level3_radial_view.cpp @@ -67,7 +67,7 @@ public: float latitude_; float longitude_; - float elevation_; + std::optional elevation_ {}; float range_; std::uint16_t vcp_; @@ -92,7 +92,7 @@ boost::asio::thread_pool& Level3RadialView::thread_pool() return p->threadPool_; } -float Level3RadialView::elevation() const +std::optional Level3RadialView::elevation() const { return p->elevation_; } @@ -312,7 +312,10 @@ void Level3RadialView::ComputeSweep() p->latitude_ = descriptionBlock->latitude_of_radar(); p->longitude_ = descriptionBlock->longitude_of_radar(); p->range_ = descriptionBlock->range(); - p->elevation_ = static_cast(descriptionBlock->elevation().value()); + p->elevation_ = + descriptionBlock->has_elevation() ? + static_cast(descriptionBlock->elevation().value()) : + std::optional {}; p->sweepTime_ = scwx::util::TimePoint(descriptionBlock->volume_scan_date(), descriptionBlock->volume_scan_start_time() * 1000); diff --git a/scwx-qt/source/scwx/qt/view/level3_radial_view.hpp b/scwx-qt/source/scwx/qt/view/level3_radial_view.hpp index 9f6c0a3d..86d550e6 100644 --- a/scwx-qt/source/scwx/qt/view/level3_radial_view.hpp +++ b/scwx-qt/source/scwx/qt/view/level3_radial_view.hpp @@ -6,11 +6,7 @@ #include #include -namespace scwx -{ -namespace qt -{ -namespace view +namespace scwx::qt::view { class Level3RadialView : public Level3ProductView @@ -21,19 +17,24 @@ public: explicit Level3RadialView( const std::string& product, std::shared_ptr radarProductManager); - ~Level3RadialView(); + ~Level3RadialView() override; - [[nodiscard]] float elevation() const override; - [[nodiscard]] float range() const override; + Level3RadialView(const Level3RadialView&) = delete; + Level3RadialView(Level3RadialView&&) = delete; + Level3RadialView& operator=(const Level3RadialView&) = delete; + Level3RadialView& operator=(Level3RadialView&&) = delete; + + [[nodiscard]] std::optional elevation() const override; + [[nodiscard]] float range() const override; [[nodiscard]] std::chrono::system_clock::time_point sweep_time() const override; [[nodiscard]] std::uint16_t vcp() const override; [[nodiscard]] const std::vector& vertices() const override; - std::tuple + [[nodiscard]] std::tuple GetMomentData() const override; - std::optional + [[nodiscard]] std::optional GetBinLevel(const common::Coordinate& coordinate) const override; static std::shared_ptr @@ -51,6 +52,4 @@ private: std::unique_ptr p; }; -} // namespace view -} // namespace qt -} // namespace scwx +} // namespace scwx::qt::view diff --git a/scwx-qt/source/scwx/qt/view/radar_product_view.cpp b/scwx-qt/source/scwx/qt/view/radar_product_view.cpp index 9c5a84de..dc50383c 100644 --- a/scwx-qt/source/scwx/qt/view/radar_product_view.cpp +++ b/scwx-qt/source/scwx/qt/view/radar_product_view.cpp @@ -85,9 +85,9 @@ std::uint16_t RadarProductView::color_table_max() const return kDefaultColorTableMax_; } -float RadarProductView::elevation() const +std::optional RadarProductView::elevation() const { - return 0.0f; + return {}; } std::shared_ptr diff --git a/scwx-qt/source/scwx/qt/view/radar_product_view.hpp b/scwx-qt/source/scwx/qt/view/radar_product_view.hpp index 31d47840..2801b74e 100644 --- a/scwx-qt/source/scwx/qt/view/radar_product_view.hpp +++ b/scwx-qt/source/scwx/qt/view/radar_product_view.hpp @@ -16,11 +16,7 @@ #include #include -namespace scwx -{ -namespace qt -{ -namespace view +namespace scwx::qt::view { class RadarProductViewImpl; @@ -32,20 +28,27 @@ class RadarProductView : public QObject public: explicit RadarProductView( std::shared_ptr radarProductManager); - virtual ~RadarProductView(); + ~RadarProductView() override; - virtual std::shared_ptr color_table() const = 0; - virtual const std::vector& - color_table_lut() const; - virtual std::uint16_t color_table_min() const; - virtual std::uint16_t color_table_max() const; - virtual float elevation() const; - virtual float range() const; - virtual std::chrono::system_clock::time_point sweep_time() const; - virtual float unit_scale() const = 0; - virtual std::string units() const = 0; - virtual std::uint16_t vcp() const = 0; - virtual const std::vector& vertices() const = 0; + RadarProductView(const RadarProductView&) = delete; + RadarProductView(RadarProductView&&) = delete; + RadarProductView& operator=(const RadarProductView&) = delete; + RadarProductView& operator=(RadarProductView&&) = delete; + + [[nodiscard]] virtual std::shared_ptr + color_table() const = 0; + [[nodiscard]] virtual const std::vector& + color_table_lut() const; + [[nodiscard]] virtual std::uint16_t color_table_min() const; + [[nodiscard]] virtual std::uint16_t color_table_max() const; + [[nodiscard]] virtual std::optional elevation() const; + [[nodiscard]] virtual float range() const; + [[nodiscard]] virtual std::chrono::system_clock::time_point + sweep_time() const; + [[nodiscard]] virtual float unit_scale() const = 0; + [[nodiscard]] virtual std::string units() const = 0; + [[nodiscard]] virtual std::uint16_t vcp() const = 0; + [[nodiscard]] virtual const std::vector& vertices() const = 0; [[nodiscard]] std::shared_ptr radar_product_manager() const; @@ -66,24 +69,26 @@ public: void SelectTime(std::chrono::system_clock::time_point time); void Update(); - bool IsInitialized() const; + [[nodiscard]] bool IsInitialized() const; - virtual common::RadarProductGroup GetRadarProductGroup() const = 0; - virtual std::string GetRadarProductName() const = 0; - virtual std::vector GetElevationCuts() const; - virtual std::tuple + [[nodiscard]] virtual common::RadarProductGroup + GetRadarProductGroup() const = 0; + [[nodiscard]] virtual std::string GetRadarProductName() const = 0; + [[nodiscard]] virtual std::vector GetElevationCuts() const; + [[nodiscard]] virtual std::tuple GetMomentData() const = 0; - virtual std::tuple + [[nodiscard]] virtual std::tuple GetCfpMomentData() const; - virtual std::optional + [[nodiscard]] virtual std::optional GetBinLevel(const common::Coordinate& coordinate) const = 0; - virtual std::optional - GetDataLevelCode(std::uint16_t level) const = 0; - virtual std::optional GetDataValue(std::uint16_t level) const = 0; - virtual bool IgnoreUnits() const; + [[nodiscard]] virtual std::optional + GetDataLevelCode(std::uint16_t level) const = 0; + [[nodiscard]] virtual std::optional + GetDataValue(std::uint16_t level) const = 0; + [[nodiscard]] virtual bool IgnoreUnits() const; - virtual std::vector> + [[nodiscard]] virtual std::vector> GetDescriptionFields() const; protected: @@ -105,6 +110,4 @@ private: std::unique_ptr p; }; -} // namespace view -} // namespace qt -} // namespace scwx +} // namespace scwx::qt::view diff --git a/wxdata/include/scwx/wsr88d/rpg/product_description_block.hpp b/wxdata/include/scwx/wsr88d/rpg/product_description_block.hpp index 1182828a..30bdfdf2 100644 --- a/wxdata/include/scwx/wsr88d/rpg/product_description_block.hpp +++ b/wxdata/include/scwx/wsr88d/rpg/product_description_block.hpp @@ -9,11 +9,7 @@ #include -namespace scwx -{ -namespace wsr88d -{ -namespace rpg +namespace scwx::wsr88d::rpg { class ProductDescriptionBlockImpl; @@ -22,7 +18,7 @@ class ProductDescriptionBlock : public awips::Message { public: explicit ProductDescriptionBlock(); - ~ProductDescriptionBlock(); + ~ProductDescriptionBlock() override; ProductDescriptionBlock(const ProductDescriptionBlock&) = delete; ProductDescriptionBlock& operator=(const ProductDescriptionBlock&) = delete; @@ -30,57 +26,59 @@ public: ProductDescriptionBlock(ProductDescriptionBlock&&) noexcept; ProductDescriptionBlock& operator=(ProductDescriptionBlock&&) noexcept; - int16_t block_divider() const; - float latitude_of_radar() const; - float longitude_of_radar() const; - int16_t height_of_radar() const; - int16_t product_code() const; - uint16_t operational_mode() const; - uint16_t volume_coverage_pattern() const; - int16_t sequence_number() const; - uint16_t volume_scan_number() const; - uint16_t volume_scan_date() const; - uint32_t volume_scan_start_time() const; - uint16_t generation_date_of_product() const; - uint32_t generation_time_of_product() const; - uint16_t elevation_number() const; - uint16_t data_level_threshold(size_t i) const; - uint8_t version() const; - uint8_t spot_blank() const; - uint32_t offset_to_symbology() const; - uint32_t offset_to_graphic() const; - uint32_t offset_to_tabular() const; + [[nodiscard]] int16_t block_divider() const; + [[nodiscard]] float latitude_of_radar() const; + [[nodiscard]] float longitude_of_radar() const; + [[nodiscard]] int16_t height_of_radar() const; + [[nodiscard]] int16_t product_code() const; + [[nodiscard]] uint16_t operational_mode() const; + [[nodiscard]] uint16_t volume_coverage_pattern() const; + [[nodiscard]] int16_t sequence_number() const; + [[nodiscard]] uint16_t volume_scan_number() const; + [[nodiscard]] uint16_t volume_scan_date() const; + [[nodiscard]] uint32_t volume_scan_start_time() const; + [[nodiscard]] uint16_t generation_date_of_product() const; + [[nodiscard]] uint32_t generation_time_of_product() const; + [[nodiscard]] uint16_t elevation_number() const; + [[nodiscard]] uint16_t data_level_threshold(size_t i) const; + [[nodiscard]] uint8_t version() const; + [[nodiscard]] uint8_t spot_blank() const; + [[nodiscard]] uint32_t offset_to_symbology() const; + [[nodiscard]] uint32_t offset_to_graphic() const; + [[nodiscard]] uint32_t offset_to_tabular() const; - float range() const; - uint16_t range_raw() const; - float x_resolution() const; - uint16_t x_resolution_raw() const; - float y_resolution() const; - uint16_t y_resolution_raw() const; + [[nodiscard]] float range() const; + [[nodiscard]] uint16_t range_raw() const; + [[nodiscard]] float x_resolution() const; + [[nodiscard]] uint16_t x_resolution_raw() const; + [[nodiscard]] float y_resolution() const; + [[nodiscard]] uint16_t y_resolution_raw() const; - uint16_t threshold() const; - float offset() const; - float scale() const; - uint16_t number_of_levels() const; + [[nodiscard]] uint16_t threshold() const; + [[nodiscard]] float offset() const; + [[nodiscard]] float scale() const; + [[nodiscard]] uint16_t number_of_levels() const; - std::optional data_level_code(std::uint8_t level) const; - std::optional data_value(std::uint8_t level) const; + [[nodiscard]] std::optional + data_level_code(std::uint8_t level) const; + [[nodiscard]] std::optional data_value(std::uint8_t level) const; - std::uint16_t log_start() const; - float log_offset() const; - float log_scale() const; + [[nodiscard]] std::uint16_t log_start() const; + [[nodiscard]] float log_offset() const; + [[nodiscard]] float log_scale() const; - float gr_scale() const; + [[nodiscard]] float gr_scale() const; - std::uint8_t data_mask() const; - std::uint8_t topped_mask() const; + [[nodiscard]] std::uint8_t data_mask() const; + [[nodiscard]] std::uint8_t topped_mask() const; - units::angle::degrees elevation() const; + [[nodiscard]] units::angle::degrees elevation() const; + [[nodiscard]] bool has_elevation() const; - bool IsCompressionEnabled() const; - bool IsDataLevelCoded() const; + [[nodiscard]] bool IsCompressionEnabled() const; + [[nodiscard]] bool IsDataLevelCoded() const; - size_t data_size() const override; + [[nodiscard]] size_t data_size() const override; bool Parse(std::istream& is) override; @@ -90,6 +88,4 @@ private: std::unique_ptr p; }; -} // namespace rpg -} // namespace wsr88d -} // namespace scwx +} // namespace scwx::wsr88d::rpg diff --git a/wxdata/source/scwx/wsr88d/rpg/product_description_block.cpp b/wxdata/source/scwx/wsr88d/rpg/product_description_block.cpp index 1fc80d04..10fdbe72 100644 --- a/wxdata/source/scwx/wsr88d/rpg/product_description_block.cpp +++ b/wxdata/source/scwx/wsr88d/rpg/product_description_block.cpp @@ -724,7 +724,7 @@ units::angle::degrees ProductDescriptionBlock::elevation() const { double elevation = 0.0; - if (p->elevationNumber_ > 0) + if (has_elevation()) { // Elevation is given in tenths of a degree // NOLINTNEXTLINE(cppcoreguidelines-avoid-magic-numbers) @@ -734,6 +734,11 @@ units::angle::degrees ProductDescriptionBlock::elevation() const return units::angle::degrees {elevation}; } +bool ProductDescriptionBlock::has_elevation() const +{ + return p->elevationNumber_ > 0; +} + bool ProductDescriptionBlock::IsCompressionEnabled() const { bool isCompressed = false; From ceb1ca8416135db0e5a5340934562a0f962ffa71 Mon Sep 17 00:00:00 2001 From: AdenKoperczak Date: Sun, 13 Apr 2025 11:07:46 -0400 Subject: [PATCH 08/11] Fix level 2 selection on radar site change from modify_tilt_selection --- scwx-qt/source/scwx/qt/map/map_widget.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/scwx-qt/source/scwx/qt/map/map_widget.cpp b/scwx-qt/source/scwx/qt/map/map_widget.cpp index 60c50a98..e5362905 100644 --- a/scwx-qt/source/scwx/qt/map/map_widget.cpp +++ b/scwx-qt/source/scwx/qt/map/map_widget.cpp @@ -2095,15 +2095,20 @@ void MapWidgetImpl::CheckLevel3Availability() } productAvailabilityCheckNeeded_ = false; + // Get radar product view for fallback and level2 selection + auto radarProductView = context_->radar_product_view(); + // Only do this for level3 products if (widget_->GetRadarProductGroup() != common::RadarProductGroup::Level3) { + widget_->SelectRadarProduct(radarProductView->GetRadarProductGroup(), + radarProductView->GetRadarProductName(), + 0, + radarProductView->selected_time(), + false); return; } - // Get radar product view for fallback selection - auto radarProductView = context_->radar_product_view(); - const common::Level3ProductCategoryMap& categoryMap = widget_->GetAvailableLevel3Categories(); From ddd8977586ffe76aad50a2e3054696a2d01f89bc Mon Sep 17 00:00:00 2001 From: AdenKoperczak Date: Sun, 13 Apr 2025 11:15:20 -0400 Subject: [PATCH 09/11] Avoid nullptr dereference when selecting a tilt on radar site change --- scwx-qt/source/scwx/qt/map/map_widget.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scwx-qt/source/scwx/qt/map/map_widget.cpp b/scwx-qt/source/scwx/qt/map/map_widget.cpp index e5362905..abf5d484 100644 --- a/scwx-qt/source/scwx/qt/map/map_widget.cpp +++ b/scwx-qt/source/scwx/qt/map/map_widget.cpp @@ -2097,6 +2097,10 @@ void MapWidgetImpl::CheckLevel3Availability() // Get radar product view for fallback and level2 selection auto radarProductView = context_->radar_product_view(); + if (radarProductView == nullptr) + { + return; + } // Only do this for level3 products if (widget_->GetRadarProductGroup() != common::RadarProductGroup::Level3) From 81ec5f9f7a9163e496249af0f7fe611c7fac3bee Mon Sep 17 00:00:00 2001 From: AdenKoperczak Date: Sun, 13 Apr 2025 11:38:25 -0400 Subject: [PATCH 10/11] Update set default products button on default radar site change --- scwx-qt/source/scwx/qt/main/main_window.cpp | 27 +++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/scwx-qt/source/scwx/qt/main/main_window.cpp b/scwx-qt/source/scwx/qt/main/main_window.cpp index e951de71..a9c140be 100644 --- a/scwx-qt/source/scwx/qt/main/main_window.cpp +++ b/scwx-qt/source/scwx/qt/main/main_window.cpp @@ -139,6 +139,8 @@ public: } ~MainWindowImpl() { + homeRadarConnection_.disconnect(); + auto& generalSettings = settings::GeneralSettings::Instance(); auto& customStyleUrl = generalSettings.custom_style_url(); @@ -239,6 +241,8 @@ public: layerActions_ {}; bool layerActionsInitialized_ {false}; + boost::signals2::scoped_connection homeRadarConnection_ {}; + std::vector maps_; std::chrono::system_clock::time_point selectedTime_ {}; @@ -1273,6 +1277,29 @@ void MainWindowImpl::ConnectOtherSignals() timeLabel_->setVisible(true); }); clockTimer_.start(1000); + + auto& generalSettings = settings::GeneralSettings::Instance(); + homeRadarConnection_ = + generalSettings.default_radar_site().changed_signal().connect( + [this]() + { + std::shared_ptr radarSite = + activeMap_->GetRadarSite(); + const std::string homeRadarSite = + settings::GeneralSettings::Instance() + .default_radar_site() + .GetValue(); + if (radarSite == nullptr) + { + mainWindow_->ui->saveRadarProductsButton->setVisible( + false); + } + else + { + mainWindow_->ui->saveRadarProductsButton->setVisible( + radarSite->id() == homeRadarSite); + } + }); } void MainWindowImpl::InitializeLayerDisplayActions() From 17b2db64effa68f69113b02a747c8aed1d5481eb Mon Sep 17 00:00:00 2001 From: AdenKoperczak Date: Sun, 13 Apr 2025 11:47:28 -0400 Subject: [PATCH 11/11] clang format/tidy fixes for modify_tilt_selection --- scwx-qt/source/scwx/qt/main/main_window.cpp | 5 ++--- scwx-qt/source/scwx/qt/ui/level2_settings_widget.cpp | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/scwx-qt/source/scwx/qt/main/main_window.cpp b/scwx-qt/source/scwx/qt/main/main_window.cpp index a9c140be..71f4d00c 100644 --- a/scwx-qt/source/scwx/qt/main/main_window.cpp +++ b/scwx-qt/source/scwx/qt/main/main_window.cpp @@ -1283,7 +1283,7 @@ void MainWindowImpl::ConnectOtherSignals() generalSettings.default_radar_site().changed_signal().connect( [this]() { - std::shared_ptr radarSite = + const std::shared_ptr radarSite = activeMap_->GetRadarSite(); const std::string homeRadarSite = settings::GeneralSettings::Instance() @@ -1291,8 +1291,7 @@ void MainWindowImpl::ConnectOtherSignals() .GetValue(); if (radarSite == nullptr) { - mainWindow_->ui->saveRadarProductsButton->setVisible( - false); + mainWindow_->ui->saveRadarProductsButton->setVisible(false); } else { diff --git a/scwx-qt/source/scwx/qt/ui/level2_settings_widget.cpp b/scwx-qt/source/scwx/qt/ui/level2_settings_widget.cpp index 0289ee54..1b851e72 100644 --- a/scwx-qt/source/scwx/qt/ui/level2_settings_widget.cpp +++ b/scwx-qt/source/scwx/qt/ui/level2_settings_widget.cpp @@ -243,7 +243,7 @@ void Level2SettingsWidget::UpdateElevationSelection(float elevation) void Level2SettingsWidget::UpdateSettings(map::MapWidget* activeMap) { std::optional currentElevationOption = activeMap->GetElevation(); - float currentElevation = + const float currentElevation = currentElevationOption.has_value() ? *currentElevationOption : 0.0f; std::vector elevationCuts = activeMap->GetElevationCuts();