From 22891acc07a45d558c9a9cb76965d96a8658af0c Mon Sep 17 00:00:00 2001 From: Filip Sykala - NTB T15p Date: Mon, 5 Dec 2022 15:20:56 +0100 Subject: [PATCH] Lock emboss text window position --- src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp | 83 ++++++++++++++----------- src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp | 11 ++-- 2 files changed, 51 insertions(+), 43 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp b/src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp index 8a9a51c983..6d89132b08 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp @@ -54,7 +54,7 @@ #define SHOW_ICONS_TEXTURE #define SHOW_FINE_POSITION // draw convex hull around volume #define SHOW_WX_WEIGHT_INPUT -#define DRAW_PLACE_TO_ADD_TEXT +#define DRAW_PLACE_TO_ADD_TEXT // Interactive draw of window position #endif // ALLOW_DEBUG_MODE using namespace Slic3r; @@ -681,7 +681,7 @@ void GLGizmoEmboss::on_render_input_window(float x, float y, float bottom_limit) if (m_volume == nullptr || !m_volume->text_configuration.has_value()) { close(); return; - } + } // TODO: fix width - showing scroll in first draw of advanced. const ImVec2 &min_window_size = get_minimal_window_size(); @@ -697,13 +697,19 @@ void GLGizmoEmboss::on_render_input_window(float x, float y, float bottom_limit) draw_mouse_offset(m_dragging_mouse_offset); #endif // SHOW_OFFSET_DURING_DRAGGING - // check if is set window offset - if (m_set_window_offset.has_value()) { - ImGui::SetNextWindowPos(*m_set_window_offset, ImGuiCond_Always); - m_set_window_offset.reset(); + ImGuiWindowFlags flag = ImGuiWindowFlags_NoCollapse; + if (m_allow_float_window){ + // check if is set window offset + if (m_set_window_offset.has_value()) { + ImGui::SetNextWindowPos(*m_set_window_offset, ImGuiCond_Always); + m_set_window_offset.reset(); + } + } else { + flag |= ImGuiWindowFlags_NoMove; + y = std::min(y, bottom_limit - min_window_size.y); + ImGui::SetNextWindowPos(ImVec2(x, y), ImGuiCond_Always); } - ImGuiWindowFlags flag = ImGuiWindowFlags_NoCollapse; if (ImGui::Begin(on_get_name().c_str(), nullptr, flag)) { // Need to pop var before draw window ImGui::PopStyleVar(); // WindowMinSize @@ -714,6 +720,29 @@ void GLGizmoEmboss::on_render_input_window(float x, float y, float bottom_limit) ImGui::End(); } +namespace priv { +/// +/// Move window for edit emboss text near to embossed object +/// NOTE: embossed object must be selected +/// +ImVec2 calc_fine_position(const Selection &selection, const ImVec2 &windows_size, const Size &canvas_size) +{ + const Selection::IndicesList indices = selection.get_volume_idxs(); + // no selected volume + if (indices.empty()) return {}; + const GLVolume *volume = selection.get_volume(*indices.begin()); + // bad volume selected (e.g. deleted one) + if (volume == nullptr) return {}; + + const Camera &camera = wxGetApp().plater()->get_camera(); + Slic3r::Polygon hull = CameraUtils::create_hull2d(camera, *volume); + + ImVec2 c_size(canvas_size.get_width(), canvas_size.get_height()); + ImVec2 offset = ImGuiWrapper::suggest_location(windows_size, hull, c_size); + return offset; +} +} // namespace priv + void GLGizmoEmboss::on_set_state() { // enable / disable bed from picking @@ -749,7 +778,8 @@ void GLGizmoEmboss::on_set_state() set_volume(priv::get_selected_volume(m_parent.get_selection())); // change position of just opened emboss window - set_fine_position(); + if (m_allow_float_window) + m_set_window_offset = priv::calc_fine_position(m_parent.get_selection(), get_minimal_window_size(), m_parent.get_canvas_size()); // when open by hyperlink it needs to show up // or after key 'T' windows doesn't appear @@ -1228,6 +1258,15 @@ void GLGizmoEmboss::draw_window() const auto &atlas = m_style_manager.get_atlas(); ImGui::Image(atlas.TexID, ImVec2(atlas.TexWidth, atlas.TexHeight)); #endif // SHOW_IMGUI_ATLAS + ImGui::SameLine(); + if (ImGui::Checkbox("##allow_float_window", &m_allow_float_window)) { + if (m_allow_float_window) + m_set_window_offset = priv::calc_fine_position(m_parent.get_selection(), get_minimal_window_size(), m_parent.get_canvas_size()); + } else if (ImGui::IsItemHovered()) { + ImGui::SetTooltip("%s", ((m_allow_float_window) ? + _u8L("Fix settings possition"): + _u8L("Allow floating window near text")).c_str()); + } } void GLGizmoEmboss::draw_text_input() @@ -2648,34 +2687,6 @@ void GLGizmoEmboss::do_rotate(float relative_z_angle) m_parent.do_rotate(snapshot_name); } -void GLGizmoEmboss::set_fine_position() -{ - const Selection &selection = m_parent.get_selection(); - const Selection::IndicesList indices = selection.get_volume_idxs(); - // no selected volume - if (indices.empty()) return; - const GLVolume *volume = selection.get_volume(*indices.begin()); - // bad volume selected (e.g. deleted one) - if (volume == nullptr) return; - - const Camera &camera = wxGetApp().plater()->get_camera(); - Polygon hull = CameraUtils::create_hull2d(camera, *volume); - - const ImVec2 &windows_size = get_minimal_window_size(); - Size c_size = m_parent.get_canvas_size(); - ImVec2 canvas_size(c_size.get_width(), c_size.get_height()); - ImVec2 offset = ImGuiWrapper::suggest_location(windows_size, hull, canvas_size); - m_set_window_offset = offset; - return; - - Polygon rect({Point(offset.x, offset.y), - Point(offset.x + windows_size.x, offset.y), - Point(offset.x + windows_size.x, offset.y + windows_size.y), - Point(offset.x, offset.y + windows_size.y)}); - ImGuiWrapper::draw(hull); - ImGuiWrapper::draw(rect); -} - void GLGizmoEmboss::draw_advanced() { const auto &ff = m_style_manager.get_font_file_with_cache(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp b/src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp index 1df32150f4..cf2ebfd449 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp @@ -125,12 +125,6 @@ private: void do_translate(const Vec3d& relative_move); void do_rotate(float relative_z_angle); - /// - /// Move window for edit emboss text near to embossed object - /// NOTE: embossed object must be selected - /// - void set_fine_position(); - /// /// Reversible input float with option to restor default value /// TODO: make more general, static and move to ImGuiWrapper @@ -220,9 +214,12 @@ private: GuiCfg() = default; }; std::optional m_gui_cfg; + bool m_is_advanced_edit_style = false; + + // when true window will appear near to text + bool m_allow_float_window = false; // setted only when wanted to use - not all the time std::optional m_set_window_offset; - bool m_is_advanced_edit_style = false; Emboss::StyleManager m_style_manager;