@ -6747,7 +6747,7 @@ void ImGui::End()
IM_ASSERT ( g . CurrentWindowStack . Size > 0 ) ;
// Error checking: verify that user doesn't directly call End() on a child window.
if ( ( window - > Flags & ImGuiWindowFlags_ChildWindow ) & & ! window - > DockIsActive )
if ( ( window - > Flags & ImGuiWindowFlags_ChildWindow ) & & ! ( window - > Flags & ImGuiWindowFlags_DockNodeHost ) & & ! window - > DockIsActive )
IM_ASSERT_USER_ERROR ( g . WithinEndChild , " Must call EndChild() and not End()! " ) ;
// Close anything that is open
@ -12705,7 +12705,7 @@ static void ImGui::DockNodeMoveWindows(ImGuiDockNode* dst_node, ImGuiDockNode* s
IM_ASSERT ( src_node & & dst_node & & dst_node ! = src_node ) ;
ImGuiTabBar * src_tab_bar = src_node - > TabBar ;
if ( src_tab_bar ! = NULL )
IM_ASSERT ( src_node - > Windows . Size = = src_node - > TabBar - > Tabs . Size ) ;
IM_ASSERT ( src_node - > Windows . Size < = src_node - > TabBar - > Tabs . Size ) ;
// If the dst_node is empty we can just move the entire tab bar (to preserve selection, scrolling, etc.)
bool move_tab_bar = ( src_tab_bar ! = NULL ) & & ( dst_node - > TabBar = = NULL ) ;
@ -12717,11 +12717,14 @@ static void ImGui::DockNodeMoveWindows(ImGuiDockNode* dst_node, ImGuiDockNode* s
for ( int n = 0 ; n < src_node - > Windows . Size ; n + + )
{
ImGuiWindow * window = src_tab_bar ? src_tab_bar - > Tabs [ n ] . Window : src_node - > Windows [ n ] ;
// DockNode's TabBar may have non-window Tabs manually appended by user
if ( ImGuiWindow * window = src_tab_bar ? src_tab_bar - > Tabs [ n ] . Window : src_node - > Windows [ n ] )
{
window - > DockNode = NULL ;
window - > DockIsActive = false ;
DockNodeAddWindow ( dst_node , window , move_tab_bar ? false : true ) ;
}
}
src_node - > Windows . clear ( ) ;
if ( ! move_tab_bar & & src_node - > TabBar )
@ -13233,9 +13236,9 @@ static ImGuiID ImGui::DockNodeUpdateWindowMenu(ImGuiDockNode* node, ImGuiTabBar*
for ( int tab_n = 0 ; tab_n < tab_bar - > Tabs . Size ; tab_n + + )
{
ImGuiTabItem * tab = & tab_bar - > Tabs [ tab_n ] ;
if ( tab - > Window = = NULL )
if ( tab - > Flags & ImGuiTabItemFlags_Button )
continue ;
if ( Selectable ( tab - > Window - > Name , tab - > ID = = tab_bar - > SelectedTabId ) )
if ( Selectable ( tab _bar- > GetTabName ( tab ) , tab - > ID = = tab_bar - > SelectedTabId ) )
ret_tab_id = tab - > ID ;
SameLine ( ) ;
Text ( " " ) ;
@ -13251,6 +13254,8 @@ bool ImGui::DockNodeBeginAmendTabBar(ImGuiDockNode* node)
{
if ( node - > TabBar = = NULL | | node - > HostWindow = = NULL )
return false ;
if ( node - > SharedFlags & ImGuiDockNodeFlags_KeepAliveOnly )
return false ;
Begin ( node - > HostWindow - > Name ) ;
PushOverrideID ( node - > ID ) ;
bool ret = BeginTabBarEx ( node - > TabBar , node - > TabBar - > BarRect , node - > TabBar - > Flags , node ) ;
@ -13484,7 +13489,7 @@ static void ImGui::DockNodeUpdateTabBar(ImGuiDockNode* node, ImGuiWindow* host_w
// Forward moving request to selected window
if ( ImGuiTabItem * tab = TabBarFindTabByID ( tab_bar , tab_bar - > SelectedTabId ) )
StartMouseMovingWindowOrNode ( tab - > Window , node , false ) ;
StartMouseMovingWindowOrNode ( tab - > Window ? tab - > Window : node - > HostWindow , node , false ) ;
}
}
@ -13500,6 +13505,7 @@ static void ImGui::DockNodeUpdateTabBar(ImGuiDockNode* node, ImGuiWindow* host_w
// Apply navigation focus
if ( focus_tab_id ! = 0 )
if ( ImGuiTabItem * tab = TabBarFindTabByID ( tab_bar , focus_tab_id ) )
if ( tab - > Window )
{
FocusWindow ( tab - > Window ) ;
NavInitWindow ( tab - > Window , false ) ;
@ -13819,25 +13825,29 @@ static void ImGui::DockNodePreviewDockRender(ImGuiWindow* host_window, ImGuiDock
// Draw tab shape/label preview (payload may be a loose window or a host window carrying multiple tabbed windows)
if ( root_payload - > DockNodeAsHost )
IM_ASSERT ( root_payload - > DockNodeAsHost - > Windows . Size = = root_payload - > DockNodeAsHost - > TabBar - > Tabs . Size ) ;
const int payload_count = root_payload - > DockNodeAsHost ? root_payload - > DockNodeAsHost - > TabBar - > Tabs . Size : 1 ;
IM_ASSERT ( root_payload - > DockNodeAsHost - > Windows . Size < = root_payload - > DockNodeAsHost - > TabBar - > Tabs . Size ) ;
ImGuiTabBar * tab_bar_with_payload = root_payload - > DockNodeAsHost ? root_payload - > DockNodeAsHost - > TabBar : NULL ;
const int payload_count = tab_bar_with_payload ? tab_bar_with_payload - > Tabs . Size : 1 ;
for ( int payload_n = 0 ; payload_n < payload_count ; payload_n + + )
{
// Calculate the tab bounding box for each payload window
ImGuiWindow * payload = root_payload - > DockNodeAsHost ? root_payload - > DockNodeAsHost - > TabBar - > Tabs [ payload_n ] . Window : root_payload ;
if ( ! DockNodeIsDropAllowedOne ( payload , host_window ) )
// DockNode's TabBar may have non-window Tabs manually appended by user
ImGuiWindow * payload_window = tab_bar_with_payload ? tab_bar_with_payload - > Tabs [ payload_n ] . Window : root_payload ;
if ( tab_bar_with_payload & & payload_window = = NULL )
continue ;
if ( ! DockNodeIsDropAllowedOne ( payload_window , host_window ) )
continue ;
ImVec2 tab_size = TabItemCalcSize ( payload - > Name , payload - > HasCloseButton ) ;
// Calculate the tab bounding box for each payload window
ImVec2 tab_size = TabItemCalcSize ( payload_window - > Name , payload_window - > HasCloseButton ) ;
ImRect tab_bb ( tab_pos . x , tab_pos . y , tab_pos . x + tab_size . x , tab_pos . y + tab_size . y ) ;
tab_pos . x + = tab_size . x + g . Style . ItemInnerSpacing . x ;
for ( int overlay_n = 0 ; overlay_n < overlay_draw_lists_count ; overlay_n + + )
{
ImGuiTabItemFlags tab_flags = ImGuiTabItemFlags_Preview | ( ( payload - > Flags & ImGuiWindowFlags_UnsavedDocument ) ? ImGuiTabItemFlags_UnsavedDocument : 0 ) ;
ImGuiTabItemFlags tab_flags = ImGuiTabItemFlags_Preview | ( ( payload _window - > Flags & ImGuiWindowFlags_UnsavedDocument ) ? ImGuiTabItemFlags_UnsavedDocument : 0 ) ;
if ( ! tab_bar_rect . Contains ( tab_bb ) )
overlay_draw_lists [ overlay_n ] - > PushClipRect ( tab_bar_rect . Min , tab_bar_rect . Max ) ;
TabItemBackground ( overlay_draw_lists [ overlay_n ] , tab_bb , tab_flags , overlay_col_tabs ) ;
TabItemLabelAndCloseButton ( overlay_draw_lists [ overlay_n ] , tab_bb , tab_flags , g . Style . FramePadding , payload - > Name , 0 , 0 , false ) ;
TabItemLabelAndCloseButton ( overlay_draw_lists [ overlay_n ] , tab_bb , tab_flags , g . Style . FramePadding , payload _window - > Name , 0 , 0 , false ) ;
if ( ! tab_bar_rect . Contains ( tab_bb ) )
overlay_draw_lists [ overlay_n ] - > PopClipRect ( ) ;
}
@ -14358,10 +14368,8 @@ void ImGui::DockSpace(ImGuiID id, const ImVec2& size_arg, ImGuiDockNodeFlags fla
// Update the node
DockNodeUpdate ( node ) ;
g . WithinEndChild = true ;
End ( ) ;
ItemSize ( size ) ;
g . WithinEndChild = false ;
}
// Tips: Use with ImGuiDockNodeFlags_PassthruCentralNode!
@ -15881,7 +15889,8 @@ void ImGui::ShowMetricsWindow(bool* p_open)
for ( int tab_n = 0 ; tab_n < ImMin ( tab_bar - > Tabs . Size , 3 ) ; tab_n + + )
{
ImGuiTabItem * tab = & tab_bar - > Tabs [ tab_n ] ;
p + = ImFormatString ( p , buf_end - p , " %s'%s' " , tab_n > 0 ? " , " : " " , ( tab - > Window | | tab - > NameOffset ! = - 1 ) ? tab_bar - > GetTabName ( tab ) : " ??? " ) ;
p + = ImFormatString ( p , buf_end - p , " %s'%s' " ,
tab_n > 0 ? " , " : " " , ( tab - > Window | | tab - > NameOffset ! = - 1 ) ? tab_bar - > GetTabName ( tab ) : " ??? " ) ;
}
p + = ImFormatString ( p , buf_end - p , ( tab_bar - > Tabs . Size > 3 ) ? " ... } " : " } " ) ;
if ( ! is_active ) { PushStyleColor ( ImGuiCol_Text , GetStyleColorVec4 ( ImGuiCol_TextDisabled ) ) ; }
@ -15902,7 +15911,8 @@ void ImGui::ShowMetricsWindow(bool* p_open)
ImGui : : PushID ( tab ) ;
if ( ImGui : : SmallButton ( " < " ) ) { TabBarQueueReorder ( tab_bar , tab , - 1 ) ; } ImGui : : SameLine ( 0 , 2 ) ;
if ( ImGui : : SmallButton ( " > " ) ) { TabBarQueueReorder ( tab_bar , tab , + 1 ) ; } ImGui : : SameLine ( ) ;
ImGui : : Text ( " %02d%c Tab 0x%08X '%s' Offset: %.1f, Width: %.1f/%.1f " , tab_n , ( tab - > ID = = tab_bar - > SelectedTabId ) ? ' * ' : ' ' , tab - > ID , ( tab - > Window | | tab - > NameOffset ! = - 1 ) ? tab_bar - > GetTabName ( tab ) : " ??? " , tab - > Offset , tab - > Width , tab - > ContentWidth ) ;
ImGui : : Text ( " %02d%c Tab 0x%08X '%s' Offset: %.1f, Width: %.1f/%.1f " ,
tab_n , ( tab - > ID = = tab_bar - > SelectedTabId ) ? ' * ' : ' ' , tab - > ID , ( tab - > Window | | tab - > NameOffset ! = - 1 ) ? tab_bar - > GetTabName ( tab ) : " ??? " , tab - > Offset , tab - > Width , tab - > ContentWidth ) ;
ImGui : : PopID ( ) ;
}
ImGui : : TreePop ( ) ;