diff --git a/scwx-qt/source/scwx/qt/map/map_widget.cpp b/scwx-qt/source/scwx/qt/map/map_widget.cpp index 1526daa7..c9428a8a 100644 --- a/scwx-qt/source/scwx/qt/map/map_widget.cpp +++ b/scwx-qt/source/scwx/qt/map/map_widget.cpp @@ -165,6 +165,8 @@ public: std::shared_ptr map_; std::list layerList_; + std::vector> 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( diff --git a/scwx-qt/source/scwx/qt/map/radar_site_layer.cpp b/scwx-qt/source/scwx/qt/map/radar_site_layer.cpp index 6350883a..dac18bfe 100644 --- a/scwx-qt/source/scwx/qt/map/radar_site_layer.cpp +++ b/scwx-qt/source/scwx/qt/map/radar_site_layer.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include #include @@ -21,12 +22,17 @@ static const auto logger_ = scwx::util::Logger::Create(logPrefix_); class RadarSiteLayer::Impl { public: - explicit Impl(std::shared_ptr context) {} + explicit Impl(RadarSiteLayer* self, std::shared_ptr context) : + self_ {self} + { + } ~Impl() = default; void RenderRadarSite(const QMapLibreGL::CustomLayerRenderParameters& params, std::shared_ptr& radarSite); + RadarSiteLayer* self_; + std::vector> 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 context) : - DrawLayer(context), p(std::make_unique(context)) + DrawLayer(context), p(std::make_unique(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; } diff --git a/scwx-qt/source/scwx/qt/map/radar_site_layer.hpp b/scwx-qt/source/scwx/qt/map/radar_site_layer.hpp index 20375297..639be3b6 100644 --- a/scwx-qt/source/scwx/qt/map/radar_site_layer.hpp +++ b/scwx-qt/source/scwx/qt/map/radar_site_layer.hpp @@ -11,6 +11,9 @@ namespace map class RadarSiteLayer : public DrawLayer { + Q_OBJECT + Q_DISABLE_COPY_MOVE(RadarSiteLayer) + public: explicit RadarSiteLayer(std::shared_ptr 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 p;