Separate placefiles into their own layers

- Placefile rename is partially
- Texture repack might be broken
This commit is contained in:
Dan Paulat 2023-08-02 22:39:19 -05:00
parent 0be94c4de3
commit 117a473689
5 changed files with 155 additions and 17 deletions

View file

@ -109,7 +109,7 @@ bool PlacefileManager::placefile_thresholded(const std::string& name)
return false; return false;
} }
std::shared_ptr<const gr::Placefile> std::shared_ptr<gr::Placefile>
PlacefileManager::placefile(const std::string& name) PlacefileManager::placefile(const std::string& name)
{ {
std::shared_lock lock(p->placefileRecordLock_); std::shared_lock lock(p->placefileRecordLock_);

View file

@ -22,7 +22,7 @@ public:
bool placefile_enabled(const std::string& name); bool placefile_enabled(const std::string& name);
bool placefile_thresholded(const std::string& name); bool placefile_thresholded(const std::string& name);
std::shared_ptr<const gr::Placefile> placefile(const std::string& name); std::shared_ptr<gr::Placefile> placefile(const std::string& name);
void set_placefile_enabled(const std::string& name, bool enabled); void set_placefile_enabled(const std::string& name, bool enabled);
void set_placefile_thresholded(const std::string& name, bool thresholded); void set_placefile_thresholded(const std::string& name, bool thresholded);

View file

@ -18,6 +18,7 @@
#include <scwx/util/time.hpp> #include <scwx/util/time.hpp>
#include <regex> #include <regex>
#include <set>
#include <backends/imgui_impl_opengl3.h> #include <backends/imgui_impl_opengl3.h>
#include <backends/imgui_impl_qt.hpp> #include <backends/imgui_impl_qt.hpp>
@ -124,12 +125,16 @@ public:
void RadarProductManagerDisconnect(); void RadarProductManagerDisconnect();
void RadarProductViewConnect(); void RadarProductViewConnect();
void RadarProductViewDisconnect(); void RadarProductViewDisconnect();
void RemovePlacefileLayer(const std::string& placefileName);
void SetRadarSite(const std::string& radarSite); void SetRadarSite(const std::string& radarSite);
void UpdatePlacefileLayers();
bool UpdateStoredMapParameters(); bool UpdateStoredMapParameters();
common::Level2Product common::Level2Product
GetLevel2ProductOrDefault(const std::string& productName) const; GetLevel2ProductOrDefault(const std::string& productName) const;
static std::string GetPlacefileLayerName(const std::string& placefileName);
boost::asio::thread_pool threadPool_ {1u}; boost::asio::thread_pool threadPool_ {1u};
boost::uuids::uuid uuid_; boost::uuids::uuid uuid_;
@ -158,6 +163,9 @@ public:
std::shared_ptr<PlacefileLayer> placefileLayer_; std::shared_ptr<PlacefileLayer> placefileLayer_;
std::shared_ptr<ColorTableLayer> colorTableLayer_; std::shared_ptr<ColorTableLayer> colorTableLayer_;
std::set<std::string> enabledPlacefiles_ {};
std::list<std::shared_ptr<PlacefileLayer>> placefileLayers_ {};
bool autoRefreshEnabled_; bool autoRefreshEnabled_;
bool autoUpdateEnabled_; bool autoUpdateEnabled_;
@ -199,11 +207,28 @@ void MapWidgetImpl::ConnectSignals()
connect(placefileManager_.get(), connect(placefileManager_.get(),
&manager::PlacefileManager::PlacefileEnabled, &manager::PlacefileManager::PlacefileEnabled,
widget_, widget_,
[this]() { widget_->update(); }); [this](const std::string& name, bool enabled)
{
if (enabled && !enabledPlacefiles_.contains(name))
{
enabledPlacefiles_.emplace(name);
UpdatePlacefileLayers();
}
else if (!enabled && enabledPlacefiles_.contains(name))
{
enabledPlacefiles_.erase(name);
RemovePlacefileLayer(name);
}
widget_->update();
});
connect(placefileManager_.get(), connect(placefileManager_.get(),
&manager::PlacefileManager::PlacefileRenamed, &manager::PlacefileManager::PlacefileRenamed,
widget_, widget_,
[this]() { widget_->update(); }); [this]()
{
// TODO
widget_->update();
});
connect(placefileManager_.get(), connect(placefileManager_.get(),
&manager::PlacefileManager::PlacefileUpdated, &manager::PlacefileManager::PlacefileUpdated,
widget_, widget_,
@ -679,6 +704,7 @@ void MapWidget::AddLayers()
p->map_->removeLayer(id.c_str()); p->map_->removeLayer(id.c_str());
} }
p->layerList_.clear(); p->layerList_.clear();
p->placefileLayers_.clear();
auto radarProductView = p->context_->radar_product_view(); auto radarProductView = p->context_->radar_product_view();
@ -724,13 +750,68 @@ void MapWidget::AddLayers()
p->alertLayer_->AddLayers("colorTable"); p->alertLayer_->AddLayers("colorTable");
p->placefileLayer_ = std::make_shared<PlacefileLayer>(p->context_); p->UpdatePlacefileLayers();
p->AddLayer("placefile", p->placefileLayer_);
p->overlayLayer_ = std::make_shared<OverlayLayer>(p->context_); p->overlayLayer_ = std::make_shared<OverlayLayer>(p->context_);
p->AddLayer("overlay", p->overlayLayer_); p->AddLayer("overlay", p->overlayLayer_);
} }
void MapWidgetImpl::RemovePlacefileLayer(const std::string& placefileName)
{
std::string layerName = GetPlacefileLayerName(placefileName);
// Remove layer from map
map_->removeLayer(layerName.c_str());
// Remove layer from internal layer list
auto layerIt = std::find(layerList_.begin(), layerList_.end(), layerName);
if (layerIt != layerList_.end())
{
layerList_.erase(layerIt);
}
// Determine if a layer exists for the placefile
auto placefileIt =
std::find_if(placefileLayers_.begin(),
placefileLayers_.end(),
[&placefileName](auto& layer)
{ return placefileName == layer->placefile_name(); });
if (placefileIt != placefileLayers_.end())
{
placefileLayers_.erase(placefileIt);
}
}
void MapWidgetImpl::UpdatePlacefileLayers()
{
// Loop through enabled placefiles
for (auto& placefileName : enabledPlacefiles_)
{
// Determine if a layer exists for the placefile
auto it = std::find_if(placefileLayers_.begin(),
placefileLayers_.end(),
[&placefileName](auto& layer) {
return placefileName == layer->placefile_name();
});
// If the layer doesn't exist, create it
if (it == placefileLayers_.end())
{
std::shared_ptr<PlacefileLayer> placefileLayer =
std::make_shared<PlacefileLayer>(context_, placefileName);
placefileLayers_.push_back(placefileLayer);
AddLayer(
GetPlacefileLayerName(placefileName), placefileLayer, "colorTable");
}
}
}
std::string
MapWidgetImpl::GetPlacefileLayerName(const std::string& placefileName)
{
return fmt::format("placefile-{}", placefileName);
}
void MapWidgetImpl::AddLayer(const std::string& id, void MapWidgetImpl::AddLayer(const std::string& id,
std::shared_ptr<GenericLayer> layer, std::shared_ptr<GenericLayer> layer,
const std::string& before) const std::string& before)

View file

@ -24,12 +24,19 @@ static const auto logger_ = scwx::util::Logger::Create(logPrefix_);
class PlacefileLayer::Impl class PlacefileLayer::Impl
{ {
public: public:
explicit Impl(std::shared_ptr<MapContext> context) : explicit Impl(PlacefileLayer* self,
std::shared_ptr<MapContext> context,
const std::string& placefileName) :
self_ {self},
placefileName_ {placefileName},
placefileIcons_ {std::make_shared<gl::draw::PlacefileIcons>(context)} placefileIcons_ {std::make_shared<gl::draw::PlacefileIcons>(context)}
{ {
ConnectSignals();
} }
~Impl() = default; ~Impl() = default;
void ConnectSignals();
void void
RenderIconDrawItem(const QMapLibreGL::CustomLayerRenderParameters& params, RenderIconDrawItem(const QMapLibreGL::CustomLayerRenderParameters& params,
const std::shared_ptr<gr::Placefile::IconDrawItem>& di); const std::shared_ptr<gr::Placefile::IconDrawItem>& di);
@ -44,6 +51,11 @@ public:
float x, float x,
float y); float y);
PlacefileLayer* self_;
std::string placefileName_;
bool dirty_ {true};
std::uint32_t textId_ {}; std::uint32_t textId_ {};
glm::vec2 mapScreenCoordLocation_ {}; glm::vec2 mapScreenCoordLocation_ {};
float mapScale_ {1.0f}; float mapScale_ {1.0f};
@ -55,14 +67,43 @@ public:
std::shared_ptr<gl::draw::PlacefileIcons> placefileIcons_; std::shared_ptr<gl::draw::PlacefileIcons> placefileIcons_;
}; };
PlacefileLayer::PlacefileLayer(std::shared_ptr<MapContext> context) : PlacefileLayer::PlacefileLayer(std::shared_ptr<MapContext> context,
DrawLayer(context), p(std::make_unique<PlacefileLayer::Impl>(context)) const std::string& placefileName) :
DrawLayer(context),
p(std::make_unique<PlacefileLayer::Impl>(this, context, placefileName))
{ {
AddDrawItem(p->placefileIcons_); AddDrawItem(p->placefileIcons_);
} }
PlacefileLayer::~PlacefileLayer() = default; PlacefileLayer::~PlacefileLayer() = default;
void PlacefileLayer::Impl::ConnectSignals()
{
auto placefileManager = manager::PlacefileManager::Instance();
QObject::connect(placefileManager.get(),
&manager::PlacefileManager::PlacefileUpdated,
self_,
[this](const std::string& name)
{
if (name == placefileName_)
{
dirty_ = true;
}
});
}
std::string PlacefileLayer::placefile_name() const
{
return p->placefileName_;
}
void PlacefileLayer::set_placefile_name(const std::string& placefileName)
{
p->placefileName_ = placefileName;
p->dirty_ = true;
}
void PlacefileLayer::Initialize() void PlacefileLayer::Initialize()
{ {
logger_->debug("Initialize()"); logger_->debug("Initialize()");
@ -74,6 +115,11 @@ void PlacefileLayer::Impl::RenderIconDrawItem(
const QMapLibreGL::CustomLayerRenderParameters& params, const QMapLibreGL::CustomLayerRenderParameters& params,
const std::shared_ptr<gr::Placefile::IconDrawItem>& di) const std::shared_ptr<gr::Placefile::IconDrawItem>& di)
{ {
if (!dirty_)
{
return;
}
auto distance = auto distance =
(thresholded_) ? (thresholded_) ?
util::GeographicLib::GetDistance( util::GeographicLib::GetDistance(
@ -162,9 +208,6 @@ void PlacefileLayer::Render(
// Reset text ID per frame // Reset text ID per frame
p->textId_ = 0; p->textId_ = 0;
// Reset graphics
p->placefileIcons_->Reset();
// Update map screen coordinate and scale information // Update map screen coordinate and scale information
p->mapScreenCoordLocation_ = util::maplibre::LatLongToScreenCoordinate( p->mapScreenCoordLocation_ = util::maplibre::LatLongToScreenCoordinate(
{params.latitude, params.longitude}); {params.latitude, params.longitude});
@ -192,14 +235,21 @@ void PlacefileLayer::Render(
std::shared_ptr<manager::PlacefileManager> placefileManager = std::shared_ptr<manager::PlacefileManager> placefileManager =
manager::PlacefileManager::Instance(); manager::PlacefileManager::Instance();
// Render text auto placefile = placefileManager->placefile(p->placefileName_);
for (auto& placefile : placefileManager->GetActivePlacefiles())
// Render placefile
if (placefile != nullptr)
{ {
p->thresholded_ = p->thresholded_ =
placefileManager->placefile_thresholded(placefile->name()); placefileManager->placefile_thresholded(placefile->name());
p->placefileIcons_->SetIconFiles(placefile->icon_files(), if (p->dirty_)
placefile->name()); {
// Reset Placefile Icons
p->placefileIcons_->Reset();
p->placefileIcons_->SetIconFiles(placefile->icon_files(),
placefile->name());
}
for (auto& drawItem : placefile->GetDrawItems()) for (auto& drawItem : placefile->GetDrawItems())
{ {

View file

@ -2,6 +2,8 @@
#include <scwx/qt/map/draw_layer.hpp> #include <scwx/qt/map/draw_layer.hpp>
#include <string>
namespace scwx namespace scwx
{ {
namespace qt namespace qt
@ -12,9 +14,14 @@ namespace map
class PlacefileLayer : public DrawLayer class PlacefileLayer : public DrawLayer
{ {
public: public:
explicit PlacefileLayer(std::shared_ptr<MapContext> context); explicit PlacefileLayer(std::shared_ptr<MapContext> context,
const std::string& placefileName);
~PlacefileLayer(); ~PlacefileLayer();
std::string placefile_name() const;
void set_placefile_name(const std::string& placefileName);
void Initialize() override final; void Initialize() override final;
void Render(const QMapLibreGL::CustomLayerRenderParameters&) override final; void Render(const QMapLibreGL::CustomLayerRenderParameters&) override final;
void Deinitialize() override final; void Deinitialize() override final;