Enable loading of product by double clicking in the resource explorer

- Doesn't work if radar product manager is expired for the site (time not present in record map)
- Need to fix going back to expired (garbage collected) live data
This commit is contained in:
Dan Paulat 2023-04-10 23:17:21 -05:00
parent 0c8047b1f4
commit 92bb5154a4
4 changed files with 81 additions and 7 deletions

View file

@ -397,6 +397,67 @@ void MainWindow::on_resourceTreeExpandAllButton_clicked()
ui->resourceTreeView->expandAll(); ui->resourceTreeView->expandAll();
} }
void MainWindow::on_resourceTreeView_doubleClicked(const QModelIndex& index)
{
std::string selectedString {index.data().toString().toStdString()};
std::chrono::system_clock::time_point time {};
logger_->debug("Selecting resource: {}",
index.data().toString().toStdString());
static const std::string timeFormat {"%Y-%m-%d %H:%M:%S"};
std::istringstream in {selectedString};
in >> std::chrono::parse(timeFormat, time);
if (in.fail())
{
// Not a time string, ignore double-click
return;
}
QModelIndex parent1 = index.parent();
QModelIndex parent2 = parent1.parent();
QModelIndex parent3 = parent2.parent();
std::string radarSite {};
std::string groupName {};
std::string product {};
if (!parent2.isValid())
{
// A time entry should be at the third or fourth level
logger_->error("Unexpected resource data");
return;
}
if (parent3.isValid())
{
// Level 3 Product
radarSite = parent3.data().toString().toStdString();
groupName = parent2.data().toString().toStdString();
product = parent1.data().toString().toStdString();
}
else
{
// Level 2 Product
radarSite = parent2.data().toString().toStdString();
groupName = parent1.data().toString().toStdString();
// No product index
}
common::RadarProductGroup group = common::GetRadarProductGroup(groupName);
// Update radar site if different from currently selected
if (p->activeMap_->GetRadarSite()->id() != radarSite)
{
p->activeMap_->SelectRadarSite(radarSite);
}
// Select the updated radar product
p->activeMap_->SelectRadarProduct(group, product, 0, time);
}
void MainWindowImpl::ConfigureMapLayout() void MainWindowImpl::ConfigureMapLayout()
{ {
auto& generalSettings = manager::SettingsManager::general_settings(); auto& generalSettings = manager::SettingsManager::general_settings();

View file

@ -45,6 +45,7 @@ private slots:
void on_radarSiteSelectButton_clicked(); void on_radarSiteSelectButton_clicked();
void on_resourceTreeCollapseAllButton_clicked(); void on_resourceTreeCollapseAllButton_clicked();
void on_resourceTreeExpandAllButton_clicked(); void on_resourceTreeExpandAllButton_clicked();
void on_resourceTreeView_doubleClicked(const QModelIndex& index);
private: private:
std::unique_ptr<MainWindowImpl> p; std::unique_ptr<MainWindowImpl> p;

View file

@ -307,7 +307,7 @@ std::shared_ptr<config::RadarSite> MapWidget::GetRadarSite() const
return radarSite; return radarSite;
} }
uint16_t MapWidget::GetVcp() const std::uint16_t MapWidget::GetVcp() const
{ {
auto radarProductView = p->context_->radar_product_view(); auto radarProductView = p->context_->radar_product_view();
@ -317,7 +317,7 @@ uint16_t MapWidget::GetVcp() const
} }
else else
{ {
return 0; return 0u;
} }
} }
@ -334,7 +334,8 @@ void MapWidget::SelectElevation(float elevation)
void MapWidget::SelectRadarProduct(common::RadarProductGroup group, void MapWidget::SelectRadarProduct(common::RadarProductGroup group,
const std::string& product, const std::string& product,
int16_t productCode) std::int16_t productCode,
std::chrono::system_clock::time_point time)
{ {
bool radarProductViewCreated = false; bool radarProductViewCreated = false;
@ -384,8 +385,8 @@ void MapWidget::SelectRadarProduct(common::RadarProductGroup group,
if (radarProductView != nullptr) if (radarProductView != nullptr)
{ {
// Always select the latest product available // Select the time associated with the request
radarProductView->SelectTime({}); radarProductView->SelectTime(time);
if (radarProductViewCreated) if (radarProductViewCreated)
{ {

View file

@ -41,12 +41,23 @@ public:
common::RadarProductGroup GetRadarProductGroup() const; common::RadarProductGroup GetRadarProductGroup() const;
std::string GetRadarProductName() const; std::string GetRadarProductName() const;
std::shared_ptr<config::RadarSite> GetRadarSite() const; std::shared_ptr<config::RadarSite> GetRadarSite() const;
uint16_t GetVcp() const; std::uint16_t GetVcp() const;
void SelectElevation(float elevation); void SelectElevation(float elevation);
/**
* @brief Selects a radar product.
*
* @param [in] group Radar product group
* @param [in] product Radar product name
* @param [in] productCode Radar product code (optional)
* @paran [in] time Product time. Default is the latest available.
*/
void SelectRadarProduct(common::RadarProductGroup group, void SelectRadarProduct(common::RadarProductGroup group,
const std::string& product, const std::string& product,
int16_t productCode); std::int16_t productCode = 0,
std::chrono::system_clock::time_point time = {});
void SelectRadarProduct(std::shared_ptr<types::RadarProductRecord> record); void SelectRadarProduct(std::shared_ptr<types::RadarProductRecord> record);
/** /**