From 3b7518006b97258f0a2fcf7005dcb0b632144b75 Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Mon, 12 Sep 2022 22:19:34 -0500 Subject: [PATCH] Check currently selected level 3 tilt --- .../scwx/qt/ui/level3_products_widget.cpp | 101 +++++++++--------- 1 file changed, 50 insertions(+), 51 deletions(-) diff --git a/scwx-qt/source/scwx/qt/ui/level3_products_widget.cpp b/scwx-qt/source/scwx/qt/ui/level3_products_widget.cpp index 24804baf..fe5b9bdf 100644 --- a/scwx-qt/source/scwx/qt/ui/level3_products_widget.cpp +++ b/scwx-qt/source/scwx/qt/ui/level3_products_widget.cpp @@ -27,8 +27,9 @@ public: self_ {self}, layout_ {new ui::FlowLayout(self)}, categoryButtons_ {}, - availableCategoryMap_ {}, - availableCategoryMutex_ {} + productTiltMap_ {}, + awipsProductMap_ {}, + awipsProductMutex_ {} { layout_->setContentsMargins(0, 0, 0, 0); @@ -60,11 +61,19 @@ public: QMenu* productMenu = categoryMenu->addMenu(QString::fromStdString( common::GetLevel3ProductDescription(product))); + std::vector& productTilts = productTiltMap_[product]; + for (size_t tilt = 1; tilt <= common::kLevel3ProductMaxTilts; ++tilt) { QAction* action = productMenu->addAction(tr("Tilt %1").arg(tilt)); + action->setCheckable(true); + + std::unique_lock lock {awipsProductMutex_}; + + productTilts.push_back(action); + awipsProductMap_.emplace(action, "?"); QObject::connect( action, @@ -72,33 +81,14 @@ public: this, [=]() { - std::shared_lock lock {availableCategoryMutex_}; + std::shared_lock lock {awipsProductMutex_}; + std::string awipsProductName {awipsProductMap_.at(action)}; - // Find product map associated with current category - auto productMapIt = availableCategoryMap_.find(category); - if (productMapIt != availableCategoryMap_.cend()) - { - // Find tilt list associated with current product - auto tiltListIt = productMapIt->second.find(product); - if (tiltListIt != productMapIt->second.cend()) - { - // Find AWIPS product in tilt list - if (tilt <= tiltListIt->second.size()) - { - std::string awipsProductName = - tiltListIt->second.at(tilt - 1); + self_->UpdateProductSelection( + common::RadarProductGroup::Level3, awipsProductName); - self_->UpdateProductSelection( - common::RadarProductGroup::Level3, - awipsProductName); - - emit self_->RadarProductSelected( - common::RadarProductGroup::Level3, - awipsProductName, - 0); - } - } - } + emit self_->RadarProductSelected( + common::RadarProductGroup::Level3, awipsProductName, 0); }); } @@ -114,7 +104,8 @@ public: void NormalizeProductButtons(); void SelectProductCategory(common::Level3ProductCategory category); - void UpdateProductSelection(common::Level3ProductCategory category); + void UpdateCategorySelection(common::Level3ProductCategory category); + void UpdateProductSelection(const std::string& awipsId); Level3ProductsWidget* self_; QLayout* layout_; @@ -123,8 +114,10 @@ public: std::unordered_map> categoryMenuMap_; - common::Level3ProductCategoryMap availableCategoryMap_; - std::shared_mutex availableCategoryMutex_; + std::unordered_map> productTiltMap_; + + std::unordered_map awipsProductMap_; + std::shared_mutex awipsProductMutex_; }; Level3ProductsWidget::Level3ProductsWidget(QWidget* parent) : @@ -169,7 +162,7 @@ void Level3ProductsWidgetImpl::NormalizeProductButtons() void Level3ProductsWidgetImpl::SelectProductCategory( common::Level3ProductCategory category) { - UpdateProductSelection(category); + UpdateCategorySelection(category); emit self_->RadarProductSelected( common::RadarProductGroup::Level3, @@ -182,14 +175,8 @@ void Level3ProductsWidget::UpdateAvailableProducts( { logger_->trace("UpdateAvailableProducts()"); - { - std::unique_lock lock {p->availableCategoryMutex_}; - p->availableCategoryMap_ = updatedCategoryMap; - } - // Iterate through each category tool button std::for_each( - // std::execution::par_unseq, p->categoryButtons_.cbegin(), p->categoryButtons_.cend(), [&](QToolButton* toolButton) @@ -212,7 +199,6 @@ void Level3ProductsWidget::UpdateAvailableProducts( // Iterate through each product menu std::for_each( - // std::execution::par_unseq, productMenus.cbegin(), productMenus.cend(), [&](const auto productMenu) @@ -228,21 +214,22 @@ void Level3ProductsWidget::UpdateAvailableProducts( if (productEnabled) { // Determine number of tilts to display - size_t numTilts = + const size_t numTilts = std::min(availableAwipsIdIter->second.size(), common::kLevel3ProductMaxTilts); - size_t currentTilt = 0; - QList tiltActionList = - productMenu.second->findChildren( - Qt::FindDirectChildrenOnly); + const std::vector& tiltActionList = + p->productTiltMap_.at(productMenu.first); - for (QAction* tiltAction : tiltActionList) + for (size_t i = 0; i < tiltActionList.size(); i++) { - // Set the first n tilts to visible. The QAction list - // includes the productMenu's action, so one is - // added. - tiltAction->setVisible(++currentTilt <= numTilts + 1); + bool visible = (i < numTilts); + tiltActionList[i]->setVisible(visible); + + std::unique_lock lock {p->awipsProductMutex_}; + + p->awipsProductMap_[tiltActionList[i]] = + visible ? availableAwipsIdIter->second[i] : "?"; } } }); @@ -257,15 +244,16 @@ void Level3ProductsWidget::UpdateProductSelection( { common::Level3ProductCategory category = common::GetLevel3CategoryByAwipsId(productName); - p->UpdateProductSelection(category); + p->UpdateCategorySelection(category); + p->UpdateProductSelection(productName); } else { - p->UpdateProductSelection(common::Level3ProductCategory::Unknown); + p->UpdateCategorySelection(common::Level3ProductCategory::Unknown); } } -void Level3ProductsWidgetImpl::UpdateProductSelection( +void Level3ProductsWidgetImpl::UpdateCategorySelection( common::Level3ProductCategory category) { const std::string& categoryName = common::GetLevel3CategoryName(category); @@ -288,6 +276,17 @@ void Level3ProductsWidgetImpl::UpdateProductSelection( }); } +void Level3ProductsWidgetImpl::UpdateProductSelection( + const std::string& awipsId) +{ + std::shared_lock lock {awipsProductMutex_}; + + std::for_each(awipsProductMap_.cbegin(), + awipsProductMap_.cend(), + [=](const auto& pair) + { pair.first->setChecked(pair.second == awipsId); }); +} + } // namespace ui } // namespace qt } // namespace scwx