mirror of
https://github.com/ocornut/imgui.git
synced 2024-12-18 08:51:06 +08:00
Internals: Reworked RenderTextEllipsis() to satisfy what we need for table headers.
This commit is contained in:
parent
4597632662
commit
5ae268c0a3
19
imgui.cpp
19
imgui.cpp
@ -2424,7 +2424,7 @@ void ImGui::RenderTextClipped(const ImVec2& pos_min, const ImVec2& pos_max, cons
|
|||||||
|
|
||||||
|
|
||||||
// Another overly complex function until we reorganize everything into a nice all-in-one helper.
|
// 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 and limit of the ellipsis display.
|
// 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 we don't want the ellipsis to move.
|
// 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.
|
||||||
void 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)
|
void 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)
|
||||||
{
|
{
|
||||||
@ -2435,27 +2435,36 @@ void ImGui::RenderTextEllipsis(ImDrawList* draw_list, const ImVec2& pos_min,
|
|||||||
|
|
||||||
if (text_size.x > pos_max.x - pos_min.x)
|
if (text_size.x > pos_max.x - pos_min.x)
|
||||||
{
|
{
|
||||||
|
// Hello wo...
|
||||||
|
// | | |
|
||||||
|
// min max ellipsis_max
|
||||||
|
// <-> this is generally some padding value
|
||||||
|
|
||||||
|
// FIXME-STYLE: RenderPixelEllipsis() style should use actual font data.
|
||||||
const ImFont* font = draw_list->_Data->Font;
|
const ImFont* font = draw_list->_Data->Font;
|
||||||
const float font_size = draw_list->_Data->FontSize;
|
const float font_size = draw_list->_Data->FontSize;
|
||||||
const int ellipsis_dot_count = 3;
|
const int ellipsis_dot_count = 3;
|
||||||
const float ellipsis_width = (1.0f + 1.0f) * ellipsis_dot_count - 1.0f;
|
const float ellipsis_width = (1.0f + 1.0f) * ellipsis_dot_count - 1.0f;
|
||||||
const char* text_end_ellipsis = NULL;
|
const char* text_end_ellipsis = NULL;
|
||||||
float text_size_clipped_x = font->CalcTextSizeA(font_size, (pos_max.x - pos_min.x) - ellipsis_width + 1.0f, 0.0f, text, text_end_full, &text_end_ellipsis).x;
|
|
||||||
if (text == text_end_ellipsis && text_end_ellipsis < text_end_full) // Always display at least 1 character if there's no room for character + ellipsis
|
float text_width = ImMax((pos_max.x - ellipsis_width) - pos_min.x, 1.0f);
|
||||||
|
float text_size_clipped_x = font->CalcTextSizeA(font_size, text_width, 0.0f, text, text_end_full, &text_end_ellipsis).x;
|
||||||
|
if (text == text_end_ellipsis && text_end_ellipsis < text_end_full)
|
||||||
{
|
{
|
||||||
|
// Always display at least 1 character if there's no room for character + ellipsis
|
||||||
text_end_ellipsis = text + ImTextCountUtf8BytesFromChar(text, text_end_full);
|
text_end_ellipsis = text + ImTextCountUtf8BytesFromChar(text, text_end_full);
|
||||||
text_size_clipped_x = font->CalcTextSizeA(font_size, FLT_MAX, 0.0f, text, text_end_ellipsis).x;
|
text_size_clipped_x = font->CalcTextSizeA(font_size, FLT_MAX, 0.0f, text, text_end_ellipsis).x;
|
||||||
}
|
}
|
||||||
while (text_end_ellipsis > text && ImCharIsBlankA(text_end_ellipsis[-1])) // Trim trailing space
|
while (text_end_ellipsis > text && ImCharIsBlankA(text_end_ellipsis[-1]))
|
||||||
{
|
{
|
||||||
|
// Trim trailing space before ellipsis
|
||||||
text_end_ellipsis--;
|
text_end_ellipsis--;
|
||||||
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
|
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
|
||||||
}
|
}
|
||||||
RenderTextClippedEx(draw_list, pos_min, ImVec2(clip_max_x, pos_max.y), text, text_end_ellipsis, &text_size, ImVec2(0.0f, 0.0f));
|
RenderTextClippedEx(draw_list, pos_min, ImVec2(clip_max_x, pos_max.y), text, text_end_ellipsis, &text_size, ImVec2(0.0f, 0.0f));
|
||||||
|
|
||||||
const float ellipsis_x = pos_min.x + text_size_clipped_x + 1.0f;
|
const float ellipsis_x = pos_min.x + text_size_clipped_x + 1.0f;
|
||||||
if (ellipsis_x + ellipsis_width <= ellipsis_max_x)
|
if (ellipsis_x + ellipsis_width - 1.0f <= ellipsis_max_x)
|
||||||
RenderPixelEllipsis(draw_list, ImVec2(ellipsis_x, pos_min.y), GetColorU32(ImGuiCol_Text), ellipsis_dot_count);
|
RenderPixelEllipsis(draw_list, ImVec2(ellipsis_x, pos_min.y), GetColorU32(ImGuiCol_Text), ellipsis_dot_count);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -7077,7 +7077,7 @@ bool ImGui::TabItemLabelAndCloseButton(ImDrawList* draw_list, const ImRect& bb,
|
|||||||
text_pixel_clip_bb.Max.x -= close_button_sz;
|
text_pixel_clip_bb.Max.x -= close_button_sz;
|
||||||
}
|
}
|
||||||
|
|
||||||
float ellipsis_max_x = close_button_visible ? -FLT_MAX : bb.Max.x;
|
float ellipsis_max_x = close_button_visible ? text_pixel_clip_bb.Max.x : bb.Max.x - 1.0f;
|
||||||
RenderTextEllipsis(draw_list, text_ellipsis_clip_bb.Min, text_ellipsis_clip_bb.Max, text_pixel_clip_bb.Max.x, ellipsis_max_x, label, NULL, &label_size);
|
RenderTextEllipsis(draw_list, text_ellipsis_clip_bb.Min, text_ellipsis_clip_bb.Max, text_pixel_clip_bb.Max.x, ellipsis_max_x, label, NULL, &label_size);
|
||||||
|
|
||||||
return close_button_pressed;
|
return close_button_pressed;
|
||||||
|
Loading…
Reference in New Issue
Block a user