mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-31 06:40:05 +00:00 
			
		
		
		
	Display data values on the map when the shift key is held
This commit is contained in:
		
							parent
							
								
									9bb3e175f2
								
							
						
					
					
						commit
						b0c7413ef0
					
				
					 2 changed files with 109 additions and 0 deletions
				
			
		|  | @ -1,6 +1,7 @@ | |||
| #include <scwx/qt/map/radar_product_layer.hpp> | ||||
| #include <scwx/qt/gl/shader_program.hpp> | ||||
| #include <scwx/qt/util/maplibre.hpp> | ||||
| #include <scwx/qt/util/tooltip.hpp> | ||||
| #include <scwx/util/logger.hpp> | ||||
| 
 | ||||
| #include <execution> | ||||
|  | @ -9,11 +10,14 @@ | |||
| #   pragma warning(push, 0) | ||||
| #endif | ||||
| 
 | ||||
| #include <boost/algorithm/string.hpp> | ||||
| #include <boost/timer/timer.hpp> | ||||
| #include <fmt/format.h> | ||||
| #include <glm/glm.hpp> | ||||
| #include <glm/gtc/matrix_transform.hpp> | ||||
| #include <glm/gtc/type_ptr.hpp> | ||||
| #include <mbgl/util/constants.hpp> | ||||
| #include <QGuiApplication> | ||||
| 
 | ||||
| #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<view::RadarProductView> radarProductView = | ||||
|          context()->radar_product_view(); | ||||
| 
 | ||||
|       std::optional<std::uint16_t> binLevel = | ||||
|          radarProductView->GetBinLevel(mouseGeoCoords); | ||||
| 
 | ||||
|       if (binLevel.has_value()) | ||||
|       { | ||||
|          // Hovering over a bin on the map
 | ||||
|          std::optional<wsr88d::DataLevelCode> code = | ||||
|             radarProductView->GetDataLevelCode(binLevel.value()); | ||||
|          std::optional<float> 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<common::ColorTable> 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()"); | ||||
|  |  | |||
|  | @ -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(); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Dan Paulat
						Dan Paulat