MCPcopy Create free account
hub / github.com/VictorGordan/opengl-tutorials / RenderTextEllipsis

Method RenderTextEllipsis

ImGUI GLFW Tutorial/imgui/imgui.cpp:2753–2828  ·  view source on GitHub ↗

Another overly complex function until we reorganize everything into a nice all-in-one helper. This is made more complex because we have dissociated the layout rectangle (pos_min..pos_max) which define _where_ the ellipsis is, from actual clipping of text and limit of the ellipsis display. This is because in the context of tabs we selectively hide part of the text when the Close Button appears, but

Source from the content-addressed store, hash-verified

2751// This is made more complex because we have dissociated the layout rectangle (pos_min..pos_max) which define _where_ the ellipsis is, from actual clipping of text and limit of the ellipsis display.
2752// This is because in the context of tabs we selectively hide part of the text when the Close Button appears, but we don't want the ellipsis to move.
2753void ImGui::RenderTextEllipsis(ImDrawList* draw_list, const ImVec2& pos_min, const ImVec2& pos_max, float clip_max_x, float ellipsis_max_x, const char* text, const char* text_end_full, const ImVec2* text_size_if_known)
2754{
2755 ImGuiContext& g = *GImGui;
2756 if (text_end_full == NULL)
2757 text_end_full = FindRenderedTextEnd(text);
2758 const ImVec2 text_size = text_size_if_known ? *text_size_if_known : CalcTextSize(text, text_end_full, false, 0.0f);
2759
2760 //draw_list->AddLine(ImVec2(pos_max.x, pos_min.y - 4), ImVec2(pos_max.x, pos_max.y + 4), IM_COL32(0, 0, 255, 255));
2761 //draw_list->AddLine(ImVec2(ellipsis_max_x, pos_min.y-2), ImVec2(ellipsis_max_x, pos_max.y+2), IM_COL32(0, 255, 0, 255));
2762 //draw_list->AddLine(ImVec2(clip_max_x, pos_min.y), ImVec2(clip_max_x, pos_max.y), IM_COL32(255, 0, 0, 255));
2763 // FIXME: We could technically remove (last_glyph->AdvanceX - last_glyph->X1) from text_size.x here and save a few pixels.
2764 if (text_size.x > pos_max.x - pos_min.x)
2765 {
2766 // Hello wo...
2767 // | | |
2768 // min max ellipsis_max
2769 // <-> this is generally some padding value
2770
2771 const ImFont* font = draw_list->_Data->Font;
2772 const float font_size = draw_list->_Data->FontSize;
2773 const char* text_end_ellipsis = NULL;
2774
2775 ImWchar ellipsis_char = font->EllipsisChar;
2776 int ellipsis_char_count = 1;
2777 if (ellipsis_char == (ImWchar)-1)
2778 {
2779 ellipsis_char = (ImWchar)'.';
2780 ellipsis_char_count = 3;
2781 }
2782 const ImFontGlyph* glyph = font->FindGlyph(ellipsis_char);
2783
2784 float ellipsis_glyph_width = glyph->X1; // Width of the glyph with no padding on either side
2785 float ellipsis_total_width = ellipsis_glyph_width; // Full width of entire ellipsis
2786
2787 if (ellipsis_char_count > 1)
2788 {
2789 // Full ellipsis size without free spacing after it.
2790 const float spacing_between_dots = 1.0f * (draw_list->_Data->FontSize / font->FontSize);
2791 ellipsis_glyph_width = glyph->X1 - glyph->X0 + spacing_between_dots;
2792 ellipsis_total_width = ellipsis_glyph_width * (float)ellipsis_char_count - spacing_between_dots;
2793 }
2794
2795 // We can now claim the space between pos_max.x and ellipsis_max.x
2796 const float text_avail_width = ImMax((ImMax(pos_max.x, ellipsis_max_x) - ellipsis_total_width) - pos_min.x, 1.0f);
2797 float text_size_clipped_x = font->CalcTextSizeA(font_size, text_avail_width, 0.0f, text, text_end_full, &text_end_ellipsis).x;
2798 if (text == text_end_ellipsis && text_end_ellipsis < text_end_full)
2799 {
2800 // Always display at least 1 character if there's no room for character + ellipsis
2801 text_end_ellipsis = text + ImTextCountUtf8BytesFromChar(text, text_end_full);
2802 text_size_clipped_x = font->CalcTextSizeA(font_size, FLT_MAX, 0.0f, text, text_end_ellipsis).x;
2803 }
2804 while (text_end_ellipsis > text && ImCharIsBlankA(text_end_ellipsis[-1]))
2805 {
2806 // Trim trailing space before ellipsis (FIXME: Supporting non-ascii blanks would be nice, for this we need a function to backtrack in UTF-8 text)
2807 text_end_ellipsis--;
2808 text_size_clipped_x -= font->CalcTextSizeA(font_size, FLT_MAX, 0.0f, text_end_ellipsis, text_end_ellipsis + 1).x; // Ascii blanks are always 1 byte
2809 }
2810

Callers

nothing calls this directly

Calls 7

ImMaxFunction · 0.70
ImCharIsBlankAFunction · 0.70
ImVec2Function · 0.70
FindGlyphMethod · 0.45
CalcTextSizeAMethod · 0.45
RenderCharMethod · 0.45

Tested by

no test coverage detected