diff --git a/scwx-qt/source/scwx/qt/map/radar_product_layer.cpp b/scwx-qt/source/scwx/qt/map/radar_product_layer.cpp index 959d1455..76ad3385 100644 --- a/scwx-qt/source/scwx/qt/map/radar_product_layer.cpp +++ b/scwx-qt/source/scwx/qt/map/radar_product_layer.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include #include @@ -9,11 +10,14 @@ # pragma warning(push, 0) #endif +#include #include +#include #include #include #include #include +#include #if defined(_MSC_VER) # pragma warning(pop) @@ -323,6 +327,104 @@ void RadarProductLayer::Deinitialize() p->texture_ = GL_INVALID_INDEX; } +bool RadarProductLayer::RunMousePicking( + const QMapLibreGL::CustomLayerRenderParameters& /* params */, + const QPointF& /* mouseLocalPos */, + const QPointF& mouseGlobalPos, + const glm::vec2& /* mouseCoords */, + const common::Coordinate& mouseGeoCoords) +{ + bool itemPicked = false; + + if (QGuiApplication::keyboardModifiers() & + Qt::KeyboardModifier::ShiftModifier) + { + std::shared_ptr radarProductView = + context()->radar_product_view(); + + std::optional binLevel = + radarProductView->GetBinLevel(mouseGeoCoords); + + if (binLevel.has_value()) + { + // Hovering over a bin on the map + std::optional code = + radarProductView->GetDataLevelCode(binLevel.value()); + std::optional value = + radarProductView->GetDataValue(binLevel.value()); + + if (code.has_value() && code.value() != wsr88d::DataLevelCode::Blank) + { + // Level has associated data level code + std::string codeName = wsr88d::GetDataLevelCodeName(code.value()); + std::string codeShortName = + wsr88d::GetDataLevelCodeShortName(code.value()); + std::string hoverText; + + if (codeName != codeShortName && !codeShortName.empty()) + { + // There is a unique long and short name for the code + hoverText = fmt::format("{}: {}", codeShortName, codeName); + } + else + { + // Otherwise, only use the long name (always present) + hoverText = codeName; + } + + // Show the tooltip + util::tooltip::Show(hoverText, mouseGlobalPos); + + itemPicked = true; + } + else if (value.has_value()) + { + // Level has associated data value + float f = value.value(); + std::string units {}; + std::string hoverText; + + std::shared_ptr colorTable = + radarProductView->color_table(); + + if (colorTable != nullptr) + { + // Scale data value according to the color table, and get units + f = f * colorTable->scale() + colorTable->offset(); + units = colorTable->units(); + } + + if (units.empty() || // + units.starts_with("?") || // + boost::iequals(units, "NONE") || + boost::iequals(units, "UNITLESS")) + { + // Don't display a units value that wasn't intended to be + // displayed + hoverText = fmt::format("{}", f); + } + else if (std::isalpha(units.at(0))) + { + // dBZ, Kts, etc. + hoverText = fmt::format("{} {}", f, units); + } + else + { + // %, etc. + hoverText = fmt::format("{}{}", f, units); + } + + // Show the tooltip + util::tooltip::Show(hoverText, mouseGlobalPos); + + itemPicked = true; + } + } + } + + return itemPicked; +} + void RadarProductLayer::UpdateColorTable() { logger_->debug("UpdateColorTable()"); diff --git a/scwx-qt/source/scwx/qt/map/radar_product_layer.hpp b/scwx-qt/source/scwx/qt/map/radar_product_layer.hpp index f513c441..f39afac9 100644 --- a/scwx-qt/source/scwx/qt/map/radar_product_layer.hpp +++ b/scwx-qt/source/scwx/qt/map/radar_product_layer.hpp @@ -21,6 +21,13 @@ public: void Render(const QMapLibreGL::CustomLayerRenderParameters&) override final; void Deinitialize() override final; + virtual bool + RunMousePicking(const QMapLibreGL::CustomLayerRenderParameters& params, + const QPointF& mouseLocalPos, + const QPointF& mouseGlobalPos, + const glm::vec2& mouseCoords, + const common::Coordinate& mouseGeoCoords) override; + private: void UpdateColorTable(); void UpdateSweep();