mirror of
https://github.com/ciphervance/supercell-wx.git
synced 2025-10-30 18:50:05 +00:00
Add available products to Level 3 Products Widget
This commit is contained in:
parent
7e084d28e9
commit
e69f9a8008
3 changed files with 167 additions and 24 deletions
|
|
@ -73,6 +73,7 @@ public:
|
||||||
~MainWindowImpl() = default;
|
~MainWindowImpl() = default;
|
||||||
|
|
||||||
void ConfigureMapLayout();
|
void ConfigureMapLayout();
|
||||||
|
void ConnectMapSignals();
|
||||||
void HandleFocusChange(QWidget* focused);
|
void HandleFocusChange(QWidget* focused);
|
||||||
void SelectElevation(map::MapWidget* mapWidget, float elevation);
|
void SelectElevation(map::MapWidget* mapWidget, float elevation);
|
||||||
void SelectRadarProduct(map::MapWidget* mapWidget,
|
void SelectRadarProduct(map::MapWidget* mapWidget,
|
||||||
|
|
@ -80,6 +81,7 @@ public:
|
||||||
const std::string& productName,
|
const std::string& productName,
|
||||||
int16_t productCode);
|
int16_t productCode);
|
||||||
void SetActiveMap(map::MapWidget* mapWidget);
|
void SetActiveMap(map::MapWidget* mapWidget);
|
||||||
|
void UpdateAvailableLevel3Products();
|
||||||
void UpdateElevationSelection(float elevation);
|
void UpdateElevationSelection(float elevation);
|
||||||
void UpdateRadarProductSelection(common::RadarProductGroup group,
|
void UpdateRadarProductSelection(common::RadarProductGroup group,
|
||||||
const std::string& product);
|
const std::string& product);
|
||||||
|
|
@ -151,6 +153,8 @@ MainWindow::MainWindow(QWidget* parent) :
|
||||||
0);
|
0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
p->ConnectMapSignals();
|
||||||
|
|
||||||
connect(qApp,
|
connect(qApp,
|
||||||
&QApplication::focusChanged,
|
&QApplication::focusChanged,
|
||||||
this,
|
this,
|
||||||
|
|
@ -301,29 +305,6 @@ void MainWindowImpl::ConfigureMapLayout()
|
||||||
if (maps_.at(mapIndex) == nullptr)
|
if (maps_.at(mapIndex) == nullptr)
|
||||||
{
|
{
|
||||||
maps_[mapIndex] = new map::MapWidget(settings_);
|
maps_[mapIndex] = new map::MapWidget(settings_);
|
||||||
|
|
||||||
connect(maps_[mapIndex],
|
|
||||||
&map::MapWidget::MapParametersChanged,
|
|
||||||
this,
|
|
||||||
&MainWindowImpl::UpdateMapParameters);
|
|
||||||
|
|
||||||
connect(
|
|
||||||
maps_[mapIndex],
|
|
||||||
&map::MapWidget::RadarSweepUpdated,
|
|
||||||
this,
|
|
||||||
[=]()
|
|
||||||
{
|
|
||||||
if (maps_[mapIndex] == activeMap_)
|
|
||||||
{
|
|
||||||
UpdateRadarProductSelection(
|
|
||||||
activeMap_->GetRadarProductGroup(),
|
|
||||||
activeMap_->GetRadarProductName());
|
|
||||||
UpdateRadarProductSettings();
|
|
||||||
UpdateRadarSite();
|
|
||||||
UpdateVcp();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
Qt::QueuedConnection);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
hs->addWidget(maps_[mapIndex]);
|
hs->addWidget(maps_[mapIndex]);
|
||||||
|
|
@ -337,6 +318,50 @@ void MainWindowImpl::ConfigureMapLayout()
|
||||||
SetActiveMap(maps_.at(0));
|
SetActiveMap(maps_.at(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindowImpl::ConnectMapSignals()
|
||||||
|
{
|
||||||
|
std::for_each(maps_.cbegin(),
|
||||||
|
maps_.cend(),
|
||||||
|
[&](auto& mapWidget)
|
||||||
|
{
|
||||||
|
connect(mapWidget,
|
||||||
|
&map::MapWidget::MapParametersChanged,
|
||||||
|
this,
|
||||||
|
&MainWindowImpl::UpdateMapParameters);
|
||||||
|
|
||||||
|
connect(
|
||||||
|
mapWidget,
|
||||||
|
&map::MapWidget::RadarSweepUpdated,
|
||||||
|
this,
|
||||||
|
[&]()
|
||||||
|
{
|
||||||
|
if (mapWidget == activeMap_)
|
||||||
|
{
|
||||||
|
UpdateRadarProductSelection(
|
||||||
|
mapWidget->GetRadarProductGroup(),
|
||||||
|
mapWidget->GetRadarProductName());
|
||||||
|
UpdateRadarProductSettings();
|
||||||
|
UpdateRadarSite();
|
||||||
|
UpdateVcp();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
Qt::QueuedConnection);
|
||||||
|
|
||||||
|
connect(
|
||||||
|
mapWidget,
|
||||||
|
&map::MapWidget::Level3ProductsChanged,
|
||||||
|
this,
|
||||||
|
[&]()
|
||||||
|
{
|
||||||
|
if (mapWidget == activeMap_)
|
||||||
|
{
|
||||||
|
UpdateAvailableLevel3Products();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
Qt::QueuedConnection);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindowImpl::HandleFocusChange(QWidget* focused)
|
void MainWindowImpl::HandleFocusChange(QWidget* focused)
|
||||||
{
|
{
|
||||||
map::MapWidget* mapWidget = dynamic_cast<map::MapWidget*>(focused);
|
map::MapWidget* mapWidget = dynamic_cast<map::MapWidget*>(focused);
|
||||||
|
|
@ -344,6 +369,7 @@ void MainWindowImpl::HandleFocusChange(QWidget* focused)
|
||||||
if (mapWidget != nullptr)
|
if (mapWidget != nullptr)
|
||||||
{
|
{
|
||||||
SetActiveMap(mapWidget);
|
SetActiveMap(mapWidget);
|
||||||
|
UpdateAvailableLevel3Products();
|
||||||
UpdateRadarProductSelection(mapWidget->GetRadarProductGroup(),
|
UpdateRadarProductSelection(mapWidget->GetRadarProductGroup(),
|
||||||
mapWidget->GetRadarProductName());
|
mapWidget->GetRadarProductName());
|
||||||
UpdateRadarProductSettings();
|
UpdateRadarProductSettings();
|
||||||
|
|
@ -395,6 +421,12 @@ void MainWindowImpl::SetActiveMap(map::MapWidget* mapWidget)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindowImpl::UpdateAvailableLevel3Products()
|
||||||
|
{
|
||||||
|
level3ProductsWidget_->UpdateAvailableProducts(
|
||||||
|
activeMap_->GetAvailableLevel3Categories());
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindowImpl::UpdateElevationSelection(float elevation)
|
void MainWindowImpl::UpdateElevationSelection(float elevation)
|
||||||
{
|
{
|
||||||
level2SettingsWidget_->UpdateElevationSelection(elevation);
|
level2SettingsWidget_->UpdateElevationSelection(elevation);
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,9 @@
|
||||||
#include <scwx/util/logger.hpp>
|
#include <scwx/util/logger.hpp>
|
||||||
|
|
||||||
#include <execution>
|
#include <execution>
|
||||||
|
#include <shared_mutex>
|
||||||
|
|
||||||
|
#include <QMenu>
|
||||||
#include <QToolButton>
|
#include <QToolButton>
|
||||||
|
|
||||||
namespace scwx
|
namespace scwx
|
||||||
|
|
@ -22,7 +24,11 @@ class Level3ProductsWidgetImpl : public QObject
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit Level3ProductsWidgetImpl(Level3ProductsWidget* self) :
|
explicit Level3ProductsWidgetImpl(Level3ProductsWidget* self) :
|
||||||
self_ {self}, layout_ {new ui::FlowLayout(self)}, categoryButtons_ {}
|
self_ {self},
|
||||||
|
layout_ {new ui::FlowLayout(self)},
|
||||||
|
categoryButtons_ {},
|
||||||
|
availableCategoryMap_ {},
|
||||||
|
availableCategoryMutex_ {}
|
||||||
{
|
{
|
||||||
layout_->setContentsMargins(0, 0, 0, 0);
|
layout_->setContentsMargins(0, 0, 0, 0);
|
||||||
|
|
||||||
|
|
@ -42,6 +48,30 @@ public:
|
||||||
&QToolButton::clicked,
|
&QToolButton::clicked,
|
||||||
this,
|
this,
|
||||||
[=]() { SelectProductCategory(category); });
|
[=]() { SelectProductCategory(category); });
|
||||||
|
|
||||||
|
QMenu* categoryMenu = new QMenu();
|
||||||
|
toolButton->setMenu(categoryMenu);
|
||||||
|
|
||||||
|
const auto& products = common::GetLevel3ProductsByCategory(category);
|
||||||
|
auto& productMenus = categoryMenuMap_[category];
|
||||||
|
|
||||||
|
for (const auto& product : products)
|
||||||
|
{
|
||||||
|
QMenu* productMenu = categoryMenu->addMenu(QString::fromStdString(
|
||||||
|
common::GetLevel3ProductDescription(product)));
|
||||||
|
|
||||||
|
for (size_t tilt = 1; tilt <= common::kLevel3ProductMaxTilts;
|
||||||
|
++tilt)
|
||||||
|
{
|
||||||
|
productMenu->addAction(tr("Tilt %1").arg(tilt));
|
||||||
|
}
|
||||||
|
|
||||||
|
productMenus[product] = productMenu;
|
||||||
|
|
||||||
|
productMenu->menuAction()->setVisible(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
toolButton->setEnabled(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
~Level3ProductsWidgetImpl() = default;
|
~Level3ProductsWidgetImpl() = default;
|
||||||
|
|
@ -53,6 +83,12 @@ public:
|
||||||
Level3ProductsWidget* self_;
|
Level3ProductsWidget* self_;
|
||||||
QLayout* layout_;
|
QLayout* layout_;
|
||||||
std::list<QToolButton*> categoryButtons_;
|
std::list<QToolButton*> categoryButtons_;
|
||||||
|
std::unordered_map<common::Level3ProductCategory,
|
||||||
|
std::unordered_map<std::string, QMenu*>>
|
||||||
|
categoryMenuMap_;
|
||||||
|
|
||||||
|
common::Level3ProductCategoryMap availableCategoryMap_;
|
||||||
|
std::shared_mutex availableCategoryMutex_;
|
||||||
};
|
};
|
||||||
|
|
||||||
Level3ProductsWidget::Level3ProductsWidget(QWidget* parent) :
|
Level3ProductsWidget::Level3ProductsWidget(QWidget* parent) :
|
||||||
|
|
@ -105,6 +141,79 @@ void Level3ProductsWidgetImpl::SelectProductCategory(
|
||||||
0);
|
0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Level3ProductsWidget::UpdateAvailableProducts(
|
||||||
|
const common::Level3ProductCategoryMap& updatedCategoryMap)
|
||||||
|
{
|
||||||
|
logger_->debug("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)
|
||||||
|
{
|
||||||
|
const std::string& categoryName = toolButton->text().toStdString();
|
||||||
|
const common::Level3ProductCategory category =
|
||||||
|
common::GetLevel3Category(categoryName);
|
||||||
|
|
||||||
|
auto availableProductMapIter = updatedCategoryMap.find(category);
|
||||||
|
const bool categoryEnabled =
|
||||||
|
(availableProductMapIter != updatedCategoryMap.cend());
|
||||||
|
|
||||||
|
// Enable category if any products are available
|
||||||
|
toolButton->setEnabled(categoryEnabled);
|
||||||
|
|
||||||
|
if (categoryEnabled)
|
||||||
|
{
|
||||||
|
const auto& availableProductMap = availableProductMapIter->second;
|
||||||
|
auto& productMenus = p->categoryMenuMap_.at(category);
|
||||||
|
|
||||||
|
// Iterate through each product menu
|
||||||
|
std::for_each(
|
||||||
|
// std::execution::par_unseq,
|
||||||
|
productMenus.cbegin(),
|
||||||
|
productMenus.cend(),
|
||||||
|
[&](const auto productMenu)
|
||||||
|
{
|
||||||
|
auto availableAwipsIdIter =
|
||||||
|
availableProductMap.find(productMenu.first);
|
||||||
|
const bool productEnabled =
|
||||||
|
(availableAwipsIdIter != availableProductMap.cend());
|
||||||
|
|
||||||
|
// Enable product if it has AWIPS IDs available
|
||||||
|
productMenu.second->menuAction()->setVisible(productEnabled);
|
||||||
|
|
||||||
|
if (productEnabled)
|
||||||
|
{
|
||||||
|
// Determine number of tilts to display
|
||||||
|
size_t numTilts =
|
||||||
|
std::min(availableAwipsIdIter->second.size(),
|
||||||
|
common::kLevel3ProductMaxTilts);
|
||||||
|
size_t currentTilt = 0;
|
||||||
|
|
||||||
|
QList<QAction*> tiltActionList =
|
||||||
|
productMenu.second->findChildren<QAction*>(
|
||||||
|
Qt::FindDirectChildrenOnly);
|
||||||
|
|
||||||
|
for (QAction* tiltAction : tiltActionList)
|
||||||
|
{
|
||||||
|
// Set the first n tilts to visible. The QAction list
|
||||||
|
// includes the productMenu's action, so one is
|
||||||
|
// added.
|
||||||
|
tiltAction->setVisible(++currentTilt <= numTilts + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
void Level3ProductsWidget::UpdateProductSelection(
|
void Level3ProductsWidget::UpdateProductSelection(
|
||||||
common::RadarProductGroup group, const std::string& productName)
|
common::RadarProductGroup group, const std::string& productName)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,8 @@ public:
|
||||||
|
|
||||||
void showEvent(QShowEvent* event) override;
|
void showEvent(QShowEvent* event) override;
|
||||||
|
|
||||||
|
void UpdateAvailableProducts(
|
||||||
|
const common::Level3ProductCategoryMap& updatedCategoryMap);
|
||||||
void UpdateProductSelection(common::RadarProductGroup group,
|
void UpdateProductSelection(common::RadarProductGroup group,
|
||||||
const std::string& productName);
|
const std::string& productName);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue