diff --git a/src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp b/src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp index 46d4be0b1..883d9d080 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp @@ -1406,10 +1406,18 @@ void GLGizmoEmboss::init_face_names() { // to reload fonts from system, when install new one wxFontEnumerator::InvalidateCache(); + auto create_truncated_names = [&facenames = m_face_names, &width = m_gui_cfg->face_name_max_width]() { + for (FaceName &face : facenames.faces) { + std::string name_str(face.wx_name.ToUTF8().data()); + face.name_truncated = ImGuiWrapper::trunc(name_str, width); + } + }; + // try load cache // Only not OS enumerated face has hash value 0 if (m_face_names.hash == 0) { load(m_face_names); + create_truncated_names(); } using namespace std::chrono; @@ -1479,6 +1487,7 @@ void GLGizmoEmboss::init_face_names() { } } assert(std::is_sorted(m_face_names.bad.begin(), m_face_names.bad.end())); + create_truncated_names(); store(m_face_names); } @@ -1638,13 +1647,7 @@ void GLGizmoEmboss::draw_font_list() if (ImGui::IsItemHovered()) ImGui::SetTooltip("%s", wx_face_name.ToUTF8().data()); if (is_selected) ImGui::SetItemDefaultFocus(); - bool is_visible = ImGui::IsItemVisible(); - if (is_visible && face.name_truncated.empty()) { - float width = m_gui_cfg->face_name_max_width; - std::string name_str(face.wx_name.ToUTF8().data()); - face.name_truncated = ImGuiWrapper::trunc(name_str, width); - } - draw_font_preview(face, is_visible); + draw_font_preview(face, ImGui::IsItemVisible()); } #ifdef SHOW_FONT_COUNT ImGui::TextColored(ImGuiWrapper::COL_GREY_LIGHT, "Count %d", diff --git a/src/slic3r/GUI/ImGuiWrapper.cpp b/src/slic3r/GUI/ImGuiWrapper.cpp index 729357c97..17709788d 100644 --- a/src/slic3r/GUI/ImGuiWrapper.cpp +++ b/src/slic3r/GUI/ImGuiWrapper.cpp @@ -1326,24 +1326,20 @@ std::string ImGuiWrapper::trunc(const std::string &text, text_width = calc_text_size(result_text).x; if (text_width < allowed_width) { // increase letter count - while (true) { + while (count_letter < text.length()) { ++count_letter; std::string_view act_text = text_.substr(0, count_letter); text_width = calc_text_size(act_text).x; - if (text_width < allowed_width) { - result_text = std::move(act_text); - break; - } + if (text_width > allowed_width) break; + result_text = act_text; } } else { // decrease letter count - while (true) { + while (count_letter > 1) { --count_letter; result_text = text_.substr(0, count_letter); text_width = calc_text_size(result_text).x; - if (text_width > allowed_width) break; - if (count_letter == 1) return "Error: No letters left. Can't return only tail."; - + if (text_width < allowed_width) break; } } return std::string(result_text) + tail;