@ -7945,341 +7945,6 @@ void ImGui::LogButtons()
LogToClipboard ( g . LogAutoExpandMaxDepth ) ;
}
bool ImGui : : TreeNodeBehaviorIsOpen ( ImGuiID id , ImGuiTreeNodeFlags flags )
{
if ( flags & ImGuiTreeNodeFlags_Leaf )
return true ;
// We only write to the tree storage if the user clicks (or explicitly use SetNextTreeNode*** functions)
ImGuiContext & g = * GImGui ;
ImGuiWindow * window = g . CurrentWindow ;
ImGuiStorage * storage = window - > DC . StateStorage ;
bool is_open ;
if ( g . NextTreeNodeOpenCond ! = 0 )
{
if ( g . NextTreeNodeOpenCond & ImGuiCond_Always )
{
is_open = g . NextTreeNodeOpenVal ;
storage - > SetInt ( id , is_open ) ;
}
else
{
// We treat ImGuiCond_Once and ImGuiCond_FirstUseEver the same because tree node state are not saved persistently.
const int stored_value = storage - > GetInt ( id , - 1 ) ;
if ( stored_value = = - 1 )
{
is_open = g . NextTreeNodeOpenVal ;
storage - > SetInt ( id , is_open ) ;
}
else
{
is_open = stored_value ! = 0 ;
}
}
g . NextTreeNodeOpenCond = 0 ;
}
else
{
is_open = storage - > GetInt ( id , ( flags & ImGuiTreeNodeFlags_DefaultOpen ) ? 1 : 0 ) ! = 0 ;
}
// When logging is enabled, we automatically expand tree nodes (but *NOT* collapsing headers.. seems like sensible behavior).
// NB- If we are above max depth we still allow manually opened nodes to be logged.
if ( g . LogEnabled & & ! ( flags & ImGuiTreeNodeFlags_NoAutoOpenOnLog ) & & window - > DC . TreeDepth < g . LogAutoExpandMaxDepth )
is_open = true ;
return is_open ;
}
bool ImGui : : TreeNodeBehavior ( ImGuiID id , ImGuiTreeNodeFlags flags , const char * label , const char * label_end )
{
ImGuiWindow * window = GetCurrentWindow ( ) ;
if ( window - > SkipItems )
return false ;
ImGuiContext & g = * GImGui ;
const ImGuiStyle & style = g . Style ;
const bool display_frame = ( flags & ImGuiTreeNodeFlags_Framed ) ! = 0 ;
const ImVec2 padding = ( display_frame | | ( flags & ImGuiTreeNodeFlags_FramePadding ) ) ? style . FramePadding : ImVec2 ( style . FramePadding . x , 0.0f ) ;
if ( ! label_end )
label_end = FindRenderedTextEnd ( label ) ;
const ImVec2 label_size = CalcTextSize ( label , label_end , false ) ;
// We vertically grow up to current line height up the typical widget height.
const float text_base_offset_y = ImMax ( padding . y , window - > DC . CurrentLineTextBaseOffset ) ; // Latch before ItemSize changes it
const float frame_height = ImMax ( ImMin ( window - > DC . CurrentLineSize . y , g . FontSize + style . FramePadding . y * 2 ) , label_size . y + padding . y * 2 ) ;
ImRect frame_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 ;
}
const float text_offset_x = ( g . FontSize + ( display_frame ? padding . x * 3 : padding . x * 2 ) ) ; // Collapser arrow width + Spacing
const float text_width = g . FontSize + ( 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 if we 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 ) ;
bool is_open = TreeNodeBehaviorIsOpen ( id , flags ) ;
// Store a flag for the current depth to tell if we will allow closing this node when navigating one of its child.
// For this purpose we essentially compare if g.NavIdIsAlive went from 0 to 1 between TreeNode() and TreePop().
// This is currently only support 32 level deep and we are fine with (1 << Depth) overflowing into a zero.
if ( is_open & & ! g . NavIdIsAlive & & ( flags & ImGuiTreeNodeFlags_NavLeftJumpsBackHere ) & & ! ( flags & ImGuiTreeNodeFlags_NoTreePushOnOpen ) )
window - > DC . TreeDepthMayJumpToParentOnPop | = ( 1 < < window - > DC . TreeDepth ) ;
bool item_add = ItemAdd ( interact_bb , id ) ;
window - > DC . LastItemStatusFlags | = ImGuiItemStatusFlags_HasDisplayRect ;
window - > DC . LastItemDisplayRect = frame_bb ;
if ( ! item_add )
{
if ( is_open & & ! ( flags & ImGuiTreeNodeFlags_NoTreePushOnOpen ) )
TreePushRawID ( id ) ;
return is_open ;
}
// Flags that affects opening behavior:
// - 0(default) ..................... single-click anywhere to open
// - OpenOnDoubleClick .............. double-click anywhere to open
// - OpenOnArrow .................... single-click on arrow to open
// - OpenOnDoubleClick|OpenOnArrow .. single-click on arrow or double-click anywhere to open
ImGuiButtonFlags button_flags = ImGuiButtonFlags_NoKeyModifiers | ( ( flags & ImGuiTreeNodeFlags_AllowItemOverlap ) ? ImGuiButtonFlags_AllowItemOverlap : 0 ) ;
if ( ! ( flags & ImGuiTreeNodeFlags_Leaf ) )
button_flags | = ImGuiButtonFlags_PressedOnDragDropHold ;
if ( flags & ImGuiTreeNodeFlags_OpenOnDoubleClick )
button_flags | = ImGuiButtonFlags_PressedOnDoubleClick | ( ( flags & ImGuiTreeNodeFlags_OpenOnArrow ) ? ImGuiButtonFlags_PressedOnClickRelease : 0 ) ;
bool hovered , held , pressed = ButtonBehavior ( interact_bb , id , & hovered , & held , button_flags ) ;
if ( ! ( flags & ImGuiTreeNodeFlags_Leaf ) )
{
bool toggled = false ;
if ( pressed )
{
toggled = ! ( flags & ( ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick ) ) | | ( g . NavActivateId = = id ) ;
if ( flags & ImGuiTreeNodeFlags_OpenOnArrow )
toggled | = IsMouseHoveringRect ( interact_bb . Min , ImVec2 ( interact_bb . Min . x + text_offset_x , interact_bb . Max . y ) ) & & ( ! g . NavDisableMouseHover ) ;
if ( flags & ImGuiTreeNodeFlags_OpenOnDoubleClick )
toggled | = g . IO . MouseDoubleClicked [ 0 ] ;
if ( g . DragDropActive & & is_open ) // When using Drag and Drop "hold to open" we keep the node highlighted after opening, but never close it again.
toggled = false ;
}
if ( g . NavId = = id & & g . NavMoveRequest & & g . NavMoveDir = = ImGuiDir_Left & & is_open )
{
toggled = true ;
NavMoveRequestCancel ( ) ;
}
if ( g . NavId = = id & & g . NavMoveRequest & & g . NavMoveDir = = ImGuiDir_Right & & ! is_open ) // If there's something upcoming on the line we may want to give it the priority?
{
toggled = true ;
NavMoveRequestCancel ( ) ;
}
if ( toggled )
{
is_open = ! is_open ;
window - > DC . StateStorage - > SetInt ( id , is_open ) ;
}
}
if ( flags & ImGuiTreeNodeFlags_AllowItemOverlap )
SetItemAllowOverlap ( ) ;
// Render
const ImU32 col = GetColorU32 ( ( held & & hovered ) ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header ) ;
const ImVec2 text_pos = frame_bb . Min + ImVec2 ( text_offset_x , text_base_offset_y ) ;
if ( display_frame )
{
// Framed type
RenderFrame ( frame_bb . Min , frame_bb . Max , col , true , style . FrameRounding ) ;
RenderNavHighlight ( frame_bb , id , ImGuiNavHighlightFlags_TypeThin ) ;
RenderArrow ( frame_bb . Min + ImVec2 ( padding . x , text_base_offset_y ) , is_open ? ImGuiDir_Down : ImGuiDir_Right , 1.0f ) ;
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 , label_end , & label_size ) ;
LogRenderedText ( & text_pos , log_suffix + 1 , log_suffix + 3 ) ;
}
else
{
RenderTextClipped ( text_pos , frame_bb . Max , label , label_end , & label_size ) ;
}
}
else
{
// Unframed typed for tree nodes
if ( hovered | | ( flags & ImGuiTreeNodeFlags_Selected ) )
{
RenderFrame ( frame_bb . Min , frame_bb . Max , col , false ) ;
RenderNavHighlight ( frame_bb , id , ImGuiNavHighlightFlags_TypeThin ) ;
}
if ( flags & ImGuiTreeNodeFlags_Bullet )
RenderBullet ( frame_bb . Min + ImVec2 ( text_offset_x * 0.5f , g . FontSize * 0.50f + text_base_offset_y ) ) ;
else if ( ! ( flags & ImGuiTreeNodeFlags_Leaf ) )
RenderArrow ( frame_bb . Min + ImVec2 ( padding . x , g . FontSize * 0.15f + text_base_offset_y ) , is_open ? ImGuiDir_Down : ImGuiDir_Right , 0.70f ) ;
if ( g . LogEnabled )
LogRenderedText ( & text_pos , " > " ) ;
RenderText ( text_pos , label , label_end , false ) ;
}
if ( is_open & & ! ( flags & ImGuiTreeNodeFlags_NoTreePushOnOpen ) )
TreePushRawID ( id ) ;
return is_open ;
}
// CollapsingHeader returns true when opened but do not indent nor push into the ID stack (because of the ImGuiTreeNodeFlags_NoTreePushOnOpen flag).
// This is basically the same as calling TreeNodeEx(label, ImGuiTreeNodeFlags_CollapsingHeader). You can remove the _NoTreePushOnOpen flag if you want behavior closer to normal TreeNode().
bool ImGui : : CollapsingHeader ( const char * label , ImGuiTreeNodeFlags flags )
{
ImGuiWindow * window = GetCurrentWindow ( ) ;
if ( window - > SkipItems )
return false ;
return TreeNodeBehavior ( window - > GetID ( label ) , flags | ImGuiTreeNodeFlags_CollapsingHeader , label ) ;
}
bool ImGui : : CollapsingHeader ( const char * label , bool * p_open , ImGuiTreeNodeFlags flags )
{
ImGuiWindow * window = GetCurrentWindow ( ) ;
if ( window - > SkipItems )
return false ;
if ( p_open & & ! * p_open )
return false ;
ImGuiID id = window - > GetID ( label ) ;
bool is_open = TreeNodeBehavior ( id , flags | ImGuiTreeNodeFlags_CollapsingHeader | ( p_open ? ImGuiTreeNodeFlags_AllowItemOverlap : 0 ) , label ) ;
if ( p_open )
{
// Create a small overlapping close button // FIXME: We can evolve this into user accessible helpers to add extra buttons on title bars, headers, etc.
ImGuiContext & g = * GImGui ;
ImGuiItemHoveredDataBackup last_item_backup ;
float button_radius = g . FontSize * 0.5f ;
ImVec2 button_center = ImVec2 ( ImMin ( window - > DC . LastItemRect . Max . x , window - > ClipRect . Max . x ) - g . Style . FramePadding . x - button_radius , window - > DC . LastItemRect . GetCenter ( ) . y ) ;
if ( CloseButton ( window - > GetID ( ( void * ) ( intptr_t ) ( id + 1 ) ) , button_center , button_radius ) )
* p_open = false ;
last_item_backup . Restore ( ) ;
}
return is_open ;
}
bool ImGui : : TreeNodeEx ( const char * label , ImGuiTreeNodeFlags flags )
{
ImGuiWindow * window = GetCurrentWindow ( ) ;
if ( window - > SkipItems )
return false ;
return TreeNodeBehavior ( window - > GetID ( label ) , flags , label , NULL ) ;
}
bool ImGui : : TreeNodeExV ( const char * str_id , ImGuiTreeNodeFlags flags , const char * fmt , va_list args )
{
ImGuiWindow * window = GetCurrentWindow ( ) ;
if ( window - > SkipItems )
return false ;
ImGuiContext & g = * GImGui ;
const char * label_end = g . TempBuffer + ImFormatStringV ( g . TempBuffer , IM_ARRAYSIZE ( g . TempBuffer ) , fmt , args ) ;
return TreeNodeBehavior ( window - > GetID ( str_id ) , flags , g . TempBuffer , label_end ) ;
}
bool ImGui : : TreeNodeExV ( const void * ptr_id , ImGuiTreeNodeFlags flags , const char * fmt , va_list args )
{
ImGuiWindow * window = GetCurrentWindow ( ) ;
if ( window - > SkipItems )
return false ;
ImGuiContext & g = * GImGui ;
const char * label_end = g . TempBuffer + ImFormatStringV ( g . TempBuffer , IM_ARRAYSIZE ( g . TempBuffer ) , fmt , args ) ;
return TreeNodeBehavior ( window - > GetID ( ptr_id ) , flags , g . TempBuffer , label_end ) ;
}
bool ImGui : : TreeNodeV ( const char * str_id , const char * fmt , va_list args )
{
return TreeNodeExV ( str_id , 0 , fmt , args ) ;
}
bool ImGui : : TreeNodeV ( const void * ptr_id , const char * fmt , va_list args )
{
return TreeNodeExV ( ptr_id , 0 , fmt , args ) ;
}
bool ImGui : : TreeNodeEx ( const char * str_id , ImGuiTreeNodeFlags flags , const char * fmt , . . . )
{
va_list args ;
va_start ( args , fmt ) ;
bool is_open = TreeNodeExV ( str_id , flags , fmt , args ) ;
va_end ( args ) ;
return is_open ;
}
bool ImGui : : TreeNodeEx ( const void * ptr_id , ImGuiTreeNodeFlags flags , const char * fmt , . . . )
{
va_list args ;
va_start ( args , fmt ) ;
bool is_open = TreeNodeExV ( ptr_id , flags , fmt , args ) ;
va_end ( args ) ;
return is_open ;
}
bool ImGui : : TreeNode ( const char * str_id , const char * fmt , . . . )
{
va_list args ;
va_start ( args , fmt ) ;
bool is_open = TreeNodeExV ( str_id , 0 , fmt , args ) ;
va_end ( args ) ;
return is_open ;
}
bool ImGui : : TreeNode ( const void * ptr_id , const char * fmt , . . . )
{
va_list args ;
va_start ( args , fmt ) ;
bool is_open = TreeNodeExV ( ptr_id , 0 , fmt , args ) ;
va_end ( args ) ;
return is_open ;
}
bool ImGui : : TreeNode ( const char * label )
{
ImGuiWindow * window = GetCurrentWindow ( ) ;
if ( window - > SkipItems )
return false ;
return TreeNodeBehavior ( window - > GetID ( label ) , 0 , label , NULL ) ;
}
void ImGui : : TreeAdvanceToLabelPos ( )
{
ImGuiContext & g = * GImGui ;
g . CurrentWindow - > DC . CursorPos . x + = GetTreeNodeToLabelSpacing ( ) ;
}
// Horizontal distance preceding label when using TreeNode() or Bullet()
float ImGui : : GetTreeNodeToLabelSpacing ( )
{
ImGuiContext & g = * GImGui ;
return g . FontSize + ( g . Style . FramePadding . x * 2.0f ) ;
}
void ImGui : : SetNextTreeNodeOpen ( bool is_open , ImGuiCond cond )
{
ImGuiContext & g = * GImGui ;
if ( g . CurrentWindow - > SkipItems )
return ;
g . NextTreeNodeOpenVal = is_open ;
g . NextTreeNodeOpenCond = cond ? cond : ImGuiCond_Always ;
}
void ImGui : : PushID ( const char * str_id )
{
ImGuiWindow * window = GetCurrentWindowRead ( ) ;
@ -10540,109 +10205,6 @@ bool ImGui::InputInt4(const char* label, int v[4], ImGuiInputTextFlags extra_fla
return InputScalarN ( label , ImGuiDataType_S32 , v , 4 , NULL , NULL , " %d " , extra_flags ) ;
}
// Tip: pass an empty label (e.g. "##dummy") then you can use the space to draw other text or image.
// But you need to make sure the ID is unique, e.g. enclose calls in PushID/PopID or use ##unique_id.
bool ImGui : : Selectable ( const char * label , bool selected , ImGuiSelectableFlags flags , const ImVec2 & size_arg )
{
ImGuiWindow * window = GetCurrentWindow ( ) ;
if ( window - > SkipItems )
return false ;
ImGuiContext & g = * GImGui ;
const ImGuiStyle & style = g . Style ;
if ( ( flags & ImGuiSelectableFlags_SpanAllColumns ) & & window - > DC . ColumnsSet ) // FIXME-OPT: Avoid if vertically clipped.
PopClipRect ( ) ;
ImGuiID id = window - > GetID ( label ) ;
ImVec2 label_size = CalcTextSize ( label , NULL , true ) ;
ImVec2 size ( size_arg . x ! = 0.0f ? size_arg . x : label_size . x , size_arg . y ! = 0.0f ? size_arg . y : label_size . y ) ;
ImVec2 pos = window - > DC . CursorPos ;
pos . y + = window - > DC . CurrentLineTextBaseOffset ;
ImRect bb_inner ( pos , pos + size ) ;
ItemSize ( bb_inner ) ;
// Fill horizontal space.
ImVec2 window_padding = window - > WindowPadding ;
float max_x = ( flags & ImGuiSelectableFlags_SpanAllColumns ) ? GetWindowContentRegionMax ( ) . x : GetContentRegionMax ( ) . x ;
float w_draw = ImMax ( label_size . x , window - > Pos . x + max_x - window_padding . x - window - > DC . CursorPos . x ) ;
ImVec2 size_draw ( ( size_arg . x ! = 0 & & ! ( flags & ImGuiSelectableFlags_DrawFillAvailWidth ) ) ? size_arg . x : w_draw , size_arg . y ! = 0.0f ? size_arg . y : size . y ) ;
ImRect bb ( pos , pos + size_draw ) ;
if ( size_arg . x = = 0.0f | | ( flags & ImGuiSelectableFlags_DrawFillAvailWidth ) )
bb . Max . x + = window_padding . x ;
// Selectables are tightly packed together, we extend the box to cover spacing between selectable.
float spacing_L = ( float ) ( int ) ( style . ItemSpacing . x * 0.5f ) ;
float spacing_U = ( float ) ( int ) ( style . ItemSpacing . y * 0.5f ) ;
float spacing_R = style . ItemSpacing . x - spacing_L ;
float spacing_D = style . ItemSpacing . y - spacing_U ;
bb . Min . x - = spacing_L ;
bb . Min . y - = spacing_U ;
bb . Max . x + = spacing_R ;
bb . Max . y + = spacing_D ;
if ( ! ItemAdd ( bb , ( flags & ImGuiSelectableFlags_Disabled ) ? 0 : id ) )
{
if ( ( flags & ImGuiSelectableFlags_SpanAllColumns ) & & window - > DC . ColumnsSet )
PushColumnClipRect ( ) ;
return false ;
}
// We use NoHoldingActiveID on menus so user can click and _hold_ on a menu then drag to browse child entries
ImGuiButtonFlags button_flags = 0 ;
if ( flags & ImGuiSelectableFlags_NoHoldingActiveID ) button_flags | = ImGuiButtonFlags_NoHoldingActiveID ;
if ( flags & ImGuiSelectableFlags_PressedOnClick ) button_flags | = ImGuiButtonFlags_PressedOnClick ;
if ( flags & ImGuiSelectableFlags_PressedOnRelease ) button_flags | = ImGuiButtonFlags_PressedOnRelease ;
if ( flags & ImGuiSelectableFlags_Disabled ) button_flags | = ImGuiButtonFlags_Disabled ;
if ( flags & ImGuiSelectableFlags_AllowDoubleClick ) button_flags | = ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnDoubleClick ;
bool hovered , held ;
bool pressed = ButtonBehavior ( bb , id , & hovered , & held , button_flags ) ;
if ( flags & ImGuiSelectableFlags_Disabled )
selected = false ;
// Hovering selectable with mouse updates NavId accordingly so navigation can be resumed with gamepad/keyboard (this doesn't happen on most widgets)
if ( pressed | | hovered )
if ( ! g . NavDisableMouseHover & & g . NavWindow = = window & & g . NavLayer = = window - > DC . NavLayerCurrent )
{
g . NavDisableHighlight = true ;
SetNavID ( id , window - > DC . NavLayerCurrent ) ;
}
if ( pressed )
MarkItemEdited ( id ) ;
// Render
if ( hovered | | selected )
{
const ImU32 col = GetColorU32 ( ( held & & hovered ) ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header ) ;
RenderFrame ( bb . Min , bb . Max , col , false , 0.0f ) ;
RenderNavHighlight ( bb , id , ImGuiNavHighlightFlags_TypeThin | ImGuiNavHighlightFlags_NoRounding ) ;
}
if ( ( flags & ImGuiSelectableFlags_SpanAllColumns ) & & window - > DC . ColumnsSet )
{
PushColumnClipRect ( ) ;
bb . Max . x - = ( GetContentRegionMax ( ) . x - max_x ) ;
}
if ( flags & ImGuiSelectableFlags_Disabled ) PushStyleColor ( ImGuiCol_Text , g . Style . Colors [ ImGuiCol_TextDisabled ] ) ;
RenderTextClipped ( bb_inner . Min , bb . Max , label , NULL , & label_size , ImVec2 ( 0.0f , 0.0f ) ) ;
if ( flags & ImGuiSelectableFlags_Disabled ) PopStyleColor ( ) ;
// Automatically close popups
if ( pressed & & ( window - > Flags & ImGuiWindowFlags_Popup ) & & ! ( flags & ImGuiSelectableFlags_DontClosePopups ) & & ! ( window - > DC . ItemFlags & ImGuiItemFlags_SelectableDontClosePopup ) )
CloseCurrentPopup ( ) ;
return pressed ;
}
bool ImGui : : Selectable ( const char * label , bool * p_selected , ImGuiSelectableFlags flags , const ImVec2 & size_arg )
{
if ( Selectable ( label , * p_selected , flags , size_arg ) )
{
* p_selected = ! * p_selected ;
return true ;
}
return false ;
}
// Note: only access 3 floats if ImGuiColorEditFlags_NoAlpha flag is set.
void ImGui : : ColorTooltip ( const char * text , const float * col , ImGuiColorEditFlags flags )
{
@ -12026,49 +11588,6 @@ void ImGui::Unindent(float indent_w)
window - > DC . CursorPos . x = window - > Pos . x + window - > DC . Indent . x + window - > DC . ColumnsOffset . x ;
}
void ImGui : : TreePush ( const char * str_id )
{
ImGuiWindow * window = GetCurrentWindow ( ) ;
Indent ( ) ;
window - > DC . TreeDepth + + ;
PushID ( str_id ? str_id : " #TreePush " ) ;
}
void ImGui : : TreePush ( const void * ptr_id )
{
ImGuiWindow * window = GetCurrentWindow ( ) ;
Indent ( ) ;
window - > DC . TreeDepth + + ;
PushID ( ptr_id ? ptr_id : ( const void * ) " #TreePush " ) ;
}
void ImGui : : TreePushRawID ( ImGuiID id )
{
ImGuiWindow * window = GetCurrentWindow ( ) ;
Indent ( ) ;
window - > DC . TreeDepth + + ;
window - > IDStack . push_back ( id ) ;
}
void ImGui : : TreePop ( )
{
ImGuiContext & g = * GImGui ;
ImGuiWindow * window = g . CurrentWindow ;
Unindent ( ) ;
window - > DC . TreeDepth - - ;
if ( g . NavMoveDir = = ImGuiDir_Left & & g . NavWindow = = window & & NavMoveRequestButNoResultYet ( ) )
if ( g . NavIdIsAlive & & ( window - > DC . TreeDepthMayJumpToParentOnPop & ( 1 < < window - > DC . TreeDepth ) ) )
{
SetNavID ( window - > IDStack . back ( ) , g . NavLayer ) ;
NavMoveRequestCancel ( ) ;
}
window - > DC . TreeDepthMayJumpToParentOnPop & = ( 1 < < window - > DC . TreeDepth ) - 1 ;
IM_ASSERT ( window - > IDStack . Size > 1 ) ; // There should always be 1 element in the IDStack (pushed during window creation). If this triggers you called TreePop/PopID too much.
PopID ( ) ;
}
//-----------------------------------------------------------------------------
// DRAG AND DROP
//-----------------------------------------------------------------------------