MCPcopy Create free account
hub / github.com/InteractiveComputerGraphics/SPlisHSPlasH / RenderTextEllipsis

Method RenderTextEllipsis

extern/imgui/imgui.cpp:3303–3378  ·  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

3301// 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.
3302// 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.
3303void 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)
3304{
3305 ImGuiContext& g = *GImGui;
3306 if (text_end_full == NULL)
3307 text_end_full = FindRenderedTextEnd(text);
3308 const ImVec2 text_size = text_size_if_known ? *text_size_if_known : CalcTextSize(text, text_end_full, false, 0.0f);
3309
3310 //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));
3311 //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));
3312 //draw_list->AddLine(ImVec2(clip_max_x, pos_min.y), ImVec2(clip_max_x, pos_max.y), IM_COL32(255, 0, 0, 255));
3313 // FIXME: We could technically remove (last_glyph->AdvanceX - last_glyph->X1) from text_size.x here and save a few pixels.
3314 if (text_size.x > pos_max.x - pos_min.x)
3315 {
3316 // Hello wo...
3317 // | | |
3318 // min max ellipsis_max
3319 // <-> this is generally some padding value
3320
3321 const ImFont* font = draw_list->_Data->Font;
3322 const float font_size = draw_list->_Data->FontSize;
3323 const char* text_end_ellipsis = NULL;
3324
3325 ImWchar ellipsis_char = font->EllipsisChar;
3326 int ellipsis_char_count = 1;
3327 if (ellipsis_char == (ImWchar)-1)
3328 {
3329 ellipsis_char = font->DotChar;
3330 ellipsis_char_count = 3;
3331 }
3332 const ImFontGlyph* glyph = font->FindGlyph(ellipsis_char);
3333
3334 float ellipsis_glyph_width = glyph->X1; // Width of the glyph with no padding on either side
3335 float ellipsis_total_width = ellipsis_glyph_width; // Full width of entire ellipsis
3336
3337 if (ellipsis_char_count > 1)
3338 {
3339 // Full ellipsis size without free spacing after it.
3340 const float spacing_between_dots = 1.0f * (draw_list->_Data->FontSize / font->FontSize);
3341 ellipsis_glyph_width = glyph->X1 - glyph->X0 + spacing_between_dots;
3342 ellipsis_total_width = ellipsis_glyph_width * (float)ellipsis_char_count - spacing_between_dots;
3343 }
3344
3345 // We can now claim the space between pos_max.x and ellipsis_max.x
3346 const float text_avail_width = ImMax((ImMax(pos_max.x, ellipsis_max_x) - ellipsis_total_width) - pos_min.x, 1.0f);
3347 float text_size_clipped_x = font->CalcTextSizeA(font_size, text_avail_width, 0.0f, text, text_end_full, &text_end_ellipsis).x;
3348 if (text == text_end_ellipsis && text_end_ellipsis < text_end_full)
3349 {
3350 // Always display at least 1 character if there's no room for character + ellipsis
3351 text_end_ellipsis = text + ImTextCountUtf8BytesFromChar(text, text_end_full);
3352 text_size_clipped_x = font->CalcTextSizeA(font_size, FLT_MAX, 0.0f, text, text_end_ellipsis).x;
3353 }
3354 while (text_end_ellipsis > text && ImCharIsBlankA(text_end_ellipsis[-1]))
3355 {
3356 // 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)
3357 text_end_ellipsis--;
3358 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
3359 }
3360

Callers

nothing calls this directly

Calls 7

ImMaxFunction · 0.85
ImCharIsBlankAFunction · 0.85
ImVec2Function · 0.85
FindGlyphMethod · 0.80
CalcTextSizeAMethod · 0.80
RenderCharMethod · 0.80

Tested by

no test coverage detected