Cleanup of level 2 product selection, removing flicker from updates

This commit is contained in:
Dan Paulat 2022-05-29 01:10:39 -05:00
parent 159b3d8412
commit 52771b41f0
5 changed files with 129 additions and 111 deletions

View file

@ -83,6 +83,8 @@ public:
const std::string& before = {});
void AutoRefreshConnect();
void AutoRefreshDisconnect();
void RadarProductViewConnect();
void RadarProductViewDisconnect();
void SetRadarSite(const std::string& radarSite);
bool UpdateStoredMapParameters();
@ -132,8 +134,7 @@ MapWidget::MapWidget(const QMapboxGLSettings& settings) :
MapWidget::~MapWidget()
{
// Make sure we have a valid context so we
// can delete the QMapboxGL.
// Make sure we have a valid context so we can delete the QMapboxGL.
makeCurrent();
}
@ -250,46 +251,31 @@ void MapWidget::SelectElevation(float elevation)
void MapWidget::SelectRadarProduct(common::Level2Product product)
{
float currentElevation = 0.0f;
bool radarProductViewCreated = false;
std::shared_ptr<view::RadarProductView>& radarProductView =
p->context_->radarProductView_;
if (p->context_->radarProductView_ != nullptr)
if (radarProductView == nullptr ||
radarProductView->GetRadarProductGroup() !=
common::RadarProductGroup::Level2 ||
p->selectedLevel2Product_ != product)
{
currentElevation = p->context_->radarProductView_->elevation();
}
p->RadarProductViewDisconnect();
radarProductView = view::RadarProductViewFactory::Create(
product, currentElevation, p->radarProductManager_);
product, p->radarProductManager_);
p->RadarProductViewConnect();
radarProductViewCreated = true;
}
radarProductView->SelectTime(p->selectedTime_);
p->selectedLevel2Product_ = product;
connect(
radarProductView.get(),
&view::RadarProductView::ColorTableUpdated,
this,
[&]() { update(); },
Qt::QueuedConnection);
connect(
radarProductView.get(),
&view::RadarProductView::SweepComputed,
this,
[&]()
if (radarProductViewCreated)
{
std::shared_ptr<config::RadarSite> radarSite =
p->radarProductManager_->radar_site();
RadarRangeLayer::Update(
p->map_,
radarProductView->range(),
{radarSite->latitude(), radarSite->longitude()});
update();
emit RadarSweepUpdated();
},
Qt::QueuedConnection);
util::async(
[=]()
{
@ -310,8 +296,16 @@ void MapWidget::SelectRadarProduct(common::Level2Product product)
{
AddLayers();
}
}
else
{
radarProductView->Update();
}
if (p->autoRefreshEnabled_)
{
p->radarProductManager_->EnableLevel2Refresh(true);
}
}
void MapWidget::SelectRadarProduct(
@ -353,7 +347,7 @@ void MapWidget::SelectRadarProduct(
manager::RadarProductManager::Instance(radarId);
std::shared_ptr<view::RadarProductView> radarProductView =
view::RadarProductViewFactory::Create(
group, product, productCode, 0.0f, radarProductManager);
group, product, productCode, radarProductManager);
if (radarProductView == nullptr)
{
@ -361,34 +355,14 @@ void MapWidget::SelectRadarProduct(
return;
}
p->RadarProductViewDisconnect();
p->context_->radarProductView_ = radarProductView;
p->SetRadarSite(radarId);
p->selectedTime_ = time;
radarProductView->SelectTime(p->selectedTime_);
connect(
radarProductView.get(),
&view::RadarProductView::ColorTableUpdated,
this,
[&]() { update(); },
Qt::QueuedConnection);
connect(
radarProductView.get(),
&view::RadarProductView::SweepComputed,
this,
[=]()
{
std::shared_ptr<config::RadarSite> radarSite =
p->radarProductManager_->radar_site();
RadarRangeLayer::Update(
p->map_,
radarProductView->range(),
{radarSite->latitude(), radarSite->longitude()});
update();
emit RadarSweepUpdated();
},
Qt::QueuedConnection);
p->RadarProductViewConnect();
util::async(
[=]()
@ -448,6 +422,8 @@ void MapWidget::changeStyle()
void MapWidget::AddLayers()
{
logger_->debug("AddLayers()");
// Clear custom layers
for (const std::string& id : p->layerList_)
{
@ -594,6 +570,8 @@ void MapWidget::wheelEvent(QWheelEvent* ev)
void MapWidget::initializeGL()
{
logger_->debug("initializeGL()");
makeCurrent();
p->context_->gl_.initializeOpenGLFunctions();
@ -652,6 +630,10 @@ void MapWidgetImpl::AutoRefreshConnect()
&manager::RadarProductManager::NewLevel2DataAvailable,
this,
[&](std::chrono::system_clock::time_point latestTime)
{
if (autoRefreshEnabled_ && context_->radarProductView_ != nullptr &&
context_->radarProductView_->GetRadarProductGroup() ==
common::RadarProductGroup::Level2)
{
// Create file request
std::shared_ptr<request::NexradFileRequest> request =
@ -674,8 +656,10 @@ void MapWidgetImpl::AutoRefreshConnect()
// Load file
util::async(
[=]()
{ radarProductManager_->LoadLevel2Data(latestTime, request); });
[=]() {
radarProductManager_->LoadLevel2Data(latestTime, request);
});
}
},
Qt::QueuedConnection);
}
@ -692,6 +676,51 @@ void MapWidgetImpl::AutoRefreshDisconnect()
}
}
void MapWidgetImpl::RadarProductViewConnect()
{
if (context_->radarProductView_ != nullptr)
{
connect(
context_->radarProductView_.get(),
&view::RadarProductView::ColorTableUpdated,
this,
[&]() { widget_->update(); },
Qt::QueuedConnection);
connect(
context_->radarProductView_.get(),
&view::RadarProductView::SweepComputed,
this,
[&]()
{
std::shared_ptr<config::RadarSite> radarSite =
radarProductManager_->radar_site();
RadarRangeLayer::Update(
map_,
context_->radarProductView_->range(),
{radarSite->latitude(), radarSite->longitude()});
widget_->update();
emit widget_->RadarSweepUpdated();
},
Qt::QueuedConnection);
}
}
void MapWidgetImpl::RadarProductViewDisconnect()
{
if (context_->radarProductView_ != nullptr)
{
disconnect(context_->radarProductView_.get(),
&view::RadarProductView::ColorTableUpdated,
this,
nullptr);
disconnect(context_->radarProductView_.get(),
&view::RadarProductView::SweepComputed,
this,
nullptr);
}
}
void MapWidgetImpl::SetRadarSite(const std::string& radarSite)
{
// Check if radar site has changed

View file

@ -43,11 +43,10 @@ class Level2ProductViewImpl
public:
explicit Level2ProductViewImpl(
common::Level2Product product,
float elevation,
std::shared_ptr<manager::RadarProductManager> radarProductManager) :
product_ {product},
radarProductManager_ {radarProductManager},
selectedElevation_ {elevation},
selectedElevation_ {0.0f},
selectedTime_ {},
elevationScan_ {nullptr},
momentDataBlock0_ {nullptr},
@ -117,10 +116,8 @@ public:
Level2ProductView::Level2ProductView(
common::Level2Product product,
float elevation,
std::shared_ptr<manager::RadarProductManager> radarProductManager) :
p(std::make_unique<Level2ProductViewImpl>(
product, elevation, radarProductManager))
p(std::make_unique<Level2ProductViewImpl>(product, radarProductManager))
{
}
Level2ProductView::~Level2ProductView() = default;
@ -642,11 +639,9 @@ void Level2ProductView::ComputeSweep()
std::shared_ptr<Level2ProductView> Level2ProductView::Create(
common::Level2Product product,
float elevation,
std::shared_ptr<manager::RadarProductManager> radarProductManager)
{
return std::make_shared<Level2ProductView>(
product, elevation, radarProductManager);
return std::make_shared<Level2ProductView>(product, radarProductManager);
}
} // namespace view

View file

@ -25,7 +25,6 @@ class Level2ProductView : public RadarProductView
public:
explicit Level2ProductView(
common::Level2Product product,
float elevation,
std::shared_ptr<manager::RadarProductManager> radarProductManager);
~Level2ProductView();
@ -51,7 +50,6 @@ public:
static std::shared_ptr<Level2ProductView>
Create(common::Level2Product product,
float elevation,
std::shared_ptr<manager::RadarProductManager> radarProductManager);
protected:

View file

@ -35,7 +35,6 @@ std::shared_ptr<RadarProductView> RadarProductViewFactory::Create(
common::RadarProductGroup productGroup,
const std::string& productName,
int16_t productCode,
float elevation,
std::shared_ptr<manager::RadarProductManager> radarProductManager)
{
std::shared_ptr<RadarProductView> view = nullptr;
@ -50,7 +49,7 @@ std::shared_ptr<RadarProductView> RadarProductViewFactory::Create(
}
else
{
view = Create(product, elevation, radarProductManager);
view = Create(product, radarProductManager);
}
}
else if (productGroup == common::RadarProductGroup::Level3)
@ -75,10 +74,9 @@ std::shared_ptr<RadarProductView> RadarProductViewFactory::Create(
std::shared_ptr<RadarProductView> RadarProductViewFactory::Create(
common::Level2Product product,
float elevation,
std::shared_ptr<manager::RadarProductManager> radarProductManager)
{
return Level2ProductView::Create(product, elevation, radarProductManager);
return Level2ProductView::Create(product, radarProductManager);
}
} // namespace view

View file

@ -31,11 +31,9 @@ public:
Create(common::RadarProductGroup productGroup,
const std::string& productName,
int16_t productCode,
float elevation,
std::shared_ptr<manager::RadarProductManager> radarProductManager);
static std::shared_ptr<RadarProductView>
Create(common::Level2Product product,
float elevation,
std::shared_ptr<manager::RadarProductManager> radarProductManager);
};