mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-31 06:10:04 +00:00 
			
		
		
		
	Handle level 3 product tilt hotkeys
This commit is contained in:
		
							parent
							
								
									6c11c47a05
								
							
						
					
					
						commit
						77dd7dde3e
					
				
					 1 changed files with 111 additions and 3 deletions
				
			
		|  | @ -1,5 +1,6 @@ | ||||||
| #include <scwx/qt/ui/level3_products_widget.hpp> | #include <scwx/qt/ui/level3_products_widget.hpp> | ||||||
| #include <scwx/qt/ui/flow_layout.hpp> | #include <scwx/qt/ui/flow_layout.hpp> | ||||||
|  | #include <scwx/qt/manager/hotkey_manager.hpp> | ||||||
| #include <scwx/qt/settings/product_settings.hpp> | #include <scwx/qt/settings/product_settings.hpp> | ||||||
| #include <scwx/qt/settings/settings_interface.hpp> | #include <scwx/qt/settings/settings_interface.hpp> | ||||||
| #include <scwx/util/logger.hpp> | #include <scwx/util/logger.hpp> | ||||||
|  | @ -127,9 +128,15 @@ public: | ||||||
| 
 | 
 | ||||||
|       stiPastEnabled_.SetEditWidget(stiPastEnableCheckBox); |       stiPastEnabled_.SetEditWidget(stiPastEnableCheckBox); | ||||||
|       stiForecastEnabled_.SetEditWidget(stiForecastEnableCheckBox); |       stiForecastEnabled_.SetEditWidget(stiForecastEnableCheckBox); | ||||||
|  | 
 | ||||||
|  |       QObject::connect(hotkeyManager_.get(), | ||||||
|  |                        &manager::HotkeyManager::HotkeyPressed, | ||||||
|  |                        this, | ||||||
|  |                        &Level3ProductsWidgetImpl::HandleHotkeyPressed); | ||||||
|    } |    } | ||||||
|    ~Level3ProductsWidgetImpl() = default; |    ~Level3ProductsWidgetImpl() = default; | ||||||
| 
 | 
 | ||||||
|  |    void HandleHotkeyPressed(types::Hotkey hotkey, bool isAutoRepeat); | ||||||
|    void NormalizeProductButtons(); |    void NormalizeProductButtons(); | ||||||
|    void SelectProductCategory(common::Level3ProductCategory category); |    void SelectProductCategory(common::Level3ProductCategory category); | ||||||
|    void UpdateCategorySelection(common::Level3ProductCategory category); |    void UpdateCategorySelection(common::Level3ProductCategory category); | ||||||
|  | @ -144,11 +151,17 @@ public: | ||||||
|                       std::unordered_map<std::string, QMenu*>> |                       std::unordered_map<std::string, QMenu*>> | ||||||
|       categoryMenuMap_; |       categoryMenuMap_; | ||||||
| 
 | 
 | ||||||
|  |    std::shared_ptr<manager::HotkeyManager> hotkeyManager_ { | ||||||
|  |       manager::HotkeyManager::Instance()}; | ||||||
|  | 
 | ||||||
|    std::unordered_map<std::string, std::vector<QAction*>> productTiltMap_; |    std::unordered_map<std::string, std::vector<QAction*>> productTiltMap_; | ||||||
| 
 | 
 | ||||||
|    std::unordered_map<QAction*, std::string> awipsProductMap_; |    std::unordered_map<QAction*, std::string> awipsProductMap_; | ||||||
|    std::shared_mutex                         awipsProductMutex_; |    std::shared_mutex                         awipsProductMutex_; | ||||||
| 
 | 
 | ||||||
|  |    std::string currentAwipsId_ {}; | ||||||
|  |    QAction*    currentProductTiltAction_ {nullptr}; | ||||||
|  | 
 | ||||||
|    settings::SettingsInterface<bool> stiPastEnabled_ {}; |    settings::SettingsInterface<bool> stiPastEnabled_ {}; | ||||||
|    settings::SettingsInterface<bool> stiForecastEnabled_ {}; |    settings::SettingsInterface<bool> stiForecastEnabled_ {}; | ||||||
| }; | }; | ||||||
|  | @ -167,6 +180,84 @@ void Level3ProductsWidget::showEvent(QShowEvent* event) | ||||||
|    p->NormalizeProductButtons(); |    p->NormalizeProductButtons(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void Level3ProductsWidgetImpl::HandleHotkeyPressed(types::Hotkey hotkey, | ||||||
|  |                                                    bool          isAutoRepeat) | ||||||
|  | { | ||||||
|  |    if (hotkey != types::Hotkey::ProductTiltDecrease && | ||||||
|  |        hotkey != types::Hotkey::ProductTiltIncrease) | ||||||
|  |    { | ||||||
|  |       // Not handling this hotkey
 | ||||||
|  |       return; | ||||||
|  |    } | ||||||
|  | 
 | ||||||
|  |    logger_->trace("Handling hotkey: {}, repeat: {}", | ||||||
|  |                   types::GetHotkeyShortName(hotkey), | ||||||
|  |                   isAutoRepeat); | ||||||
|  | 
 | ||||||
|  |    std::string currentAwipsId           = currentAwipsId_; | ||||||
|  |    QAction*    currentProductTiltAction = currentProductTiltAction_; | ||||||
|  | 
 | ||||||
|  |    if (currentProductTiltAction == nullptr || currentAwipsId.empty() || | ||||||
|  |        currentAwipsId == "?") | ||||||
|  |    { | ||||||
|  |       // Level 3 product is not selected
 | ||||||
|  |       return; | ||||||
|  |    } | ||||||
|  | 
 | ||||||
|  |    // Get product
 | ||||||
|  |    std::string product = common::GetLevel3ProductByAwipsId(currentAwipsId); | ||||||
|  |    if (product == "?") | ||||||
|  |    { | ||||||
|  |       logger_->error("Invalid AWIPS ID: {}", currentAwipsId); | ||||||
|  |       return; | ||||||
|  |    } | ||||||
|  | 
 | ||||||
|  |    std::shared_lock lock {awipsProductMutex_}; | ||||||
|  | 
 | ||||||
|  |    // Find the current product tilt
 | ||||||
|  |    auto productTiltsIt = productTiltMap_.find(product); | ||||||
|  |    if (productTiltsIt == productTiltMap_.cend()) | ||||||
|  |    { | ||||||
|  |       logger_->error("Could not find product tilt map: {}", | ||||||
|  |                      common::GetLevel3ProductDescription(product)); | ||||||
|  |       return; | ||||||
|  |    } | ||||||
|  | 
 | ||||||
|  |    auto& productTilts  = productTiltsIt->second; | ||||||
|  |    auto  productTiltIt = std::find( | ||||||
|  |       productTilts.cbegin(), productTilts.cend(), currentProductTiltAction); | ||||||
|  |    if (productTiltIt == productTilts.cend()) | ||||||
|  |    { | ||||||
|  |       logger_->error("Could not locate product tilt: {}", currentAwipsId); | ||||||
|  |       return; | ||||||
|  |    } | ||||||
|  | 
 | ||||||
|  |    std::ptrdiff_t productTiltIndex = | ||||||
|  |       std::distance(productTilts.cbegin(), productTiltIt); | ||||||
|  | 
 | ||||||
|  |    // Determine the new product tilt index
 | ||||||
|  |    std::ptrdiff_t newProductTiltIndex = | ||||||
|  |       (hotkey == types::Hotkey::ProductTiltDecrease) ? productTiltIndex - 1 : | ||||||
|  |                                                        productTiltIndex + 1; | ||||||
|  | 
 | ||||||
|  |    // Validate the new product tilt index
 | ||||||
|  |    if (newProductTiltIndex < 0 || | ||||||
|  |        newProductTiltIndex >= | ||||||
|  |           static_cast<std::ptrdiff_t>(productTilts.size()) || | ||||||
|  |        !productTilts.at(newProductTiltIndex)->isVisible()) | ||||||
|  |    { | ||||||
|  |       const std::string direction = | ||||||
|  |          (hotkey == types::Hotkey::ProductTiltDecrease) ? "lower" : "upper"; | ||||||
|  | 
 | ||||||
|  |       logger_->info("Product tilt at {} limit", direction); | ||||||
|  | 
 | ||||||
|  |       return; | ||||||
|  |    } | ||||||
|  | 
 | ||||||
|  |    // Select the new tilt
 | ||||||
|  |    productTilts.at(newProductTiltIndex)->trigger(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void Level3ProductsWidgetImpl::NormalizeProductButtons() | void Level3ProductsWidgetImpl::NormalizeProductButtons() | ||||||
| { | { | ||||||
|    int level3MaxWidth = 0; |    int level3MaxWidth = 0; | ||||||
|  | @ -283,6 +374,8 @@ void Level3ProductsWidget::UpdateProductSelection( | ||||||
|    else |    else | ||||||
|    { |    { | ||||||
|       p->UpdateCategorySelection(common::Level3ProductCategory::Unknown); |       p->UpdateCategorySelection(common::Level3ProductCategory::Unknown); | ||||||
|  |       p->currentAwipsId_.erase(); | ||||||
|  |       p->currentProductTiltAction_ = nullptr; | ||||||
|    } |    } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -293,7 +386,7 @@ void Level3ProductsWidgetImpl::UpdateCategorySelection( | ||||||
| 
 | 
 | ||||||
|    std::for_each(categoryButtons_.cbegin(), |    std::for_each(categoryButtons_.cbegin(), | ||||||
|                  categoryButtons_.cend(), |                  categoryButtons_.cend(), | ||||||
|                  [&](auto& toolButton) |                  [&, this](auto& toolButton) | ||||||
|                  { |                  { | ||||||
|                     if (toolButton->text().toStdString() == categoryName) |                     if (toolButton->text().toStdString() == categoryName) | ||||||
|                     { |                     { | ||||||
|  | @ -313,10 +406,25 @@ void Level3ProductsWidgetImpl::UpdateProductSelection( | ||||||
| { | { | ||||||
|    std::shared_lock lock {awipsProductMutex_}; |    std::shared_lock lock {awipsProductMutex_}; | ||||||
| 
 | 
 | ||||||
|  |    QAction* newProductTilt = nullptr; | ||||||
|  | 
 | ||||||
|    std::for_each(awipsProductMap_.cbegin(), |    std::for_each(awipsProductMap_.cbegin(), | ||||||
|                  awipsProductMap_.cend(), |                  awipsProductMap_.cend(), | ||||||
|                  [=](const auto& pair) |                  [&, this](const auto& pair) | ||||||
|                  { pair.first->setChecked(pair.second == awipsId); }); |                  { | ||||||
|  |                     if (pair.second == awipsId) | ||||||
|  |                     { | ||||||
|  |                        newProductTilt = pair.first; | ||||||
|  |                        pair.first->setChecked(true); | ||||||
|  |                     } | ||||||
|  |                     else | ||||||
|  |                     { | ||||||
|  |                        pair.first->setChecked(false); | ||||||
|  |                     } | ||||||
|  |                  }); | ||||||
|  | 
 | ||||||
|  |    currentAwipsId_           = awipsId; | ||||||
|  |    currentProductTiltAction_ = newProductTilt; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| } // namespace ui
 | } // namespace ui
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Dan Paulat
						Dan Paulat