From cd55b235ad3756fe16f7913f01e5a823943f5e90 Mon Sep 17 00:00:00 2001
From: enricoturri1966 <enricoturri@seznam.cz>
Date: Wed, 18 Mar 2020 14:13:50 +0100
Subject: [PATCH] Canvas tooltip constrained inside canvas

---
 src/libslic3r/Technologies.hpp |  1 +
 src/slic3r/GUI/GLCanvas3D.cpp  | 23 +++++++++++++++++++++++
 2 files changed, 24 insertions(+)

diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp
index 3b8987930..ef1682cdb 100644
--- a/src/libslic3r/Technologies.hpp
+++ b/src/libslic3r/Technologies.hpp
@@ -68,6 +68,7 @@
 
 // Enable tooltips for GLCanvas3D using ImGUI
 #define ENABLE_CANVAS_TOOLTIP_USING_IMGUI (1 && ENABLE_2_2_0_FINAL)
+#define ENABLE_CANVAS_CONSTRAINED_TOOLTIP_USING_IMGUI (1 && ENABLE_2_2_0_FINAL)
 #define ENABLE_CANVAS_DELAYED_TOOLTIP_USING_IMGUI (1 && ENABLE_CANVAS_TOOLTIP_USING_IMGUI)
 
 
diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp
index e2e077655..87ac65061 100644
--- a/src/slic3r/GUI/GLCanvas3D.cpp
+++ b/src/slic3r/GUI/GLCanvas3D.cpp
@@ -1394,6 +1394,17 @@ void GLCanvas3D::Tooltip::render(const Vec2d& mouse_position, GLCanvas3D& canvas
 void GLCanvas3D::Tooltip::render(const Vec2d& mouse_position) const
 #endif // ENABLE_CANVAS_DELAYED_TOOLTIP_USING_IMGUI
 {
+#if ENABLE_CANVAS_CONSTRAINED_TOOLTIP_USING_IMGUI
+    static ImVec2 size(0.0f, 0.0f);
+
+    auto validate_position = [](const Vec2d& position, const GLCanvas3D& canvas, const ImVec2& wnd_size) {
+        Size cnv_size = canvas.get_canvas_size();
+        float x = std::clamp((float)position(0), 0.0f, (float)cnv_size.get_width() - wnd_size.x);
+        float y = std::clamp((float)position(1) + 16, 0.0f, (float)cnv_size.get_height() - wnd_size.y);
+        return Vec2f(x, y);
+    };
+#endif // ENABLE_CANVAS_CONSTRAINED_TOOLTIP_USING_IMGUI
+
 #if ENABLE_CANVAS_DELAYED_TOOLTIP_USING_IMGUI
     if (m_text.empty())
         return;
@@ -1405,12 +1416,20 @@ void GLCanvas3D::Tooltip::render(const Vec2d& mouse_position) const
         return;
 #endif // ENABLE_CANVAS_DELAYED_TOOLTIP_USING_IMGUI
 
+#if ENABLE_CANVAS_CONSTRAINED_TOOLTIP_USING_IMGUI
+    Vec2f position = validate_position(mouse_position, canvas, size);
+#endif // ENABLE_CANVAS_CONSTRAINED_TOOLTIP_USING_IMGUI
+
     ImGuiWrapper& imgui = *wxGetApp().imgui();
     ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f);
 #if ENABLE_CANVAS_DELAYED_TOOLTIP_USING_IMGUI
     ImGui::PushStyleVar(ImGuiStyleVar_Alpha, alpha);
 #endif // ENABLE_CANVAS_DELAYED_TOOLTIP_USING_IMGUI
+#if ENABLE_CANVAS_CONSTRAINED_TOOLTIP_USING_IMGUI
+    imgui.set_next_window_pos(position(0), position(1), ImGuiCond_Always, 0.0f, 0.0f);
+#else
     imgui.set_next_window_pos(mouse_position(0), mouse_position(1) + 16, ImGuiCond_Always, 0.0f, 0.0f);
+#endif // ENABLE_CANVAS_CONSTRAINED_TOOLTIP_USING_IMGUI
 
     imgui.begin(_(L("canvas_tooltip")), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoFocusOnAppearing);
     ImGui::BringWindowToDisplayFront(ImGui::GetCurrentWindow());
@@ -1422,6 +1441,10 @@ void GLCanvas3D::Tooltip::render(const Vec2d& mouse_position) const
         canvas.request_extra_frame();
 #endif // ENABLE_CANVAS_DELAYED_TOOLTIP_USING_IMGUI
 
+#if ENABLE_CANVAS_CONSTRAINED_TOOLTIP_USING_IMGUI
+    size = ImGui::GetWindowSize();
+#endif // ENABLE_CANVAS_CONSTRAINED_TOOLTIP_USING_IMGUI
+
     imgui.end();
 #if ENABLE_CANVAS_DELAYED_TOOLTIP_USING_IMGUI
     ImGui::PopStyleVar(2);