diff --git a/scwx-qt/scwx-qt.cmake b/scwx-qt/scwx-qt.cmake index 6557e6ca..6975be3f 100644 --- a/scwx-qt/scwx-qt.cmake +++ b/scwx-qt/scwx-qt.cmake @@ -224,7 +224,8 @@ set(HDR_UTIL source/scwx/qt/util/color.hpp source/scwx/qt/util/texture_atlas.hpp source/scwx/qt/util/q_file_buffer.hpp source/scwx/qt/util/q_file_input_stream.hpp - source/scwx/qt/util/time.hpp) + source/scwx/qt/util/time.hpp + source/scwx/qt/util/tooltip.hpp) set(SRC_UTIL source/scwx/qt/util/color.cpp source/scwx/qt/util/file.cpp source/scwx/qt/util/font.cpp @@ -237,7 +238,8 @@ set(SRC_UTIL source/scwx/qt/util/color.cpp source/scwx/qt/util/texture_atlas.cpp source/scwx/qt/util/q_file_buffer.cpp source/scwx/qt/util/q_file_input_stream.cpp - source/scwx/qt/util/time.cpp) + source/scwx/qt/util/time.cpp + source/scwx/qt/util/tooltip.cpp) set(HDR_VIEW source/scwx/qt/view/level2_product_view.hpp source/scwx/qt/view/level3_product_view.hpp source/scwx/qt/view/level3_radial_view.hpp diff --git a/scwx-qt/source/scwx/qt/gl/draw/placefile_icons.cpp b/scwx-qt/source/scwx/qt/gl/draw/placefile_icons.cpp index 937c2e43..7c29a771 100644 --- a/scwx-qt/source/scwx/qt/gl/draw/placefile_icons.cpp +++ b/scwx-qt/source/scwx/qt/gl/draw/placefile_icons.cpp @@ -1,7 +1,7 @@ #include -#include #include #include +#include #include #include @@ -685,7 +685,7 @@ void PlacefileIcons::Impl::Update(bool textureAtlasChanged) bool PlacefileIcons::RunMousePicking( const QMapLibreGL::CustomLayerRenderParameters& params, const QPointF& /* mouseLocalPos */, - const QPointF& /* mouseGlobalPos */, + const QPointF& mouseGlobalPos, const glm::vec2& mouseCoords) { std::unique_lock lock {p->iconMutex_}; @@ -774,7 +774,7 @@ bool PlacefileIcons::RunMousePicking( if (it != p->currentHoverIcons_.crend()) { itemPicked = true; - util::ImGui::Instance().DrawTooltip(it->di_->hoverText_); + util::tooltip::Show(it->di_->hoverText_, mouseGlobalPos); } return itemPicked; diff --git a/scwx-qt/source/scwx/qt/gl/draw/placefile_lines.cpp b/scwx-qt/source/scwx/qt/gl/draw/placefile_lines.cpp index e1a16481..df0eff48 100644 --- a/scwx-qt/source/scwx/qt/gl/draw/placefile_lines.cpp +++ b/scwx-qt/source/scwx/qt/gl/draw/placefile_lines.cpp @@ -1,7 +1,7 @@ #include #include -#include #include +#include #include #include @@ -498,7 +498,7 @@ void PlacefileLines::Impl::Update() bool PlacefileLines::RunMousePicking( const QMapLibreGL::CustomLayerRenderParameters& params, const QPointF& /* mouseLocalPos */, - const QPointF& /* mouseGlobalPos */, + const QPointF& mouseGlobalPos, const glm::vec2& mouseCoords) { std::unique_lock lock {p->lineMutex_}; @@ -589,7 +589,7 @@ bool PlacefileLines::RunMousePicking( if (it != p->currentHoverLines_.crend()) { itemPicked = true; - util::ImGui::Instance().DrawTooltip(it->di_->hoverText_); + util::tooltip::Show(it->di_->hoverText_, mouseGlobalPos); } return itemPicked; diff --git a/scwx-qt/source/scwx/qt/gl/draw/placefile_text.cpp b/scwx-qt/source/scwx/qt/gl/draw/placefile_text.cpp index d8340575..18f2efee 100644 --- a/scwx-qt/source/scwx/qt/gl/draw/placefile_text.cpp +++ b/scwx-qt/source/scwx/qt/gl/draw/placefile_text.cpp @@ -1,6 +1,6 @@ #include -#include #include +#include #include #include @@ -210,7 +210,7 @@ void PlacefileText::Deinitialize() bool PlacefileText::RunMousePicking( const QMapLibreGL::CustomLayerRenderParameters& /* params */, const QPointF& /* mouseLocalPos */, - const QPointF& /* mouseGlobalPos */, + const QPointF& mouseGlobalPos, const glm::vec2& /* mouseCoords */) { bool itemPicked = false; @@ -219,7 +219,7 @@ bool PlacefileText::RunMousePicking( if (!p->hoverText_.empty()) { itemPicked = true; - util::ImGui::Instance().DrawTooltip(p->hoverText_); + util::tooltip::Show(p->hoverText_, mouseGlobalPos); } return itemPicked; diff --git a/scwx-qt/source/scwx/qt/map/map_widget.cpp b/scwx-qt/source/scwx/qt/map/map_widget.cpp index 6b0b46a0..a1cb05aa 100644 --- a/scwx-qt/source/scwx/qt/map/map_widget.cpp +++ b/scwx-qt/source/scwx/qt/map/map_widget.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -1062,6 +1063,7 @@ void MapWidgetImpl::RunMousePicking() // 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) { @@ -1070,9 +1072,16 @@ void MapWidgetImpl::RunMousePicking() params, lastPos_, lastGlobalPos_, mouseScreenCoordinate)) { // If a draw item was picked, don't process additional layers + itemPicked = true; break; } } + + // If no draw item was picked, hide the tooltip + if (!itemPicked) + { + util::tooltip::Hide(); + } } void MapWidget::mapChanged(QMapLibreGL::Map::MapChange mapChange) diff --git a/scwx-qt/source/scwx/qt/util/imgui.cpp b/scwx-qt/source/scwx/qt/util/imgui.cpp index c31f22b0..9d1622ed 100644 --- a/scwx-qt/source/scwx/qt/util/imgui.cpp +++ b/scwx-qt/source/scwx/qt/util/imgui.cpp @@ -1,12 +1,10 @@ #include #include #include -#include #include #include -#include #include namespace scwx @@ -89,23 +87,9 @@ void ImGui::DrawTooltip(const std::string& hoverText) { p->Initialize(); - std::size_t textWidth = static_cast( - settings::TextSettings::Instance().hover_text_wrap().GetValue()); - - // Wrap text if enabled - std::string wrappedText {}; - if (textWidth > 0) - { - wrappedText = TextFlow::Column(hoverText).width(textWidth).toString(); - } - - // Display text is either wrapped or unwrapped text (do this to avoid copy - // when not wrapping) - const std::string& displayText = (textWidth > 0) ? wrappedText : hoverText; - ::ImGui::BeginTooltip(); ::ImGui::PushFont(p->monospaceFont_); - ::ImGui::TextUnformatted(displayText.c_str()); + ::ImGui::TextUnformatted(hoverText.c_str()); ::ImGui::PopFont(); ::ImGui::EndTooltip(); } diff --git a/scwx-qt/source/scwx/qt/util/tooltip.cpp b/scwx-qt/source/scwx/qt/util/tooltip.cpp new file mode 100644 index 00000000..fd1b7b0d --- /dev/null +++ b/scwx-qt/source/scwx/qt/util/tooltip.cpp @@ -0,0 +1,42 @@ +#include +#include +#include + +#include + +namespace scwx +{ +namespace qt +{ +namespace util +{ +namespace tooltip +{ + +static const std::string logPrefix_ = "scwx::qt::util::tooltip"; + +void Show(const std::string& text, const QPointF& /* mouseGlobalPos */) +{ + std::size_t textWidth = static_cast( + settings::TextSettings::Instance().hover_text_wrap().GetValue()); + + // Wrap text if enabled + std::string wrappedText {}; + if (textWidth > 0) + { + wrappedText = TextFlow::Column(text).width(textWidth).toString(); + } + + // Display text is either wrapped or unwrapped text (do this to avoid copy + // when not wrapping) + const std::string& displayText = (textWidth > 0) ? wrappedText : text; + + util::ImGui::Instance().DrawTooltip(displayText); +} + +void Hide() {} + +} // namespace tooltip +} // namespace util +} // namespace qt +} // namespace scwx diff --git a/scwx-qt/source/scwx/qt/util/tooltip.hpp b/scwx-qt/source/scwx/qt/util/tooltip.hpp new file mode 100644 index 00000000..83c5b146 --- /dev/null +++ b/scwx-qt/source/scwx/qt/util/tooltip.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include + +#include + +namespace scwx +{ +namespace qt +{ +namespace util +{ +namespace tooltip +{ + +void Show(const std::string& text, const QPointF& mouseGlobalPos); +void Hide(); + +} // namespace tooltip +} // namespace util +} // namespace qt +} // namespace scwx