mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-11-03 22:51:06 +01:00 
			
		
		
		
	Tab Bar: Made it possible to append to an existing tab bar by calling BeginTabBar()/EndTabBar() again.
This commit is contained in:
		@@ -54,6 +54,7 @@ Breaking Changes:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Other Changes:
 | 
					Other Changes:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Tab Bar: Made it possible to append to an existing tab bar by calling BeginTabBar()/EndTabBar() again.
 | 
				
			||||||
- Docs: Split examples/README.txt into docs/BACKENDS.md and docs/EXAMPLES.md improved them.
 | 
					- Docs: Split examples/README.txt into docs/BACKENDS.md and docs/EXAMPLES.md improved them.
 | 
				
			||||||
- Docs: Consistently renamed all occurences of "binding" and "back-end" to "backend" in comments and docs.
 | 
					- Docs: Consistently renamed all occurences of "binding" and "back-end" to "backend" in comments and docs.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1754,7 +1754,8 @@ struct ImGuiTabBar
 | 
				
			|||||||
    int                 CurrFrameVisible;
 | 
					    int                 CurrFrameVisible;
 | 
				
			||||||
    int                 PrevFrameVisible;
 | 
					    int                 PrevFrameVisible;
 | 
				
			||||||
    ImRect              BarRect;
 | 
					    ImRect              BarRect;
 | 
				
			||||||
    float               LastTabContentHeight;   // Record the height of contents submitted below the tab bar
 | 
					    float               CurrTabsContentsHeight;
 | 
				
			||||||
 | 
					    float               PrevTabsContentsHeight; // Record the height of contents submitted below the tab bar
 | 
				
			||||||
    float               WidthAllTabs;           // Actual width of all tabs (locked during layout)
 | 
					    float               WidthAllTabs;           // Actual width of all tabs (locked during layout)
 | 
				
			||||||
    float               WidthAllTabsIdeal;      // Ideal width if all tabs were visible and not clipped
 | 
					    float               WidthAllTabsIdeal;      // Ideal width if all tabs were visible and not clipped
 | 
				
			||||||
    float               ScrollingAnim;
 | 
					    float               ScrollingAnim;
 | 
				
			||||||
@@ -1770,8 +1771,9 @@ struct ImGuiTabBar
 | 
				
			|||||||
    bool                WantLayout;
 | 
					    bool                WantLayout;
 | 
				
			||||||
    bool                VisibleTabWasSubmitted;
 | 
					    bool                VisibleTabWasSubmitted;
 | 
				
			||||||
    bool                TabsAddedNew;           // Set to true when a new tab item or button has been added to the tab bar during last frame
 | 
					    bool                TabsAddedNew;           // Set to true when a new tab item or button has been added to the tab bar during last frame
 | 
				
			||||||
    short               LastTabItemIdx;         // Index of last BeginTabItem() tab for use by EndTabItem() 
 | 
					    short               LastTabItemIdx;         // Index of last BeginTabItem() tab for use by EndTabItem()
 | 
				
			||||||
    ImVec2              FramePadding;           // style.FramePadding locked at the time of BeginTabBar()
 | 
					    ImVec2              FramePadding;           // style.FramePadding locked at the time of BeginTabBar()
 | 
				
			||||||
 | 
					    ImVec2              TabsContentsMin;
 | 
				
			||||||
    ImGuiTextBuffer     TabsNames;              // For non-docking tab bar we re-append names in a contiguous buffer.
 | 
					    ImGuiTextBuffer     TabsNames;              // For non-docking tab bar we re-append names in a contiguous buffer.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ImGuiTabBar();
 | 
					    ImGuiTabBar();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6805,7 +6805,7 @@ ImGuiTabBar::ImGuiTabBar()
 | 
				
			|||||||
    ID = 0;
 | 
					    ID = 0;
 | 
				
			||||||
    SelectedTabId = NextSelectedTabId = VisibleTabId = 0;
 | 
					    SelectedTabId = NextSelectedTabId = VisibleTabId = 0;
 | 
				
			||||||
    CurrFrameVisible = PrevFrameVisible = -1;
 | 
					    CurrFrameVisible = PrevFrameVisible = -1;
 | 
				
			||||||
    LastTabContentHeight = 0.0f;
 | 
					    CurrTabsContentsHeight = PrevTabsContentsHeight = 0.0f;
 | 
				
			||||||
    WidthAllTabs = WidthAllTabsIdeal = 0.0f;
 | 
					    WidthAllTabs = WidthAllTabsIdeal = 0.0f;
 | 
				
			||||||
    ScrollingAnim = ScrollingTarget = ScrollingTargetDistToVisibility = ScrollingSpeed = 0.0f;
 | 
					    ScrollingAnim = ScrollingTarget = ScrollingTargetDistToVisibility = ScrollingSpeed = 0.0f;
 | 
				
			||||||
    ScrollingRectMinX = ScrollingRectMaxX = 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.CurrentTabBarStack.push_back(GetTabBarRefFromTabBar(tab_bar));
 | 
				
			||||||
    g.CurrentTabBar = tab_bar;
 | 
					    g.CurrentTabBar = tab_bar;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Append with multiple BeginTabBar()/EndTabBar() pairs.
 | 
				
			||||||
    if (tab_bar->CurrFrameVisible == g.FrameCount)
 | 
					    if (tab_bar->CurrFrameVisible == g.FrameCount)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        //IMGUI_DEBUG_LOG("BeginTabBarEx already called this frame\n", g.FrameCount);
 | 
					        window->DC.CursorPos = tab_bar->TabsContentsMin;
 | 
				
			||||||
        IM_ASSERT(0);
 | 
					 | 
				
			||||||
        return true;
 | 
					        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->WantLayout = true; // Layout will be done on the first call to ItemTab()
 | 
				
			||||||
    tab_bar->PrevFrameVisible = tab_bar->CurrFrameVisible;
 | 
					    tab_bar->PrevFrameVisible = tab_bar->CurrFrameVisible;
 | 
				
			||||||
    tab_bar->CurrFrameVisible = g.FrameCount;
 | 
					    tab_bar->CurrFrameVisible = g.FrameCount;
 | 
				
			||||||
 | 
					    tab_bar->PrevTabsContentsHeight = tab_bar->CurrTabsContentsHeight;
 | 
				
			||||||
 | 
					    tab_bar->CurrTabsContentsHeight = 0.0f;
 | 
				
			||||||
    tab_bar->FramePadding = g.Style.FramePadding;
 | 
					    tab_bar->FramePadding = g.Style.FramePadding;
 | 
				
			||||||
    tab_bar->TabsActiveCount = 0;
 | 
					    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
 | 
					    // 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;
 | 
					    tab_bar->TabsContentsMin.x = tab_bar->BarRect.Min.x;
 | 
				
			||||||
    window->DC.CursorPos.y = tab_bar->BarRect.Max.y + g.Style.ItemSpacing.y;
 | 
					    tab_bar->TabsContentsMin.y = tab_bar->BarRect.Max.y + g.Style.ItemSpacing.y;
 | 
				
			||||||
 | 
					    window->DC.CursorPos = tab_bar->TabsContentsMin;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Draw separator
 | 
					    // Draw separator
 | 
				
			||||||
    const ImU32 col = GetColorU32((flags & ImGuiTabBarFlags_IsFocused) ? ImGuiCol_TabActive : ImGuiCol_TabUnfocusedActive);
 | 
					    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()!");
 | 
					        IM_ASSERT_USER_ERROR(tab_bar != NULL, "Mismatched BeginTabBar()/EndTabBar()!");
 | 
				
			||||||
        return;
 | 
					        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);
 | 
					        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().
 | 
					    // 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);
 | 
					    const bool tab_bar_appearing = (tab_bar->PrevFrameVisible + 1 < g.FrameCount);
 | 
				
			||||||
    if (tab_bar->VisibleTabWasSubmitted || tab_bar->VisibleTabId == 0 || tab_bar_appearing)
 | 
					    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
 | 
					    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)
 | 
					    if ((tab_bar->Flags & ImGuiTabBarFlags_DockNode) == 0)
 | 
				
			||||||
        PopID();
 | 
					        PopID();
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user