@ -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