mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-31 06:20:06 +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_buffer.hpp | ||||
|              source/scwx/qt/util/geographic_lib.hpp | ||||
|              source/scwx/qt/util/imgui.hpp | ||||
|              source/scwx/qt/util/json.hpp | ||||
|              source/scwx/qt/util/maplibre.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_buffer.cpp | ||||
|              source/scwx/qt/util/geographic_lib.cpp | ||||
|              source/scwx/qt/util/imgui.cpp | ||||
|              source/scwx/qt/util/json.cpp | ||||
|              source/scwx/qt/util/maplibre.cpp | ||||
|              source/scwx/qt/util/network.cpp | ||||
|  |  | |||
|  | @ -1,12 +1,9 @@ | |||
| #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/imgui.hpp> | ||||
| #include <scwx/qt/util/maplibre.hpp> | ||||
| #include <scwx/util/logger.hpp> | ||||
| 
 | ||||
| #include <imgui.h> | ||||
| 
 | ||||
| namespace scwx | ||||
| { | ||||
| namespace qt | ||||
|  | @ -238,61 +235,6 @@ void PlacefileLines::Deinitialize() | |||
|    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( | ||||
|    const QMapLibreGL::CustomLayerRenderParameters& params, | ||||
|    const glm::vec2&                                mousePos) | ||||
|  | @ -338,10 +280,10 @@ bool PlacefileLines::RunMousePicking( | |||
|       // TODO: X/Y offsets
 | ||||
| 
 | ||||
|       // Test point against polygon bounds
 | ||||
|       if (IsPointInPolygon({tl, bl, br, tr}, mousePos)) | ||||
|       if (util::maplibre::IsPointInPolygon({tl, bl, br, tr}, mousePos)) | ||||
|       { | ||||
|          itemPicked = true; | ||||
|          DrawTooltip(line.di_->hoverText_); | ||||
|          util::ImGui::Instance().DrawTooltip(line.di_->hoverText_); | ||||
|          break; | ||||
|       } | ||||
|    } | ||||
|  | @ -430,13 +372,11 @@ void PlacefileLines::Impl::UpdateBuffers( | |||
|    // For each element pair inside a Line statement, render a colored line
 | ||||
|    for (std::size_t i = 0; i < di->elements_.size() - 1; ++i) | ||||
|    { | ||||
|       auto angle = angles[i]; | ||||
| 
 | ||||
|       BufferLine(di, | ||||
|                  di->elements_[i], | ||||
|                  di->elements_[i + 1], | ||||
|                  di->width_, | ||||
|                  angle, | ||||
|                  angles[i], | ||||
|                  di->color_, | ||||
|                  thresholdValue); | ||||
|    } | ||||
|  |  | |||
|  | @ -1,6 +1,5 @@ | |||
| #include <scwx/qt/gl/draw/placefile_text.hpp> | ||||
| #include <scwx/qt/manager/resource_manager.hpp> | ||||
| #include <scwx/qt/manager/settings_manager.hpp> | ||||
| #include <scwx/qt/util/imgui.hpp> | ||||
| #include <scwx/qt/util/maplibre.hpp> | ||||
| #include <scwx/util/logger.hpp> | ||||
| 
 | ||||
|  | @ -54,7 +53,6 @@ public: | |||
|    float         mapBearingSin_ {0.0f}; | ||||
|    float         halfWidth_ {}; | ||||
|    float         halfHeight_ {}; | ||||
|    ImFont*       monospaceFont_ {}; | ||||
|    std::string   hoverText_ {}; | ||||
| 
 | ||||
|    units::length::nautical_miles<double> mapDistance_ {}; | ||||
|  | @ -108,22 +106,6 @@ void PlacefileText::Render( | |||
|       p->halfHeight_    = params.height * 0.5f; | ||||
|       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_) | ||||
|       { | ||||
|          p->RenderTextDrawItem(params, di); | ||||
|  | @ -219,12 +201,7 @@ bool PlacefileText::RunMousePicking( | |||
|    if (!p->hoverText_.empty()) | ||||
|    { | ||||
|       itemPicked = true; | ||||
| 
 | ||||
|       ImGui::BeginTooltip(); | ||||
|       ImGui::PushFont(p->monospaceFont_); | ||||
|       ImGui::TextUnformatted(p->hoverText_.c_str()); | ||||
|       ImGui::PopFont(); | ||||
|       ImGui::EndTooltip(); | ||||
|       util::ImGui::Instance().DrawTooltip(p->hoverText_); | ||||
|    } | ||||
| 
 | ||||
|    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}; | ||||
| } | ||||
| 
 | ||||
| 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) | ||||
| { | ||||
|    static constexpr double RAD2DEG_D = 180.0 / M_PI; | ||||
|  |  | |||
|  | @ -17,6 +17,18 @@ units::length::meters<double> | |||
| GetMapDistance(const QMapLibreGL::CustomLayerRenderParameters& params); | ||||
| glm::mat4 GetMapMatrix(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); | ||||
| 
 | ||||
| } // namespace maplibre
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Dan Paulat
						Dan Paulat