mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 05:01:05 +01:00 
			
		
		
		
	Internals: Reworked RenderTextEllipsis() to satisfy what we need for table headers.
This commit is contained in:
		
							
								
								
									
										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. | ||||
| // 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.  | ||||
| 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) | ||||
|     { | ||||
|         // 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 float font_size = draw_list->_Data->FontSize; | ||||
|         const int ellipsis_dot_count = 3; | ||||
|         const float ellipsis_width = (1.0f + 1.0f) * ellipsis_dot_count - 1.0f; | ||||
|         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_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_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)); | ||||
|  | ||||
|         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); | ||||
|     } | ||||
|     else | ||||
|   | ||||
		Reference in New Issue
	
	Block a user