From cd55b235ad3756fe16f7913f01e5a823943f5e90 Mon Sep 17 00:00:00 2001 From: enricoturri1966 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);