mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-31 00:20:05 +00:00 
			
		
		
		
	Modify how level 3 tilts are selected to keep them more consistent
This commit is contained in:
		
							parent
							
								
									b74229a3f4
								
							
						
					
					
						commit
						316da55000
					
				
					 1 changed files with 80 additions and 27 deletions
				
			
		|  | @ -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
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 AdenKoperczak
						AdenKoperczak