mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-31 06:40:05 +00:00 
			
		
		
		
	Refactoring map and ImGui functions from hover text
This commit is contained in:
		
							parent
							
								
									5bb5093579
								
							
						
					
					
						commit
						2c3de1a28f
					
				
					 7 changed files with 192 additions and 89 deletions
				
			
		|  | @ -210,6 +210,7 @@ set(HDR_UTIL source/scwx/qt/util/color.hpp | ||||||
|              source/scwx/qt/util/font.hpp |              source/scwx/qt/util/font.hpp | ||||||
|              source/scwx/qt/util/font_buffer.hpp |              source/scwx/qt/util/font_buffer.hpp | ||||||
|              source/scwx/qt/util/geographic_lib.hpp |              source/scwx/qt/util/geographic_lib.hpp | ||||||
|  |              source/scwx/qt/util/imgui.hpp | ||||||
|              source/scwx/qt/util/json.hpp |              source/scwx/qt/util/json.hpp | ||||||
|              source/scwx/qt/util/maplibre.hpp |              source/scwx/qt/util/maplibre.hpp | ||||||
|              source/scwx/qt/util/network.hpp |              source/scwx/qt/util/network.hpp | ||||||
|  | @ -223,6 +224,7 @@ set(SRC_UTIL source/scwx/qt/util/color.cpp | ||||||
|              source/scwx/qt/util/font.cpp |              source/scwx/qt/util/font.cpp | ||||||
|              source/scwx/qt/util/font_buffer.cpp |              source/scwx/qt/util/font_buffer.cpp | ||||||
|              source/scwx/qt/util/geographic_lib.cpp |              source/scwx/qt/util/geographic_lib.cpp | ||||||
|  |              source/scwx/qt/util/imgui.cpp | ||||||
|              source/scwx/qt/util/json.cpp |              source/scwx/qt/util/json.cpp | ||||||
|              source/scwx/qt/util/maplibre.cpp |              source/scwx/qt/util/maplibre.cpp | ||||||
|              source/scwx/qt/util/network.cpp |              source/scwx/qt/util/network.cpp | ||||||
|  |  | ||||||
|  | @ -1,12 +1,9 @@ | ||||||
| #include <scwx/qt/gl/draw/placefile_lines.hpp> | #include <scwx/qt/gl/draw/placefile_lines.hpp> | ||||||
| #include <scwx/qt/manager/resource_manager.hpp> |  | ||||||
| #include <scwx/qt/manager/settings_manager.hpp> |  | ||||||
| #include <scwx/qt/util/geographic_lib.hpp> | #include <scwx/qt/util/geographic_lib.hpp> | ||||||
|  | #include <scwx/qt/util/imgui.hpp> | ||||||
| #include <scwx/qt/util/maplibre.hpp> | #include <scwx/qt/util/maplibre.hpp> | ||||||
| #include <scwx/util/logger.hpp> | #include <scwx/util/logger.hpp> | ||||||
| 
 | 
 | ||||||
| #include <imgui.h> |  | ||||||
| 
 |  | ||||||
| namespace scwx | namespace scwx | ||||||
| { | { | ||||||
| namespace qt | namespace qt | ||||||
|  | @ -238,61 +235,6 @@ void PlacefileLines::Deinitialize() | ||||||
|    p->currentHoverLines_.clear(); |    p->currentHoverLines_.clear(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void DrawTooltip(const std::string& hoverText) |  | ||||||
| { |  | ||||||
|    // Get monospace font pointer
 |  | ||||||
|    std::size_t fontSize = 16; |  | ||||||
|    auto        fontSizes = |  | ||||||
|       manager::SettingsManager::general_settings().font_sizes().GetValue(); |  | ||||||
|    if (fontSizes.size() > 1) |  | ||||||
|    { |  | ||||||
|       fontSize = fontSizes[1]; |  | ||||||
|    } |  | ||||||
|    else if (fontSizes.size() > 0) |  | ||||||
|    { |  | ||||||
|       fontSize = fontSizes[0]; |  | ||||||
|    } |  | ||||||
|    auto monospace = |  | ||||||
|       manager::ResourceManager::Font(types::Font::Inconsolata_Regular); |  | ||||||
|    auto monospaceFont = monospace->ImGuiFont(fontSize); |  | ||||||
| 
 |  | ||||||
|    ImGui::BeginTooltip(); |  | ||||||
|    ImGui::PushFont(monospaceFont); |  | ||||||
|    ImGui::TextUnformatted(hoverText.c_str()); |  | ||||||
|    ImGui::PopFont(); |  | ||||||
|    ImGui::EndTooltip(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| bool IsPointInPolygon(const std::vector<glm::vec2> vertices, |  | ||||||
|                       const glm::vec2&             point) |  | ||||||
| { |  | ||||||
|    bool inPolygon = true; |  | ||||||
| 
 |  | ||||||
|    // For each vertex, assume counterclockwise order
 |  | ||||||
|    for (std::size_t i = 0; i < vertices.size(); ++i) |  | ||||||
|    { |  | ||||||
|       const auto& p1 = vertices[i]; |  | ||||||
|       const auto& p2 = |  | ||||||
|          (i == vertices.size() - 1) ? vertices[0] : vertices[i + 1]; |  | ||||||
| 
 |  | ||||||
|       // Test which side of edge point lies on
 |  | ||||||
|       const float a = -(p2.y - p1.y); |  | ||||||
|       const float b = p2.x - p1.x; |  | ||||||
|       const float c = -(a * p1.x + b * p1.y); |  | ||||||
|       const float d = a * point.x + b * point.y + c; |  | ||||||
| 
 |  | ||||||
|       // If d < 0, the point is on the right-hand side, and outside of the
 |  | ||||||
|       // polygon
 |  | ||||||
|       if (d < 0) |  | ||||||
|       { |  | ||||||
|          inPolygon = false; |  | ||||||
|          break; |  | ||||||
|       } |  | ||||||
|    } |  | ||||||
| 
 |  | ||||||
|    return inPolygon; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| bool PlacefileLines::RunMousePicking( | bool PlacefileLines::RunMousePicking( | ||||||
|    const QMapLibreGL::CustomLayerRenderParameters& params, |    const QMapLibreGL::CustomLayerRenderParameters& params, | ||||||
|    const glm::vec2&                                mousePos) |    const glm::vec2&                                mousePos) | ||||||
|  | @ -338,10 +280,10 @@ bool PlacefileLines::RunMousePicking( | ||||||
|       // TODO: X/Y offsets
 |       // TODO: X/Y offsets
 | ||||||
| 
 | 
 | ||||||
|       // Test point against polygon bounds
 |       // Test point against polygon bounds
 | ||||||
|       if (IsPointInPolygon({tl, bl, br, tr}, mousePos)) |       if (util::maplibre::IsPointInPolygon({tl, bl, br, tr}, mousePos)) | ||||||
|       { |       { | ||||||
|          itemPicked = true; |          itemPicked = true; | ||||||
|          DrawTooltip(line.di_->hoverText_); |          util::ImGui::Instance().DrawTooltip(line.di_->hoverText_); | ||||||
|          break; |          break; | ||||||
|       } |       } | ||||||
|    } |    } | ||||||
|  | @ -430,13 +372,11 @@ void PlacefileLines::Impl::UpdateBuffers( | ||||||
|    // For each element pair inside a Line statement, render a colored line
 |    // For each element pair inside a Line statement, render a colored line
 | ||||||
|    for (std::size_t i = 0; i < di->elements_.size() - 1; ++i) |    for (std::size_t i = 0; i < di->elements_.size() - 1; ++i) | ||||||
|    { |    { | ||||||
|       auto angle = angles[i]; |  | ||||||
| 
 |  | ||||||
|       BufferLine(di, |       BufferLine(di, | ||||||
|                  di->elements_[i], |                  di->elements_[i], | ||||||
|                  di->elements_[i + 1], |                  di->elements_[i + 1], | ||||||
|                  di->width_, |                  di->width_, | ||||||
|                  angle, |                  angles[i], | ||||||
|                  di->color_, |                  di->color_, | ||||||
|                  thresholdValue); |                  thresholdValue); | ||||||
|    } |    } | ||||||
|  |  | ||||||
|  | @ -1,6 +1,5 @@ | ||||||
| #include <scwx/qt/gl/draw/placefile_text.hpp> | #include <scwx/qt/gl/draw/placefile_text.hpp> | ||||||
| #include <scwx/qt/manager/resource_manager.hpp> | #include <scwx/qt/util/imgui.hpp> | ||||||
| #include <scwx/qt/manager/settings_manager.hpp> |  | ||||||
| #include <scwx/qt/util/maplibre.hpp> | #include <scwx/qt/util/maplibre.hpp> | ||||||
| #include <scwx/util/logger.hpp> | #include <scwx/util/logger.hpp> | ||||||
| 
 | 
 | ||||||
|  | @ -54,7 +53,6 @@ public: | ||||||
|    float         mapBearingSin_ {0.0f}; |    float         mapBearingSin_ {0.0f}; | ||||||
|    float         halfWidth_ {}; |    float         halfWidth_ {}; | ||||||
|    float         halfHeight_ {}; |    float         halfHeight_ {}; | ||||||
|    ImFont*       monospaceFont_ {}; |  | ||||||
|    std::string   hoverText_ {}; |    std::string   hoverText_ {}; | ||||||
| 
 | 
 | ||||||
|    units::length::nautical_miles<double> mapDistance_ {}; |    units::length::nautical_miles<double> mapDistance_ {}; | ||||||
|  | @ -108,22 +106,6 @@ void PlacefileText::Render( | ||||||
|       p->halfHeight_    = params.height * 0.5f; |       p->halfHeight_    = params.height * 0.5f; | ||||||
|       p->mapDistance_   = util::maplibre::GetMapDistance(params); |       p->mapDistance_   = util::maplibre::GetMapDistance(params); | ||||||
| 
 | 
 | ||||||
|       // Get monospace font pointer
 |  | ||||||
|       std::size_t fontSize = 16; |  | ||||||
|       auto        fontSizes = |  | ||||||
|          manager::SettingsManager::general_settings().font_sizes().GetValue(); |  | ||||||
|       if (fontSizes.size() > 1) |  | ||||||
|       { |  | ||||||
|          fontSize = fontSizes[1]; |  | ||||||
|       } |  | ||||||
|       else if (fontSizes.size() > 0) |  | ||||||
|       { |  | ||||||
|          fontSize = fontSizes[0]; |  | ||||||
|       } |  | ||||||
|       auto monospace = |  | ||||||
|          manager::ResourceManager::Font(types::Font::Inconsolata_Regular); |  | ||||||
|       p->monospaceFont_ = monospace->ImGuiFont(fontSize); |  | ||||||
| 
 |  | ||||||
|       for (auto& di : p->textList_) |       for (auto& di : p->textList_) | ||||||
|       { |       { | ||||||
|          p->RenderTextDrawItem(params, di); |          p->RenderTextDrawItem(params, di); | ||||||
|  | @ -219,12 +201,7 @@ bool PlacefileText::RunMousePicking( | ||||||
|    if (!p->hoverText_.empty()) |    if (!p->hoverText_.empty()) | ||||||
|    { |    { | ||||||
|       itemPicked = true; |       itemPicked = true; | ||||||
| 
 |       util::ImGui::Instance().DrawTooltip(p->hoverText_); | ||||||
|       ImGui::BeginTooltip(); |  | ||||||
|       ImGui::PushFont(p->monospaceFont_); |  | ||||||
|       ImGui::TextUnformatted(p->hoverText_.c_str()); |  | ||||||
|       ImGui::PopFont(); |  | ||||||
|       ImGui::EndTooltip(); |  | ||||||
|    } |    } | ||||||
| 
 | 
 | ||||||
|    return itemPicked; |    return itemPicked; | ||||||
|  |  | ||||||
							
								
								
									
										105
									
								
								scwx-qt/source/scwx/qt/util/imgui.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								scwx-qt/source/scwx/qt/util/imgui.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,105 @@ | ||||||
|  | #include <scwx/qt/util/imgui.hpp> | ||||||
|  | #include <scwx/qt/manager/resource_manager.hpp> | ||||||
|  | #include <scwx/qt/manager/settings_manager.hpp> | ||||||
|  | #include <scwx/util/logger.hpp> | ||||||
|  | 
 | ||||||
|  | #include <mutex> | ||||||
|  | 
 | ||||||
|  | #include <imgui.h> | ||||||
|  | 
 | ||||||
|  | namespace scwx | ||||||
|  | { | ||||||
|  | namespace qt | ||||||
|  | { | ||||||
|  | namespace util | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | static const std::string logPrefix_ = "scwx::qt::util::imgui"; | ||||||
|  | static const auto        logger_    = scwx::util::Logger::Create(logPrefix_); | ||||||
|  | 
 | ||||||
|  | class ImGui::Impl | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |    explicit Impl() {} | ||||||
|  |    ~Impl() {} | ||||||
|  | 
 | ||||||
|  |    void Initialize(); | ||||||
|  |    void UpdateMonospaceFont(); | ||||||
|  | 
 | ||||||
|  |    bool initialized_ {false}; | ||||||
|  | 
 | ||||||
|  |    ImFont* monospaceFont_ {nullptr}; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | ImGui::ImGui() : p(std::make_unique<Impl>()) {} | ||||||
|  | ImGui::~ImGui() = default; | ||||||
|  | 
 | ||||||
|  | ImGui::ImGui(ImGui&&) noexcept            = default; | ||||||
|  | ImGui& ImGui::operator=(ImGui&&) noexcept = default; | ||||||
|  | 
 | ||||||
|  | void ImGui::Impl::Initialize() | ||||||
|  | { | ||||||
|  |    if (initialized_) | ||||||
|  |    { | ||||||
|  |       return; | ||||||
|  |    } | ||||||
|  | 
 | ||||||
|  |    logger_->debug("Initialize"); | ||||||
|  | 
 | ||||||
|  |    // Configure monospace font
 | ||||||
|  |    UpdateMonospaceFont(); | ||||||
|  |    manager::SettingsManager::general_settings() | ||||||
|  |       .font_sizes() | ||||||
|  |       .RegisterValueChangedCallback([this](const std::vector<std::int64_t>&) | ||||||
|  |                                     { UpdateMonospaceFont(); }); | ||||||
|  | 
 | ||||||
|  |    initialized_ = true; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void ImGui::Impl::UpdateMonospaceFont() | ||||||
|  | { | ||||||
|  |    // Get monospace font size
 | ||||||
|  |    std::size_t fontSize = 16; | ||||||
|  |    auto        fontSizes = | ||||||
|  |       manager::SettingsManager::general_settings().font_sizes().GetValue(); | ||||||
|  |    if (fontSizes.size() > 1) | ||||||
|  |    { | ||||||
|  |       fontSize = fontSizes[1]; | ||||||
|  |    } | ||||||
|  |    else if (fontSizes.size() > 0) | ||||||
|  |    { | ||||||
|  |       fontSize = fontSizes[0]; | ||||||
|  |    } | ||||||
|  | 
 | ||||||
|  |    // Get monospace font pointer
 | ||||||
|  |    auto monospace = | ||||||
|  |       manager::ResourceManager::Font(types::Font::Inconsolata_Regular); | ||||||
|  |    auto monospaceFont = monospace->ImGuiFont(fontSize); | ||||||
|  | 
 | ||||||
|  |    // Store monospace font pointer if not null
 | ||||||
|  |    if (monospaceFont != nullptr) | ||||||
|  |    { | ||||||
|  |       monospaceFont_ = monospace->ImGuiFont(fontSize); | ||||||
|  |    } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void ImGui::DrawTooltip(const std::string& hoverText) | ||||||
|  | { | ||||||
|  |    p->Initialize(); | ||||||
|  | 
 | ||||||
|  |    ::ImGui::BeginTooltip(); | ||||||
|  |    ::ImGui::PushFont(p->monospaceFont_); | ||||||
|  |    ::ImGui::TextUnformatted(hoverText.c_str()); | ||||||
|  |    ::ImGui::PopFont(); | ||||||
|  |    ::ImGui::EndTooltip(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | ImGui& ImGui::Instance() | ||||||
|  | { | ||||||
|  |    static ImGui instance_ {}; | ||||||
|  |    return instance_; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | } // namespace util
 | ||||||
|  | } // namespace qt
 | ||||||
|  | } // namespace scwx
 | ||||||
							
								
								
									
										37
									
								
								scwx-qt/source/scwx/qt/util/imgui.hpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								scwx-qt/source/scwx/qt/util/imgui.hpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,37 @@ | ||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #include <memory> | ||||||
|  | #include <string> | ||||||
|  | 
 | ||||||
|  | namespace scwx | ||||||
|  | { | ||||||
|  | namespace qt | ||||||
|  | { | ||||||
|  | namespace util | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | class ImGui | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |    explicit ImGui(); | ||||||
|  |    ~ImGui(); | ||||||
|  | 
 | ||||||
|  |    ImGui(const ImGui&)            = delete; | ||||||
|  |    ImGui& operator=(const ImGui&) = delete; | ||||||
|  | 
 | ||||||
|  |    ImGui(ImGui&&) noexcept; | ||||||
|  |    ImGui& operator=(ImGui&&) noexcept; | ||||||
|  | 
 | ||||||
|  |    void DrawTooltip(const std::string& hoverText); | ||||||
|  | 
 | ||||||
|  |    static ImGui& Instance(); | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  |    class Impl; | ||||||
|  | 
 | ||||||
|  |    std::unique_ptr<Impl> p; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | } // namespace util
 | ||||||
|  | } // namespace qt
 | ||||||
|  | } // namespace scwx
 | ||||||
|  | @ -43,6 +43,36 @@ glm::vec2 GetMapScale(const QMapLibreGL::CustomLayerRenderParameters& params) | ||||||
|    return glm::vec2 {xScale, yScale}; |    return glm::vec2 {xScale, yScale}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | bool IsPointInPolygon(const std::vector<glm::vec2>& vertices, | ||||||
|  |                       const glm::vec2&              point) | ||||||
|  | { | ||||||
|  |    bool inPolygon = true; | ||||||
|  | 
 | ||||||
|  |    // For each vertex, assume counterclockwise order
 | ||||||
|  |    for (std::size_t i = 0; i < vertices.size(); ++i) | ||||||
|  |    { | ||||||
|  |       const auto& p1 = vertices[i]; | ||||||
|  |       const auto& p2 = | ||||||
|  |          (i == vertices.size() - 1) ? vertices[0] : vertices[i + 1]; | ||||||
|  | 
 | ||||||
|  |       // Test which side of edge point lies on
 | ||||||
|  |       const float a = -(p2.y - p1.y); | ||||||
|  |       const float b = p2.x - p1.x; | ||||||
|  |       const float c = -(a * p1.x + b * p1.y); | ||||||
|  |       const float d = a * point.x + b * point.y + c; | ||||||
|  | 
 | ||||||
|  |       // If d < 0, the point is on the right-hand side, and outside of the
 | ||||||
|  |       // polygon
 | ||||||
|  |       if (d < 0) | ||||||
|  |       { | ||||||
|  |          inPolygon = false; | ||||||
|  |          break; | ||||||
|  |       } | ||||||
|  |    } | ||||||
|  | 
 | ||||||
|  |    return inPolygon; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| glm::vec2 LatLongToScreenCoordinate(const QMapLibreGL::Coordinate& coordinate) | glm::vec2 LatLongToScreenCoordinate(const QMapLibreGL::Coordinate& coordinate) | ||||||
| { | { | ||||||
|    static constexpr double RAD2DEG_D = 180.0 / M_PI; |    static constexpr double RAD2DEG_D = 180.0 / M_PI; | ||||||
|  |  | ||||||
|  | @ -17,6 +17,18 @@ units::length::meters<double> | ||||||
| GetMapDistance(const QMapLibreGL::CustomLayerRenderParameters& params); | GetMapDistance(const QMapLibreGL::CustomLayerRenderParameters& params); | ||||||
| glm::mat4 GetMapMatrix(const QMapLibreGL::CustomLayerRenderParameters& params); | glm::mat4 GetMapMatrix(const QMapLibreGL::CustomLayerRenderParameters& params); | ||||||
| glm::vec2 GetMapScale(const QMapLibreGL::CustomLayerRenderParameters& params); | glm::vec2 GetMapScale(const QMapLibreGL::CustomLayerRenderParameters& params); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief Determine whether a point lies within a polygon | ||||||
|  |  * | ||||||
|  |  * @param [in] vertices Counterclockwise vertices | ||||||
|  |  * @param [in] point Point to test | ||||||
|  |  * | ||||||
|  |  * @return Whether the point lies within the polygon | ||||||
|  |  */ | ||||||
|  | bool IsPointInPolygon(const std::vector<glm::vec2>& vertices, | ||||||
|  |                       const glm::vec2&              point); | ||||||
|  | 
 | ||||||
| glm::vec2 LatLongToScreenCoordinate(const QMapLibreGL::Coordinate& coordinate); | glm::vec2 LatLongToScreenCoordinate(const QMapLibreGL::Coordinate& coordinate); | ||||||
| 
 | 
 | ||||||
| } // namespace maplibre
 | } // namespace maplibre
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Dan Paulat
						Dan Paulat