@ -6805,7 +6805,7 @@ ImGuiTabBar::ImGuiTabBar()
ID = 0 ;
SelectedTabId = NextSelectedTabId = VisibleTabId = 0 ;
CurrFrameVisible = PrevFrameVisible = - 1 ;
LastTabContent Height = 0.0f ;
CurrTabsContentsHeight = PrevTabsContents Height = 0.0f ;
WidthAllTabs = WidthAllTabsIdeal = 0.0f ;
ScrollingAnim = ScrollingTarget = ScrollingTargetDistToVisibility = ScrollingSpeed = 0.0f ;
ScrollingRectMinX = ScrollingRectMaxX = 0.0f ;
@ -6877,10 +6877,10 @@ bool ImGui::BeginTabBarEx(ImGuiTabBar* tab_bar, const ImRect& tab_bar_bb, ImG
g . CurrentTabBarStack . push_back ( GetTabBarRefFromTabBar ( tab_bar ) ) ;
g . CurrentTabBar = tab_bar ;
// Append with multiple BeginTabBar()/EndTabBar() pairs.
if ( tab_bar - > CurrFrameVisible = = g . FrameCount )
{
//IMGUI_DEBUG_LOG("BeginTabBarEx already called this frame\n", g.FrameCount);
IM_ASSERT ( 0 ) ;
window - > DC . CursorPos = tab_bar - > TabsContentsMin ;
return true ;
}
@ -6899,12 +6899,15 @@ bool ImGui::BeginTabBarEx(ImGuiTabBar* tab_bar, const ImRect& tab_bar_bb, ImG
tab_bar - > WantLayout = true ; // Layout will be done on the first call to ItemTab()
tab_bar - > PrevFrameVisible = tab_bar - > CurrFrameVisible ;
tab_bar - > CurrFrameVisible = g . FrameCount ;
tab_bar - > PrevTabsContentsHeight = tab_bar - > CurrTabsContentsHeight ;
tab_bar - > CurrTabsContentsHeight = 0.0f ;
tab_bar - > FramePadding = g . Style . FramePadding ;
tab_bar - > TabsActiveCount = 0 ;
// Set cursor pos in a way which only be used in the off-chance the user erroneously submits item before BeginTabItem(): items will overlap
window - > DC . CursorPos . x = tab_bar - > BarRect . Min . x ;
window - > DC . CursorPos . y = tab_bar - > BarRect . Max . y + g . Style . ItemSpacing . y ;
tab_bar - > TabsContentsMin . x = tab_bar - > BarRect . Min . x ;
tab_bar - > TabsContentsMin . y = tab_bar - > BarRect . Max . y + g . Style . ItemSpacing . y ;
window - > DC . CursorPos = tab_bar - > TabsContentsMin ;
// Draw separator
const ImU32 col = GetColorU32 ( ( flags & ImGuiTabBarFlags_IsFocused ) ? ImGuiCol_TabActive : ImGuiCol_TabUnfocusedActive ) ;
@ -6930,15 +6933,22 @@ void ImGui::EndTabBar()
IM_ASSERT_USER_ERROR ( tab_bar ! = NULL , " Mismatched BeginTabBar()/EndTabBar()! " ) ;
return ;
}
if ( tab_bar - > WantLayout ) // Fallback in case no TabItem have been submitted
// Fallback in case no TabItem have been submitted
if ( tab_bar - > WantLayout )
TabBarLayout ( tab_bar ) ;
// Restore the last visible height if no tab is visible, this reduce vertical flicker/movement when a tabs gets removed without calling SetTabItemClosed().
const bool tab_bar_appearing = ( tab_bar - > PrevFrameVisible + 1 < g . FrameCount ) ;
if ( tab_bar - > VisibleTabWasSubmitted | | tab_bar - > VisibleTabId = = 0 | | tab_bar_appearing )
tab_bar - > LastTabContentHeight = ImMax ( window - > DC . CursorPos . y - tab_bar - > BarRect . Max . y , 0.0f ) ;
{
tab_bar - > CurrTabsContentsHeight = ImMax ( window - > DC . CursorPos . y - tab_bar - > BarRect . Max . y , tab_bar - > CurrTabsContentsHeight ) ;
window - > DC . CursorPos . y = tab_bar - > BarRect . Max . y + tab_bar - > CurrTabsContentsHeight ;
}
else
window - > DC . CursorPos . y = tab_bar - > BarRect . Max . y + tab_bar - > LastTabContentHeight ;
{
window - > DC . CursorPos . y = tab_bar - > BarRect . Max . y + tab_bar - > PrevTabsContentsHeight ;
}
if ( ( tab_bar - > Flags & ImGuiTabBarFlags_DockNode ) = = 0 )
PopID ( ) ;