Radar site buttons, styling and hover

This commit is contained in:
Dan Paulat 2023-11-20 20:49:07 -06:00
parent 798dc479f0
commit de2e1fea3f
3 changed files with 46 additions and 9 deletions

View file

@ -165,6 +165,8 @@ public:
std::shared_ptr<QMapLibreGL::Map> map_;
std::list<std::string> layerList_;
std::vector<std::shared_ptr<GenericLayer>> genericLayers_ {};
QStringList styleLayers_;
types::LayerVector customLayers_;
@ -802,6 +804,7 @@ void MapWidgetImpl::AddLayers()
map_->removeLayer(id.c_str());
}
layerList_.clear();
genericLayers_.clear();
placefileLayers_.clear();
// Update custom layer list from model
@ -961,6 +964,7 @@ void MapWidgetImpl::AddLayer(const std::string& id,
map_->addCustomLayer(id.c_str(), std::move(pHost), before.c_str());
layerList_.push_back(id);
genericLayers_.push_back(layer);
}
catch (const std::exception&)
{
@ -1206,10 +1210,8 @@ void MapWidgetImpl::RunMousePicking()
util::maplibre::LatLongToScreenCoordinate(coordinate);
// For each layer in reverse
// TODO: All Generic Layers, not just Placefile Layers
bool itemPicked = false;
for (auto it = placefileLayers_.rbegin(); it != placefileLayers_.rend();
++it)
for (auto it = genericLayers_.rbegin(); it != genericLayers_.rend(); ++it)
{
// Run mouse picking for each layer
if ((*it)->RunMousePicking(

View file

@ -1,6 +1,7 @@
#include <scwx/qt/map/radar_site_layer.hpp>
#include <scwx/qt/config/radar_site.hpp>
#include <scwx/qt/util/maplibre.hpp>
#include <scwx/qt/util/tooltip.hpp>
#include <scwx/common/geographic.hpp>
#include <scwx/util/logger.hpp>
@ -21,12 +22,17 @@ static const auto logger_ = scwx::util::Logger::Create(logPrefix_);
class RadarSiteLayer::Impl
{
public:
explicit Impl(std::shared_ptr<MapContext> context) {}
explicit Impl(RadarSiteLayer* self, std::shared_ptr<MapContext> context) :
self_ {self}
{
}
~Impl() = default;
void RenderRadarSite(const QMapLibreGL::CustomLayerRenderParameters& params,
std::shared_ptr<config::RadarSite>& radarSite);
RadarSiteLayer* self_;
std::vector<std::shared_ptr<config::RadarSite>> radarSites_ {};
glm::vec2 mapScreenCoordLocation_ {};
@ -35,10 +41,12 @@ public:
float mapBearingSin_ {0.0f};
float halfWidth_ {};
float halfHeight_ {};
std::string hoverText_ {};
};
RadarSiteLayer::RadarSiteLayer(std::shared_ptr<MapContext> context) :
DrawLayer(context), p(std::make_unique<Impl>(context))
DrawLayer(context), p(std::make_unique<Impl>(this, context))
{
}
@ -68,11 +76,18 @@ void RadarSiteLayer::Render(
p->halfWidth_ = params.width * 0.5f;
p->halfHeight_ = params.height * 0.5f;
p->hoverText_.clear();
// Radar site ImGui windows shouldn't have padding
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2 {0.0f, 0.0f});
for (auto& radarSite : p->radarSites_)
{
p->RenderRadarSite(params, radarSite);
}
ImGui::PopStyleVar();
SCWX_GL_CHECK_ERROR();
}
@ -112,12 +127,21 @@ void RadarSiteLayer::Impl::RenderRadarSite(
ImGuiWindowFlags_AlwaysAutoResize))
{
// Render text
ImGui::TextUnformatted(radarSite->id().c_str());
if (ImGui::Button(radarSite->id().c_str()))
{
Q_EMIT self_->RadarSiteSelected(radarSite->id());
}
// Store hover text for mouse picking pass
if (ImGui::IsItemHovered())
{
// TODO
hoverText_ =
fmt::format("{} ({})\n{}\n{}, {}",
radarSite->id(),
radarSite->type_name(),
radarSite->location_name(),
common::GetLatitudeString(radarSite->latitude()),
common::GetLongitudeString(radarSite->longitude()));
}
// End window
@ -135,10 +159,15 @@ void RadarSiteLayer::Deinitialize()
bool RadarSiteLayer::RunMousePicking(
const QMapLibreGL::CustomLayerRenderParameters& /* params */,
const QPointF& /* mouseLocalPos */,
const QPointF& /* mouseGlobalPos */,
const QPointF& mouseGlobalPos,
const glm::vec2& /* mouseCoords */)
{
// TODO
if (!p->hoverText_.empty())
{
util::tooltip::Show(p->hoverText_, mouseGlobalPos);
return true;
}
return false;
}

View file

@ -11,6 +11,9 @@ namespace map
class RadarSiteLayer : public DrawLayer
{
Q_OBJECT
Q_DISABLE_COPY_MOVE(RadarSiteLayer)
public:
explicit RadarSiteLayer(std::shared_ptr<MapContext> context);
~RadarSiteLayer();
@ -24,6 +27,9 @@ public:
const QPointF& mouseGlobalPos,
const glm::vec2& mouseCoords) override final;
signals:
void RadarSiteSelected(const std::string& id);
private:
class Impl;
std::unique_ptr<Impl> p;