Modify how level 3 tilts are selected to keep them more consistent

This commit is contained in:
AdenKoperczak 2025-04-12 11:04:15 -04:00
parent b74229a3f4
commit 316da55000
No known key found for this signature in database
GPG key ID: 9843017036F62EE7

View file

@ -98,7 +98,8 @@ public:
prevLongitude_ {0.0}, prevLongitude_ {0.0},
prevZoom_ {0.0}, prevZoom_ {0.0},
prevBearing_ {0.0}, prevBearing_ {0.0},
prevPitch_ {0.0} prevPitch_ {0.0},
tiltsToIndices_ {}
{ {
// Create views // Create views
auto overlayProductView = std::make_shared<view::OverlayProductView>(); auto overlayProductView = std::make_shared<view::OverlayProductView>();
@ -273,6 +274,9 @@ public:
bool productAvailabilityUpdated_ {false}; bool productAvailabilityUpdated_ {false};
bool productAvailabilityProductSelected_ {false}; bool productAvailabilityProductSelected_ {false};
std::unordered_map<std::string, size_t> tiltsToIndices_;
size_t currentTiltIndex_ {0};
public slots: public slots:
void Update(); void Update();
}; };
@ -829,6 +833,17 @@ void MapWidget::SelectRadarProduct(common::RadarProductGroup group,
productCode = common::GetLevel3ProductCodeByAwipsId(productName); 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 || if (radarProductView == nullptr ||
radarProductView->GetRadarProductGroup() != group || radarProductView->GetRadarProductGroup() != group ||
(radarProductView->GetRadarProductGroup() == (radarProductView->GetRadarProductGroup() ==
@ -933,11 +948,6 @@ void MapWidget::SelectRadarSite(std::shared_ptr<config::RadarSite> radarSite,
if (radarProductView != nullptr) if (radarProductView != nullptr)
{ {
radarProductView->set_radar_product_manager(p->radarProductManager_); radarProductView->set_radar_product_manager(p->radarProductManager_);
SelectRadarProduct(radarProductView->GetRadarProductGroup(),
radarProductView->GetRadarProductName(),
0,
radarProductView->selected_time(),
false);
} }
p->AddLayers(); p->AddLayers();
@ -1756,6 +1766,24 @@ void MapWidgetImpl::RadarProductManagerConnect()
this, this,
[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; productAvailabilityUpdated_ = true;
CheckLevel3Availability(); CheckLevel3Availability();
Q_EMIT widget_->Level3ProductsChanged(); Q_EMIT widget_->Level3ProductsChanged();
@ -2058,7 +2086,7 @@ void MapWidgetImpl::CheckLevel3Availability()
* has been updated * has been updated
* *
* productAvailabilityProductSelected_ Only update once the radar site is * productAvailabilityProductSelected_ Only update once the radar site is
* fully selected, including the current product * fully selected
*/ */
if (!(productAvailabilityCheckNeeded_ && productAvailabilityUpdated_ && if (!(productAvailabilityCheckNeeded_ && productAvailabilityUpdated_ &&
productAvailabilityProductSelected_)) productAvailabilityProductSelected_))
@ -2073,6 +2101,9 @@ void MapWidgetImpl::CheckLevel3Availability()
return; return;
} }
// Get radar product view for fallback selection
auto radarProductView = context_->radar_product_view();
const common::Level3ProductCategoryMap& categoryMap = const common::Level3ProductCategoryMap& categoryMap =
widget_->GetAvailableLevel3Categories(); widget_->GetAvailableLevel3Categories();
@ -2083,6 +2114,12 @@ void MapWidgetImpl::CheckLevel3Availability()
common::GetLevel3CategoryByProduct(productName); common::GetLevel3CategoryByProduct(productName);
if (productCategory == common::Level3ProductCategory::Unknown) if (productCategory == common::Level3ProductCategory::Unknown)
{ {
// Default to the same as already selected
widget_->SelectRadarProduct(radarProductView->GetRadarProductGroup(),
radarProductView->GetRadarProductName(),
0,
radarProductView->selected_time(),
false);
return; return;
} }
@ -2090,38 +2127,54 @@ void MapWidgetImpl::CheckLevel3Availability()
// Has no products in this category, do not change categories // Has no products in this category, do not change categories
if (availableProductsIt == categoryMap.cend()) if (availableProductsIt == categoryMap.cend())
{ {
// Default to the same as already selected
widget_->SelectRadarProduct(radarProductView->GetRadarProductGroup(),
radarProductView->GetRadarProductName(),
0,
radarProductView->selected_time(),
false);
return; return;
} }
const auto& availableProducts = availableProductsIt->second; const auto& availableProducts = availableProductsIt->second;
const auto& availableTiltsIt = availableProducts.find(productName); const auto& availableTiltsIt = availableProducts.find(productName);
const auto& availableTilts =
availableTiltsIt == availableProducts.cend() ?
// Does not have the same product, but has others in the same category. // Does not have the same product, but has others in the same category.
// Switch to the default product and tilt in this category. // Switch to the default product and tilt in this category.
if (availableTiltsIt == availableProducts.cend()) availableProducts.at(common::GetLevel3ProductByAwipsId(
{ common::GetLevel3CategoryDefaultProduct(productCategory,
widget_->SelectRadarProduct( categoryMap))) :
common::RadarProductGroup::Level3, // Has the same product
common::GetLevel3CategoryDefaultProduct(productCategory, categoryMap), availableTiltsIt->second;
0,
widget_->GetSelectedTime());
return;
}
const auto& availableTilts = availableTiltsIt->second; // Try to match the tilt to the last tilt.
const auto& tilt = std::ranges::find_if( if (currentTiltIndex_ < availableTilts.size())
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)
{ {
widget_->SelectRadarProduct(common::RadarProductGroup::Level3, widget_->SelectRadarProduct(common::RadarProductGroup::Level3,
availableTilts[0], availableTilts[currentTiltIndex_],
0, 0,
widget_->GetSelectedTime()); 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 } // namespace map