@ -2616,6 +2616,7 @@ void ImGui::RenderTextWrapped(ImVec2 pos, const char* text, const char* text_end
}
}
// Handle clipping on CPU immediately (vs typically let the GPU clip the triangles that are overlapping the clipping rectangle edges)
void ImGui : : RenderTextClipped ( const ImVec2 & pos_min , const ImVec2 & pos_max , const char * text , const char * text_end , const ImVec2 * text_size_if_known , ImGuiAlign align , const ImVec2 * clip_min , const ImVec2 * clip_max )
{
// Hide anything after a '##' string
@ -5563,26 +5564,26 @@ bool ImGui::CollapsingHeader(const char* label, const char* str_id, bool display
if ( label = = NULL )
label = str_id ;
const ImGuiID id = window - > GetID ( str_id ) ;
const ImVec2 label_size = CalcTextSize ( label , NULL , true ) ;
// We vertically grow up to current line height up the typical widget height.
const float text_base_offset_y = ImMax ( 0.0f , window - > DC . CurrentLineTextBaseOffset - padding . y ) ;
const float frame_height = ImMax ( ImMin ( window - > DC . CurrentLineHeight , g . FontSize + g . Style . FramePadding . y * 2 ) , label_size . y + padding . y * 2 ) ; // We vertically grow up to current line height up the typical widget height.
ImRect frame_ bb = ImRect ( window - > DC . CursorPos , ImVec2 ( window - > Pos . x + GetContentRegionMax ( ) . x , window - > DC . CursorPos . y + frame_height ) ) ;
const float frame_height = ImMax ( ImMin ( window - > DC . CurrentLineHeight , g . FontSize + g . Style . FramePadding . y * 2 ) , label_size . y + padding . y * 2 ) ;
ImRect bb = ImRect ( window - > DC . CursorPos , ImVec2 ( window - > Pos . x + GetContentRegionMax ( ) . x , window - > DC . CursorPos . y + frame_height ) ) ;
if ( display_frame )
{
// Framed header expand a little outside the default padding
frame_ bb. Min . x - = ( float ) ( int ) ( window - > WindowPadding . x * 0.5f ) - 1 ;
frame_ bb. Max . x + = ( float ) ( int ) ( window - > WindowPadding . x * 0.5f ) - 1 ;
bb. Min . x - = ( float ) ( int ) ( window - > WindowPadding . x * 0.5f ) - 1 ;
bb. Max . x + = ( float ) ( int ) ( window - > WindowPadding . x * 0.5f ) - 1 ;
}
const float collapser_width = g . FontSize + padding . x * 2 ;
const float text_width = collapser_width + ( label_size . x > 0.0f ? label_size . x + padding . x * 2 : 0.0f ) ; // Include collapser
const ImVec2 layout_size = ImVec2 ( text_width , frame_height ) ;
ItemSize ( layout_size , text_base_offset_y ) ;
const float text_width = collapser_width + ( label_size . x > 0.0f ? label_size . x + padding . x * 2 : 0.0f ) ; // Include collapser
ItemSize ( ImVec2 ( text_width , frame_height ) , text_base_offset_y ) ;
// For regular tree nodes, we arbitrary allow to click past 2 worth of ItemSpacing
// (Ideally we'd want to add a flag for the user to specify we want want the hit test to be done up to the right side of the content or not)
const ImRect interact_bb = display_frame ? frame_ bb : ImRect ( frame_ bb. Min . x , frame_ bb. Min . y , frame_ bb. Min . x + text_width + style . ItemSpacing . x * 2 , frame_ bb. Max . y ) ;
const ImRect interact_bb = display_frame ? bb : ImRect ( bb. Min . x , bb. Min . y , bb. Min . x + text_width + style . ItemSpacing . x * 2 , bb. Max . y ) ;
bool opened = TreeNodeBehaviorIsOpened ( id , ( default_open ? ImGuiTreeNodeFlags_DefaultOpen : 0 ) | ( display_frame ? ImGuiTreeNodeFlags_NoAutoExpandOnLog : 0 ) ) ;
if ( ! ItemAdd ( interact_bb , & id ) )
return opened ;
@ -5597,36 +5598,36 @@ bool ImGui::CollapsingHeader(const char* label, const char* str_id, bool display
// Render
const ImU32 col = window - > Color ( ( held & & hovered ) ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header ) ;
const ImVec2 text_pos = bb . Min + padding + ImVec2 ( collapser_width , text_base_offset_y ) ;
if ( display_frame )
{
// Framed type
RenderFrame ( frame_bb . Min , frame_bb . Max , col , true , style . FrameRounding ) ;
RenderCollapseTriangle ( frame_bb . Min + padding + ImVec2 ( 0.0f , text_base_offset_y ) , opened , 1.0f , true ) ;
const ImVec2 text_pos = frame_bb . Min + padding + ImVec2 ( collapser_width , text_base_offset_y ) ;
RenderFrame ( bb . Min , bb . Max , col , true , style . FrameRounding ) ;
RenderCollapseTriangle ( bb . Min + padding + ImVec2 ( 0.0f , text_base_offset_y ) , opened , 1.0f , true ) ;
if ( g . LogEnabled )
{
// NB: '##' is normally used to hide text (as a library-wide feature), so we need to specify the text range to make sure the ## aren't stripped out here.
const char log_prefix [ ] = " \n ## " ;
const char log_suffix [ ] = " ## " ;
LogRenderedText ( text_pos , log_prefix , log_prefix + 3 ) ;
RenderTextClipped ( text_pos , frame_ bb. Max , label , NULL , & label_size ) ;
LogRenderedText ( text_pos , log_suffix , log_suffix + 2 ) ;
RenderTextClipped ( text_pos , bb. Max , label , NULL , & label_size ) ;
LogRenderedText ( text_pos , log_suffix + 1 , log_suffix + 3 ) ;
}
else
{
RenderTextClipped ( text_pos , frame_ bb. Max , label , NULL , & label_size ) ;
RenderTextClipped ( text_pos , bb. Max , label , NULL , & label_size ) ;
}
}
else
{
// Unframed typed for tree nodes
if ( hovered )
RenderFrame ( frame_ bb. Min , frame_ bb. Max , col , false ) ;
RenderFrame ( bb. Min , bb. Max , col , false ) ;
RenderCollapseTriangle ( frame_ bb. Min + ImVec2 ( padding . x , g . FontSize * 0.15f + text_base_offset_y ) , opened , 0.70f , false ) ;
RenderCollapseTriangle ( bb. Min + ImVec2 ( padding . x , g . FontSize * 0.15f + text_base_offset_y ) , opened , 0.70f , false ) ;
if ( g . LogEnabled )
LogRenderedText ( frame_bb. Min + ImVec2 ( collapser_width , text_base_offset_y ) , " > " ) ;
RenderText ( frame_bb. Min + ImVec2 ( collapser_width , text_base_offset_y ) , label ) ;
LogRenderedText ( text_pos , " > " ) ;
RenderText ( text_pos , label ) ;
}
return opened ;