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},
prevZoom_ {0.0},
prevBearing_ {0.0},
prevPitch_ {0.0}
prevPitch_ {0.0},
tiltsToIndices_ {}
{
// Create views
auto overlayProductView = std::make_shared<view::OverlayProductView>();
@ -273,6 +274,9 @@ public:
bool productAvailabilityUpdated_ {false};
bool productAvailabilityProductSelected_ {false};
std::unordered_map<std::string, size_t> 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<config::RadarSite> 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