diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 8ad800658..407bb27c3 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1173,6 +1173,13 @@ GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas, Bed3D &bed) load_arrange_settings(); m_selection.set_volumes(&m_volumes.volumes); + + m_assembly_view_desc["object_selection_caption"] = _L("Left mouse button"); + m_assembly_view_desc["object_selection"] = _L("object selection"); + m_assembly_view_desc["part_selection_caption"] = "Alt +" + _L("Left mouse button"); + m_assembly_view_desc["part_selection"] = _L("part selectiont"); + m_assembly_view_desc["number_key_caption"] = "1~16 " + _L("number keys"); + m_assembly_view_desc["number_key"] = _L("number keys can quickly change the color of objects"); } GLCanvas3D::~GLCanvas3D() @@ -8227,6 +8234,43 @@ void GLCanvas3D::_render_paint_toolbar() const ImGui::PopStyleColor(); } +float GLCanvas3D::_show_assembly_tooltip_information(float caption_max, float x, float y) const +{ + ImGuiWrapper *imgui = wxGetApp().imgui(); + ImTextureID normal_id = m_gizmos.get_icon_texture_id(GLGizmosManager::MENU_ICON_NAME::IC_TOOLBAR_TOOLTIP); + ImTextureID hover_id = m_gizmos.get_icon_texture_id(GLGizmosManager::MENU_ICON_NAME::IC_TOOLBAR_TOOLTIP_HOVER); + + caption_max += imgui->calc_text_size(": ").x + 35.f; + + float font_size = ImGui::GetFontSize(); + ImVec2 button_size = ImVec2(font_size * 1.8, font_size * 1.3); + + ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, {0, ImGui::GetStyle().FramePadding.y}); + ImGui::ImageButton3(normal_id, hover_id, button_size); + + if (ImGui::IsItemHovered()) { + ImGui::BeginTooltip2(ImVec2(x, y)); + auto draw_text_with_caption = [this, &imgui, & caption_max](const wxString &caption, const wxString &text) { + imgui->text_colored(ImGuiWrapper::COL_ACTIVE, caption); + ImGui::SameLine(caption_max); + imgui->text_colored(ImGuiWrapper::COL_WINDOW_BG, text); + }; + + for (const auto &t : std::array{"object_selection", "part_selection", "number_key"}) { + draw_text_with_caption(m_assembly_view_desc.at(t + "_caption") + ": ", m_assembly_view_desc.at(t)); + } + ImGui::EndTooltip(); + } + ImGui::PopStyleVar(2); + auto same_line_size = button_size.x * 1.8;//with an space size + ImGui::SameLine(same_line_size); + same_line_size = imgui->calc_text_size("|").x + same_line_size + imgui->calc_text_size(" ").x; + imgui->text_colored(ImGuiWrapper::COL_ACTIVE, "|"); + ImGui::SameLine(same_line_size); + return same_line_size; +} + //BBS void GLCanvas3D::_render_assemble_control() const { @@ -8258,7 +8302,18 @@ void GLCanvas3D::_render_assemble_control() const imgui->begin(_L("Assemble Control"), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoTitleBar); ImGui::AlignTextToFramePadding(); - + float tip_icon_size; + { + float caption_max = 0.f; + for (const auto &t : std::array{"object_selection", "part_selection", "number_key"}) { + caption_max = std::max(caption_max, imgui->calc_text_size(m_assembly_view_desc.at(t + "_caption")).x); + } + const ImVec2 pos = ImGui::GetCursorScreenPos(); + const float text_y =imgui->calc_text_size(_L("part_selection")).y; + float get_cur_x = pos.x; + float get_cur_y = pos.y - ImGui::GetFrameHeight() - 4 * text_y; + tip_icon_size =_show_assembly_tooltip_information(caption_max, get_cur_x, get_cur_y); + } { float clp_dist = m_gizmos.m_assemble_view_data->model_objects_clipper()->get_position(); if (clp_dist == 0.f) { @@ -8273,11 +8328,11 @@ void GLCanvas3D::_render_assemble_control() const } } - ImGui::SameLine(window_padding.x + text_size_x + item_spacing); + ImGui::SameLine(tip_icon_size + window_padding.x + text_size_x + item_spacing); ImGui::PushItemWidth(slider_width); bool view_slider_changed = imgui->bbl_slider_float_style("##clp_dist", &clp_dist, 0.f, 1.f, "%.2f", 1.0f, true); - ImGui::SameLine(window_padding.x + text_size_x + slider_width + item_spacing * 2); + ImGui::SameLine(tip_icon_size +window_padding.x + text_size_x + slider_width + item_spacing * 2); ImGui::PushItemWidth(value_size); bool view_input_changed = ImGui::BBLDragFloat("##clp_dist_input", &clp_dist, 0.05f, 0.0f, 0.0f, "%.2f"); @@ -8286,14 +8341,14 @@ void GLCanvas3D::_render_assemble_control() const } { - ImGui::SameLine(window_padding.x + text_size_x + slider_width + item_spacing * 6 + value_size); + ImGui::SameLine(tip_icon_size +window_padding.x + text_size_x + slider_width + item_spacing * 6 + value_size); imgui->text(_L("Explosion Ratio")); - ImGui::SameLine(window_padding.x + 2 * text_size_x + slider_width + item_spacing * 7 + value_size); + ImGui::SameLine(tip_icon_size +window_padding.x + 2 * text_size_x + slider_width + item_spacing * 7 + value_size); ImGui::PushItemWidth(slider_width); bool explosion_slider_changed = imgui->bbl_slider_float_style("##ratio_slider", &m_explosion_ratio, 1.0f, 3.0f, "%1.2f"); - ImGui::SameLine(window_padding.x + 2 * text_size_x + 2 * slider_width + item_spacing * 8 + value_size); + ImGui::SameLine(tip_icon_size +window_padding.x + 2 * text_size_x + 2 * slider_width + item_spacing * 8 + value_size); ImGui::PushItemWidth(value_size); bool explosion_input_changed = ImGui::BBLDragFloat("##ratio_input", &m_explosion_ratio, 0.1f, 1.0f, 3.0f, "%1.2f"); } diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index edcd1c961..5df5ee20e 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -507,6 +507,7 @@ private: wxGLCanvas* m_canvas; wxGLContext* m_context; Bed3D &m_bed; + std::map m_assembly_view_desc; #if ENABLE_RETINA_GL std::unique_ptr m_retina_helper; #endif @@ -1145,6 +1146,7 @@ private: // BBS //void _render_view_toolbar() const; void _render_paint_toolbar() const; + float _show_assembly_tooltip_information(float caption_max, float x, float y) const; void _render_assemble_control() const; void _render_assemble_info() const; #if ENABLE_SHOW_CAMERA_TARGET