mirror of
https://github.com/ocornut/imgui.git
synced 2024-11-12 02:00:58 +01:00
Tab Bar: Rename named sections members into array. Various tidying up. (#3291)
This commit is contained in:
parent
7ac16c02cc
commit
5e5f25e2dd
@ -10563,10 +10563,10 @@ void ImGui::ShowMetricsWindow(bool* p_open)
|
|||||||
{
|
{
|
||||||
ImDrawList* draw_list = ImGui::GetForegroundDrawList();
|
ImDrawList* draw_list = ImGui::GetForegroundDrawList();
|
||||||
draw_list->AddRect(tab_bar->BarRect.Min, tab_bar->BarRect.Max, IM_COL32(255, 255, 0, 255));
|
draw_list->AddRect(tab_bar->BarRect.Min, tab_bar->BarRect.Max, IM_COL32(255, 255, 0, 255));
|
||||||
if (tab_bar->LeadingSection.Width > 0.0f)
|
if (tab_bar->Sections[0].Width > 0.0f)
|
||||||
draw_list->AddLine(ImVec2(tab_bar->BarRect.Min.x + tab_bar->LeadingSection.Width, tab_bar->BarRect.Min.y), ImVec2(tab_bar->BarRect.Min.x + tab_bar->LeadingSection.Width, tab_bar->BarRect.Max.y), IM_COL32(0, 255, 0, 255));
|
draw_list->AddLine(ImVec2(tab_bar->BarRect.Min.x + tab_bar->Sections[0].Width, tab_bar->BarRect.Min.y), ImVec2(tab_bar->BarRect.Min.x + tab_bar->Sections[0].Width, tab_bar->BarRect.Max.y), IM_COL32(0, 255, 0, 255));
|
||||||
if (tab_bar->TrailingSection.Width > 0.0f)
|
if (tab_bar->Sections[2].Width > 0.0f)
|
||||||
draw_list->AddLine(ImVec2(tab_bar->BarRect.Max.x - tab_bar->TrailingSection.Width, tab_bar->BarRect.Min.y), ImVec2(tab_bar->BarRect.Max.x - tab_bar->TrailingSection.Width, tab_bar->BarRect.Max.y), IM_COL32(0, 255, 0, 255));
|
draw_list->AddLine(ImVec2(tab_bar->BarRect.Max.x - tab_bar->Sections[2].Width, tab_bar->BarRect.Min.y), ImVec2(tab_bar->BarRect.Max.x - tab_bar->Sections[2].Width, tab_bar->BarRect.Max.y), IM_COL32(0, 255, 0, 255));
|
||||||
}
|
}
|
||||||
if (open)
|
if (open)
|
||||||
{
|
{
|
||||||
|
@ -2363,7 +2363,7 @@ static void ShowDemoWindowLayout()
|
|||||||
for (int i = 0; i < 3; i++)
|
for (int i = 0; i < 3; i++)
|
||||||
active_tabs.push_back(next_tab_id++);
|
active_tabs.push_back(next_tab_id++);
|
||||||
|
|
||||||
static ImGuiTabBarFlags tab_bar_flags = ImGuiTabBarFlags_Reorderable | ImGuiTabBarFlags_FittingPolicyResizeDown;
|
static ImGuiTabBarFlags tab_bar_flags = ImGuiTabBarFlags_AutoSelectNewTabs | ImGuiTabBarFlags_Reorderable | ImGuiTabBarFlags_FittingPolicyResizeDown;
|
||||||
ImGui::CheckboxFlags("ImGuiTabBarFlags_TabListPopupButton", (unsigned int*)&tab_bar_flags, ImGuiTabBarFlags_TabListPopupButton);
|
ImGui::CheckboxFlags("ImGuiTabBarFlags_TabListPopupButton", (unsigned int*)&tab_bar_flags, ImGuiTabBarFlags_TabListPopupButton);
|
||||||
if (ImGui::CheckboxFlags("ImGuiTabBarFlags_FittingPolicyResizeDown", (unsigned int*)&tab_bar_flags, ImGuiTabBarFlags_FittingPolicyResizeDown))
|
if (ImGui::CheckboxFlags("ImGuiTabBarFlags_FittingPolicyResizeDown", (unsigned int*)&tab_bar_flags, ImGuiTabBarFlags_FittingPolicyResizeDown))
|
||||||
tab_bar_flags &= ~(ImGuiTabBarFlags_FittingPolicyMask_ ^ ImGuiTabBarFlags_FittingPolicyResizeDown);
|
tab_bar_flags &= ~(ImGuiTabBarFlags_FittingPolicyMask_ ^ ImGuiTabBarFlags_FittingPolicyResizeDown);
|
||||||
|
@ -1725,14 +1725,14 @@ struct ImGuiTabItem
|
|||||||
ImGuiTabItem() { ID = 0; Flags = ImGuiTabItemFlags_None; LastFrameVisible = LastFrameSelected = -1; NameOffset = -1; Offset = Width = ContentWidth = 0.0f; BeginOrder = -1; IndexDuringLayout = -1; WantClose = false; }
|
ImGuiTabItem() { ID = 0; Flags = ImGuiTabItemFlags_None; LastFrameVisible = LastFrameSelected = -1; NameOffset = -1; Offset = Width = ContentWidth = 0.0f; BeginOrder = -1; IndexDuringLayout = -1; WantClose = false; }
|
||||||
};
|
};
|
||||||
|
|
||||||
struct TabBarLayoutSection
|
struct ImGuiTabBarSection
|
||||||
{
|
{
|
||||||
ImGuiTabItem* Tabs; // Pointer to the first tab_bar->Tabs matching the section
|
int TabStartIndex;
|
||||||
int TabCount;
|
int TabCount;
|
||||||
float Width;
|
float Width;
|
||||||
float WidthIdeal;
|
float WidthIdeal;
|
||||||
float InnerSpacing; // Horizontal ItemInnerSpacing, used by Leading/Trailing section, to correctly offset from Central section
|
float InnerSpacing; // Horizontal ItemInnerSpacing, used by Leading/Trailing section, to correctly offset from Central section
|
||||||
TabBarLayoutSection() { Tabs = NULL; TabCount = 0; Width = 0.0f; WidthIdeal = 0.0f; InnerSpacing = 0.0f; }
|
ImGuiTabBarSection(){ memset(this, 0, sizeof(*this)); }
|
||||||
};
|
};
|
||||||
|
|
||||||
// Storage for a tab bar (sizeof() 92~96 bytes)
|
// Storage for a tab bar (sizeof() 92~96 bytes)
|
||||||
@ -1757,9 +1757,7 @@ struct ImGuiTabBar
|
|||||||
ImGuiID ReorderRequestTabId;
|
ImGuiID ReorderRequestTabId;
|
||||||
ImS8 ReorderRequestDir;
|
ImS8 ReorderRequestDir;
|
||||||
ImS8 TabsActiveCount; // Number of tabs submitted this frame.
|
ImS8 TabsActiveCount; // Number of tabs submitted this frame.
|
||||||
TabBarLayoutSection LeadingSection;
|
ImGuiTabBarSection Sections[3];
|
||||||
TabBarLayoutSection CentralSection;
|
|
||||||
TabBarLayoutSection TrailingSection;
|
|
||||||
bool WantLayout;
|
bool WantLayout;
|
||||||
bool VisibleTabWasSubmitted;
|
bool VisibleTabWasSubmitted;
|
||||||
short LastTabItemIdx; // Index of last BeginTabItem() tab for use by EndTabItem()
|
short LastTabItemIdx; // Index of last BeginTabItem() tab for use by EndTabItem()
|
||||||
|
@ -6786,7 +6786,6 @@ bool ImGui::MenuItem(const char* label, const char* shortcut, bool* p_selected,
|
|||||||
// - EndTabBar()
|
// - EndTabBar()
|
||||||
// - TabBarLayout() [Internal]
|
// - TabBarLayout() [Internal]
|
||||||
// - TabBarLayoutComputeTabsWidth() [Internal]
|
// - TabBarLayoutComputeTabsWidth() [Internal]
|
||||||
// - TabBarLayoutActiveTabsForSection() [Internal]
|
|
||||||
// - TabBarCalcTabID() [Internal]
|
// - TabBarCalcTabID() [Internal]
|
||||||
// - TabBarCalcMaxTabWidth() [Internal]
|
// - TabBarCalcMaxTabWidth() [Internal]
|
||||||
// - TabBarFindTabById() [Internal]
|
// - TabBarFindTabById() [Internal]
|
||||||
@ -6803,7 +6802,6 @@ namespace ImGui
|
|||||||
{
|
{
|
||||||
static void TabBarLayout(ImGuiTabBar* tab_bar);
|
static void TabBarLayout(ImGuiTabBar* tab_bar);
|
||||||
static void TabBarLayoutComputeTabsWidth(ImGuiTabBar* tab_bar, bool scrolling_buttons, float scrolling_buttons_width);
|
static void TabBarLayoutComputeTabsWidth(ImGuiTabBar* tab_bar, bool scrolling_buttons, float scrolling_buttons_width);
|
||||||
static float TabBarLayoutActiveTabsForSection(ImGuiTabBar* tab_bar, TabBarLayoutSection* section, float next_tab_offset);
|
|
||||||
static ImU32 TabBarCalcTabID(ImGuiTabBar* tab_bar, const char* label);
|
static ImU32 TabBarCalcTabID(ImGuiTabBar* tab_bar, const char* label);
|
||||||
static float TabBarCalcMaxTabWidth();
|
static float TabBarCalcMaxTabWidth();
|
||||||
static float TabBarScrollClamp(ImGuiTabBar* tab_bar, float scrolling);
|
static float TabBarScrollClamp(ImGuiTabBar* tab_bar, float scrolling);
|
||||||
@ -6828,14 +6826,14 @@ ImGuiTabBar::ImGuiTabBar()
|
|||||||
LastTabItemIdx = -1;
|
LastTabItemIdx = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int IMGUI_CDECL TabItemComparerByPositionAndIndex(const void* lhs, const void* rhs)
|
static int IMGUI_CDECL TabItemComparerBySection(const void* lhs, const void* rhs)
|
||||||
{
|
{
|
||||||
const ImGuiTabItem* a = (const ImGuiTabItem*)lhs;
|
const ImGuiTabItem* a = (const ImGuiTabItem*)lhs;
|
||||||
const ImGuiTabItem* b = (const ImGuiTabItem*)rhs;
|
const ImGuiTabItem* b = (const ImGuiTabItem*)rhs;
|
||||||
const int a_position = (a->Flags & ImGuiTabItemFlags_Leading) ? 0 : (a->Flags & ImGuiTabItemFlags_Trailing) ? 2 : 1;
|
const int a_section = (a->Flags & ImGuiTabItemFlags_Leading) ? 0 : (a->Flags & ImGuiTabItemFlags_Trailing) ? 2 : 1;
|
||||||
const int b_position = (b->Flags & ImGuiTabItemFlags_Leading) ? 0 : (b->Flags & ImGuiTabItemFlags_Trailing) ? 2 : 1;
|
const int b_section = (b->Flags & ImGuiTabItemFlags_Leading) ? 0 : (b->Flags & ImGuiTabItemFlags_Trailing) ? 2 : 1;
|
||||||
if (a_position != b_position)
|
if (a_section != b_section)
|
||||||
return a_position - b_position;
|
return a_section - b_section;
|
||||||
return (int)(a->IndexDuringLayout - b->IndexDuringLayout);
|
return (int)(a->IndexDuringLayout - b->IndexDuringLayout);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6972,7 +6970,7 @@ static void ImGui::TabBarLayout(ImGuiTabBar* tab_bar)
|
|||||||
// Garbage collect by compacting list
|
// Garbage collect by compacting list
|
||||||
int tab_dst_n = 0;
|
int tab_dst_n = 0;
|
||||||
bool need_sort_trailing_or_leading = false;
|
bool need_sort_trailing_or_leading = false;
|
||||||
tab_bar->LeadingSection.TabCount = tab_bar->CentralSection.TabCount = tab_bar->TrailingSection.TabCount = 0;
|
tab_bar->Sections[0].TabCount = tab_bar->Sections[1].TabCount = tab_bar->Sections[2].TabCount = 0;
|
||||||
for (int tab_src_n = 0; tab_src_n < tab_bar->Tabs.Size; tab_src_n++)
|
for (int tab_src_n = 0; tab_src_n < tab_bar->Tabs.Size; tab_src_n++)
|
||||||
{
|
{
|
||||||
ImGuiTabItem* tab = &tab_bar->Tabs[tab_src_n];
|
ImGuiTabItem* tab = &tab_bar->Tabs[tab_src_n];
|
||||||
@ -6987,20 +6985,19 @@ static void ImGui::TabBarLayout(ImGuiTabBar* tab_bar)
|
|||||||
if (tab_dst_n != tab_src_n)
|
if (tab_dst_n != tab_src_n)
|
||||||
tab_bar->Tabs[tab_dst_n] = tab_bar->Tabs[tab_src_n];
|
tab_bar->Tabs[tab_dst_n] = tab_bar->Tabs[tab_src_n];
|
||||||
|
|
||||||
tab_bar->Tabs[tab_dst_n].IndexDuringLayout = (ImS8)tab_dst_n;
|
tab = &tab_bar->Tabs[tab_dst_n];
|
||||||
bool is_leading = (tab_bar->Tabs[tab_dst_n].Flags & ImGuiTabItemFlags_Leading) != 0;
|
tab->IndexDuringLayout = (ImS8)tab_dst_n;
|
||||||
bool is_trailing = (tab_bar->Tabs[tab_dst_n].Flags & ImGuiTabItemFlags_Trailing) != 0;
|
|
||||||
if (tab_dst_n > 0 && is_leading && !(tab_bar->Tabs[tab_dst_n - 1].Flags & ImGuiTabItemFlags_Leading))
|
ImGuiTabItem* prev_tab = &tab_bar->Tabs[tab_dst_n - 1];
|
||||||
|
int curr_tab_section_n = (tab->Flags & ImGuiTabItemFlags_Leading) ? 0 : (tab->Flags & ImGuiTabItemFlags_Trailing) ? 2 : 1;
|
||||||
|
int prev_tab_section_n = (prev_tab->Flags & ImGuiTabItemFlags_Leading) ? 0 : (prev_tab->Flags & ImGuiTabItemFlags_Trailing) ? 2 : 1;
|
||||||
|
|
||||||
|
if (tab_dst_n > 0 && curr_tab_section_n == 0 && prev_tab_section_n != 0)
|
||||||
need_sort_trailing_or_leading = true;
|
need_sort_trailing_or_leading = true;
|
||||||
if (tab_dst_n > 0 && (tab_bar->Tabs[tab_dst_n - 1].Flags & ImGuiTabItemFlags_Trailing) && !is_trailing)
|
if (tab_dst_n > 0 && prev_tab_section_n == 2 && curr_tab_section_n != 2)
|
||||||
need_sort_trailing_or_leading = true;
|
need_sort_trailing_or_leading = true;
|
||||||
|
|
||||||
if (is_leading)
|
tab_bar->Sections[curr_tab_section_n].TabCount++;
|
||||||
tab_bar->LeadingSection.TabCount++;
|
|
||||||
else if (is_trailing)
|
|
||||||
tab_bar->TrailingSection.TabCount++;
|
|
||||||
else
|
|
||||||
tab_bar->CentralSection.TabCount++;
|
|
||||||
|
|
||||||
tab_dst_n++;
|
tab_dst_n++;
|
||||||
}
|
}
|
||||||
@ -7008,11 +7005,11 @@ static void ImGui::TabBarLayout(ImGuiTabBar* tab_bar)
|
|||||||
tab_bar->Tabs.resize(tab_dst_n);
|
tab_bar->Tabs.resize(tab_dst_n);
|
||||||
|
|
||||||
if (need_sort_trailing_or_leading)
|
if (need_sort_trailing_or_leading)
|
||||||
ImQsort(tab_bar->Tabs.Data, tab_bar->Tabs.Size, sizeof(ImGuiTabItem), TabItemComparerByPositionAndIndex);
|
ImQsort(tab_bar->Tabs.Data, tab_bar->Tabs.Size, sizeof(ImGuiTabItem), TabItemComparerBySection);
|
||||||
|
|
||||||
tab_bar->LeadingSection.Tabs = tab_bar->Tabs.Data;
|
tab_bar->Sections[0].TabStartIndex = 0;
|
||||||
tab_bar->CentralSection.Tabs = tab_bar->Tabs.Data + tab_bar->LeadingSection.TabCount;
|
tab_bar->Sections[1].TabStartIndex = tab_bar->Sections[0].TabStartIndex + tab_bar->Sections[0].TabCount;
|
||||||
tab_bar->TrailingSection.Tabs = tab_bar->Tabs.Data + tab_bar->LeadingSection.TabCount + tab_bar->CentralSection.TabCount;
|
tab_bar->Sections[2].TabStartIndex = tab_bar->Sections[1].TabStartIndex + tab_bar->Sections[1].TabCount;
|
||||||
|
|
||||||
// Setup next selected tab
|
// Setup next selected tab
|
||||||
ImGuiID scroll_track_selected_tab_id = 0;
|
ImGuiID scroll_track_selected_tab_id = 0;
|
||||||
@ -7042,7 +7039,7 @@ static void ImGui::TabBarLayout(ImGuiTabBar* tab_bar)
|
|||||||
g.ShrinkWidthBuffer.resize(tab_bar->Tabs.Size);
|
g.ShrinkWidthBuffer.resize(tab_bar->Tabs.Size);
|
||||||
|
|
||||||
// Compute ideal widths
|
// Compute ideal widths
|
||||||
tab_bar->LeadingSection.Width = tab_bar->CentralSection.Width = tab_bar->TrailingSection.Width = 0.0f;
|
tab_bar->Sections[0].Width = tab_bar->Sections[1].Width = tab_bar->Sections[2].Width = 0.0f;
|
||||||
const float tab_max_width = TabBarCalcMaxTabWidth();
|
const float tab_max_width = TabBarCalcMaxTabWidth();
|
||||||
|
|
||||||
ImGuiTabItem* most_recently_selected_tab = NULL;
|
ImGuiTabItem* most_recently_selected_tab = NULL;
|
||||||
@ -7066,23 +7063,18 @@ static void ImGui::TabBarLayout(ImGuiTabBar* tab_bar)
|
|||||||
const bool has_close_button = (tab->Flags & ImGuiTabItemFlags_NoCloseButton) ? false : true;
|
const bool has_close_button = (tab->Flags & ImGuiTabItemFlags_NoCloseButton) ? false : true;
|
||||||
tab->ContentWidth = TabItemCalcSize(tab_name, has_close_button).x;
|
tab->ContentWidth = TabItemCalcSize(tab_name, has_close_button).x;
|
||||||
|
|
||||||
float width = ImMin(tab->ContentWidth, tab_max_width);
|
int section_n = (tab->Flags & ImGuiTabItemFlags_Leading) ? 0 : (tab->Flags & ImGuiTabItemFlags_Trailing) ? 2 : 1;
|
||||||
if (tab->Flags & ImGuiTabItemFlags_Leading)
|
ImGuiTabBarSection* section = &tab_bar->Sections[section_n];
|
||||||
tab_bar->LeadingSection.Width += width + (tab_n > 0 ? g.Style.ItemInnerSpacing.x : 0.0f);
|
float width = ImMin(tab->ContentWidth, tab_max_width) + (tab_n > section->TabStartIndex) ? g.Style.ItemInnerSpacing.x : 0.0f;
|
||||||
else if (tab->Flags & ImGuiTabItemFlags_Trailing)
|
section->Width = section->WidthIdeal = section->Width + width;
|
||||||
tab_bar->TrailingSection.Width += width + (tab_n > tab_bar->LeadingSection.TabCount + tab_bar->CentralSection.TabCount ? g.Style.ItemInnerSpacing.x : 0.0f);
|
|
||||||
else
|
|
||||||
tab_bar->CentralSection.Width += width + (tab_n > tab_bar->LeadingSection.TabCount ? g.Style.ItemInnerSpacing.x : 0.0f);
|
|
||||||
|
|
||||||
g.ShrinkWidthBuffer[tab_n].Index = tab_n; // Store data so we can build an array sorted by width if we need to shrink tabs down
|
// Store data so we can build an array sorted by width if we need to shrink tabs down
|
||||||
|
g.ShrinkWidthBuffer[tab_n].Index = tab_n;
|
||||||
g.ShrinkWidthBuffer[tab_n].Width = tab->ContentWidth;
|
g.ShrinkWidthBuffer[tab_n].Width = tab->ContentWidth;
|
||||||
|
|
||||||
IM_ASSERT(width > 0.0f);
|
IM_ASSERT(width > 0.0f);
|
||||||
tab->Width = width;
|
tab->Width = width;
|
||||||
}
|
}
|
||||||
tab_bar->LeadingSection.WidthIdeal = tab_bar->LeadingSection.Width;
|
|
||||||
tab_bar->CentralSection.WidthIdeal = tab_bar->CentralSection.Width;
|
|
||||||
tab_bar->TrailingSection.WidthIdeal = tab_bar->TrailingSection.Width;
|
|
||||||
|
|
||||||
// We want to know here if we'll need the scrolling buttons, to adjust available width with resizable leading/trailing
|
// We want to know here if we'll need the scrolling buttons, to adjust available width with resizable leading/trailing
|
||||||
bool scrolling_buttons = (tab_bar->WidthAllTabsIdeal > tab_bar->BarRect.GetWidth() && tab_bar->Tabs.Size > 1) && !(tab_bar->Flags & ImGuiTabBarFlags_NoTabListScrollingButtons) && (tab_bar->Flags & ImGuiTabBarFlags_FittingPolicyScroll);
|
bool scrolling_buttons = (tab_bar->WidthAllTabsIdeal > tab_bar->BarRect.GetWidth() && tab_bar->Tabs.Size > 1) && !(tab_bar->Flags & ImGuiTabBarFlags_NoTabListScrollingButtons) && (tab_bar->Flags & ImGuiTabBarFlags_FittingPolicyScroll);
|
||||||
@ -7090,16 +7082,25 @@ static void ImGui::TabBarLayout(ImGuiTabBar* tab_bar)
|
|||||||
TabBarLayoutComputeTabsWidth(tab_bar, scrolling_buttons, scrolling_buttons_width);
|
TabBarLayoutComputeTabsWidth(tab_bar, scrolling_buttons, scrolling_buttons_width);
|
||||||
|
|
||||||
// Layout all active tabs
|
// Layout all active tabs
|
||||||
tab_bar->WidthAllTabs = tab_bar->WidthAllTabsIdeal = 0.0f;
|
|
||||||
float next_tab_offset = 0.0f;
|
float next_tab_offset = 0.0f;
|
||||||
|
tab_bar->WidthAllTabs = tab_bar->WidthAllTabsIdeal = 0.0f;
|
||||||
|
for (int section_n = 0; section_n < 3; section_n++)
|
||||||
|
{
|
||||||
|
// TabBarScrollingButtons will alter BarRect.Max.x, so we need to anticipate BarRect width reduction
|
||||||
|
ImGuiTabBarSection* section = &tab_bar->Sections[section_n];
|
||||||
|
if (section_n == 2)
|
||||||
|
next_tab_offset = ImMin(tab_bar->BarRect.GetWidth() - section->Width - (scrolling_buttons ? scrolling_buttons_width + 1.0f : 0.0f), next_tab_offset);
|
||||||
|
|
||||||
// TabBarLayoutActiveTabsForSection will also alter tab_bar->WidthAllTabs and WidthAllTabsIdeal
|
for (int tab_n = 0; tab_n < section->TabCount; tab_n++)
|
||||||
next_tab_offset = TabBarLayoutActiveTabsForSection(tab_bar, &tab_bar->LeadingSection, next_tab_offset); // Leading Section
|
{
|
||||||
next_tab_offset = TabBarLayoutActiveTabsForSection(tab_bar, &tab_bar->CentralSection, next_tab_offset); // Central Section
|
ImGuiTabItem* tab = &tab_bar->Tabs[section->TabStartIndex + tab_n];
|
||||||
|
tab->Offset = next_tab_offset;
|
||||||
// TabBarScrollingButtons will alter BarRect.Max.x, so we need to anticipate BarRect width reduction
|
next_tab_offset += tab->Width + (tab_n < section->TabCount - 1 ? g.Style.ItemInnerSpacing.x : 0.0f);
|
||||||
next_tab_offset = ImMin(tab_bar->BarRect.GetWidth() - tab_bar->TrailingSection.Width - (scrolling_buttons ? scrolling_buttons_width + 1.0f : 0.0f), next_tab_offset);
|
}
|
||||||
TabBarLayoutActiveTabsForSection(tab_bar, &tab_bar->TrailingSection, next_tab_offset); // Trailing Section
|
tab_bar->WidthAllTabs += ImMax(section->Width + section->InnerSpacing, 0.0f);
|
||||||
|
tab_bar->WidthAllTabsIdeal += ImMax(section->WidthIdeal + section->InnerSpacing, 0.0f);
|
||||||
|
next_tab_offset += section->InnerSpacing;
|
||||||
|
}
|
||||||
|
|
||||||
// Horizontal scrolling buttons
|
// Horizontal scrolling buttons
|
||||||
if (scrolling_buttons)
|
if (scrolling_buttons)
|
||||||
@ -7153,8 +7154,8 @@ static void ImGui::TabBarLayout(ImGuiTabBar* tab_bar)
|
|||||||
#ifdef IMGUI_ENABLE_TEST_ENGINE
|
#ifdef IMGUI_ENABLE_TEST_ENGINE
|
||||||
if (g.IO.KeyAlt)
|
if (g.IO.KeyAlt)
|
||||||
{
|
{
|
||||||
window->DrawList->AddRect(tab_bar->BarRect.Min, ImVec2(tab_bar->BarRect.Min.x + tab_bar->LeadingSection.Width, tab_bar->BarRect.Max.y), IM_COL32(255, 0, 0, 255));
|
window->DrawList->AddRect(tab_bar->BarRect.Min, ImVec2(tab_bar->BarRect.Min.x + tab_bar->Sections[0].Width, tab_bar->BarRect.Max.y), IM_COL32(255, 0, 0, 255));
|
||||||
window->DrawList->AddRect(ImVec2(tab_bar->BarRect.Max.x - tab_bar->TrailingSection.Width, tab_bar->BarRect.Min.y), tab_bar->BarRect.Max, IM_COL32(255, 255, 0, 255));
|
window->DrawList->AddRect(ImVec2(tab_bar->BarRect.Max.x - tab_bar->Sections[2].Width, tab_bar->BarRect.Min.y), tab_bar->BarRect.Max, IM_COL32(255, 255, 0, 255));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -7164,26 +7165,26 @@ static void ImGui::TabBarLayoutComputeTabsWidth(ImGuiTabBar* tab_bar, bool scrol
|
|||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
|
|
||||||
// Compute Leading/Trailing relative additional horizontal inner spacing
|
// Compute Leading/Trailing relative additional horizontal inner spacing
|
||||||
float leading_trailing_common_inner_space = (tab_bar->LeadingSection.TabCount > 0 && tab_bar->TrailingSection.TabCount > 0 ? g.Style.ItemInnerSpacing.x : 0.0f);
|
float leading_trailing_common_inner_space = (tab_bar->Sections[0].TabCount > 0 && tab_bar->Sections[2].TabCount > 0 ? g.Style.ItemInnerSpacing.x : 0.0f);
|
||||||
bool resizing_leading_trailing_only = (tab_bar->LeadingSection.Width + tab_bar->TrailingSection.Width + leading_trailing_common_inner_space) > (tab_bar->BarRect.GetWidth() - (scrolling_buttons ? scrolling_buttons_width : 0.0f));
|
bool resizing_leading_trailing_only = (tab_bar->Sections[0].Width + tab_bar->Sections[2].Width + leading_trailing_common_inner_space) > (tab_bar->BarRect.GetWidth() - (scrolling_buttons ? scrolling_buttons_width : 0.0f));
|
||||||
|
|
||||||
tab_bar->LeadingSection.InnerSpacing = tab_bar->LeadingSection.TabCount > 0 && (tab_bar->CentralSection.TabCount + tab_bar->TrailingSection.TabCount) > 0 ? g.Style.ItemInnerSpacing.x : 0.0f;
|
tab_bar->Sections[0].InnerSpacing = tab_bar->Sections[0].TabCount > 0 && (tab_bar->Sections[1].TabCount + tab_bar->Sections[2].TabCount) > 0 ? g.Style.ItemInnerSpacing.x : 0.0f;
|
||||||
tab_bar->CentralSection.InnerSpacing = tab_bar->CentralSection.TabCount > 0 && tab_bar->TrailingSection.TabCount > 0 ? g.Style.ItemInnerSpacing.x : 0.0f;
|
tab_bar->Sections[1].InnerSpacing = tab_bar->Sections[1].TabCount > 0 && tab_bar->Sections[2].TabCount > 0 ? g.Style.ItemInnerSpacing.x : 0.0f;
|
||||||
tab_bar->TrailingSection.InnerSpacing = 0.0f;
|
tab_bar->Sections[2].InnerSpacing = 0.0f;
|
||||||
|
|
||||||
// Compute width
|
// Compute width
|
||||||
float width_excess = resizing_leading_trailing_only
|
float width_excess = resizing_leading_trailing_only
|
||||||
? (tab_bar->LeadingSection.Width + tab_bar->TrailingSection.Width + leading_trailing_common_inner_space) - (tab_bar->BarRect.GetWidth() - (scrolling_buttons ? scrolling_buttons_width : 0.0f))
|
? (tab_bar->Sections[0].Width + tab_bar->Sections[2].Width + leading_trailing_common_inner_space) - (tab_bar->BarRect.GetWidth() - (scrolling_buttons ? scrolling_buttons_width : 0.0f))
|
||||||
: ImMax(tab_bar->CentralSection.Width + tab_bar->CentralSection.InnerSpacing - (tab_bar->BarRect.GetWidth() - tab_bar->LeadingSection.Width - tab_bar->LeadingSection.InnerSpacing - tab_bar->TrailingSection.Width - tab_bar->TrailingSection.InnerSpacing), 0.0f);
|
: ImMax(tab_bar->Sections[1].Width + tab_bar->Sections[1].InnerSpacing - (tab_bar->BarRect.GetWidth() - tab_bar->Sections[0].Width - tab_bar->Sections[0].InnerSpacing - tab_bar->Sections[2].Width - tab_bar->Sections[2].InnerSpacing), 0.0f);
|
||||||
|
|
||||||
if (width_excess > 0.0f && (tab_bar->Flags & ImGuiTabBarFlags_FittingPolicyResizeDown) || resizing_leading_trailing_only)
|
if (width_excess > 0.0f && (tab_bar->Flags & ImGuiTabBarFlags_FittingPolicyResizeDown) || resizing_leading_trailing_only)
|
||||||
{
|
{
|
||||||
// All tabs are in the ShrinkWidthBuffer, but we will only resize leading/trailing or central tabs, so rearrange internal data
|
// All tabs are in the ShrinkWidthBuffer, but we will only resize leading/trailing or central tabs, so rearrange internal data
|
||||||
if (resizing_leading_trailing_only)
|
if (resizing_leading_trailing_only)
|
||||||
memmove(g.ShrinkWidthBuffer.Data + tab_bar->LeadingSection.TabCount, g.ShrinkWidthBuffer.Data + tab_bar->LeadingSection.TabCount + tab_bar->CentralSection.TabCount, sizeof(ImGuiShrinkWidthItem) * tab_bar->TrailingSection.TabCount);
|
memmove(g.ShrinkWidthBuffer.Data + tab_bar->Sections[0].TabCount, g.ShrinkWidthBuffer.Data + tab_bar->Sections[0].TabCount + tab_bar->Sections[1].TabCount, sizeof(ImGuiShrinkWidthItem) * tab_bar->Sections[2].TabCount);
|
||||||
else
|
else
|
||||||
memmove(g.ShrinkWidthBuffer.Data, g.ShrinkWidthBuffer.Data + tab_bar->LeadingSection.TabCount, sizeof(ImGuiShrinkWidthItem) * tab_bar->CentralSection.TabCount);
|
memmove(g.ShrinkWidthBuffer.Data, g.ShrinkWidthBuffer.Data + tab_bar->Sections[0].TabCount, sizeof(ImGuiShrinkWidthItem) * tab_bar->Sections[1].TabCount);
|
||||||
int tab_n_shrinkable = (resizing_leading_trailing_only ? tab_bar->LeadingSection.TabCount + tab_bar->TrailingSection.TabCount : tab_bar->CentralSection.TabCount);
|
int tab_n_shrinkable = (resizing_leading_trailing_only ? tab_bar->Sections[0].TabCount + tab_bar->Sections[2].TabCount : tab_bar->Sections[1].TabCount);
|
||||||
|
|
||||||
ShrinkWidths(g.ShrinkWidthBuffer.Data, tab_n_shrinkable, width_excess);
|
ShrinkWidths(g.ShrinkWidthBuffer.Data, tab_n_shrinkable, width_excess);
|
||||||
|
|
||||||
@ -7205,32 +7206,16 @@ static void ImGui::TabBarLayoutComputeTabsWidth(ImGuiTabBar* tab_bar, bool scrol
|
|||||||
|
|
||||||
if (resizing_leading_trailing_only)
|
if (resizing_leading_trailing_only)
|
||||||
{
|
{
|
||||||
tab_bar->LeadingSection.Width -= leading_excess;
|
tab_bar->Sections[0].Width -= leading_excess;
|
||||||
tab_bar->TrailingSection.Width -= trailing_excess;
|
tab_bar->Sections[2].Width -= trailing_excess;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
tab_bar->CentralSection.Width -= width_excess;
|
tab_bar->Sections[1].Width -= width_excess;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static float ImGui::TabBarLayoutActiveTabsForSection(ImGuiTabBar* tab_bar, TabBarLayoutSection* section, float next_tab_offset)
|
|
||||||
{
|
|
||||||
ImGuiContext& g = *GImGui;
|
|
||||||
|
|
||||||
for(int i = 0; i < section->TabCount; ++i)
|
|
||||||
{
|
|
||||||
ImGuiTabItem* tab = section->Tabs + i;
|
|
||||||
tab->Offset = next_tab_offset;
|
|
||||||
next_tab_offset += tab->Width + (i < section->TabCount - 1 ? g.Style.ItemInnerSpacing.x : 0.0f);
|
|
||||||
}
|
|
||||||
tab_bar->WidthAllTabs += ImMax(section->Width + section->InnerSpacing, 0.0f);
|
|
||||||
tab_bar->WidthAllTabsIdeal += ImMax(section->WidthIdeal + section->InnerSpacing, 0.0f);
|
|
||||||
|
|
||||||
return next_tab_offset + section->InnerSpacing;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Dockables uses Name/ID in the global namespace. Non-dockable items use the ID stack.
|
// Dockables uses Name/ID in the global namespace. Non-dockable items use the ID stack.
|
||||||
static ImU32 ImGui::TabBarCalcTabID(ImGuiTabBar* tab_bar, const char* label)
|
static ImU32 ImGui::TabBarCalcTabID(ImGuiTabBar* tab_bar, const char* label)
|
||||||
{
|
{
|
||||||
@ -7311,11 +7296,11 @@ static void ImGui::TabBarScrollToTab(ImGuiTabBar* tab_bar, ImGuiTabItem* tab)
|
|||||||
int order = tab_bar->GetTabOrder(tab);
|
int order = tab_bar->GetTabOrder(tab);
|
||||||
|
|
||||||
// Scrolling happens only in the central section (leading/trailing sections are not scrolling)
|
// Scrolling happens only in the central section (leading/trailing sections are not scrolling)
|
||||||
float scrollable_width = tab_bar->BarRect.GetWidth() - tab_bar->LeadingSection.Width - tab_bar->TrailingSection.Width - tab_bar->CentralSection.InnerSpacing;
|
float scrollable_width = tab_bar->BarRect.GetWidth() - tab_bar->Sections[0].Width - tab_bar->Sections[2].Width - tab_bar->Sections[1].InnerSpacing;
|
||||||
|
|
||||||
// We make all tabs positions all relative LeadingSection.Width to make code simpler
|
// We make all tabs positions all relative Sections[0].Width to make code simpler
|
||||||
float tab_x1 = tab->Offset - tab_bar->LeadingSection.Width + (order > tab_bar->LeadingSection.TabCount - 1 ? -margin : 0.0f);
|
float tab_x1 = tab->Offset - tab_bar->Sections[0].Width + (order > tab_bar->Sections[0].TabCount - 1 ? -margin : 0.0f);
|
||||||
float tab_x2 = tab->Offset - tab_bar->LeadingSection.Width + tab->Width + (order + 1 < tab_bar->Tabs.Size - tab_bar->TrailingSection.TabCount ? margin : 1.0f);
|
float tab_x2 = tab->Offset - tab_bar->Sections[0].Width + tab->Width + (order + 1 < tab_bar->Tabs.Size - tab_bar->Sections[2].TabCount ? margin : 1.0f);
|
||||||
tab_bar->ScrollingTargetDistToVisibility = 0.0f;
|
tab_bar->ScrollingTargetDistToVisibility = 0.0f;
|
||||||
if (tab_bar->ScrollingTarget > tab_x1 || (tab_x2 - tab_x1 >= scrollable_width))
|
if (tab_bar->ScrollingTarget > tab_x1 || (tab_x2 - tab_x1 >= scrollable_width))
|
||||||
{
|
{
|
||||||
@ -7650,9 +7635,9 @@ bool ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open,
|
|||||||
|
|
||||||
// We don't have CPU clipping primitives to clip the CloseButton (until it becomes a texture), so need to add an extra draw call (temporary in the case of vertical animation)
|
// We don't have CPU clipping primitives to clip the CloseButton (until it becomes a texture), so need to add an extra draw call (temporary in the case of vertical animation)
|
||||||
// Leading buttons will be clipped by BarRect.Max.x, Trailing buttons will be clipped at BarRect.Min.x + LeadingsWidth (+ spacing if there are some buttons), and central tabs will be clipped inbetween
|
// Leading buttons will be clipped by BarRect.Max.x, Trailing buttons will be clipped at BarRect.Min.x + LeadingsWidth (+ spacing if there are some buttons), and central tabs will be clipped inbetween
|
||||||
float offset_trailing = (flags & (ImGuiTabItemFlags_Trailing | ImGuiTabItemFlags_Leading)) ? 0.0f : tab_bar->TrailingSection.Width + tab_bar->CentralSection.InnerSpacing;
|
float offset_trailing = (flags & (ImGuiTabItemFlags_Trailing | ImGuiTabItemFlags_Leading)) ? 0.0f : tab_bar->Sections[2].Width + tab_bar->Sections[1].InnerSpacing;
|
||||||
float offset_leading = (flags & ImGuiTabItemFlags_Leading) ? 0.0f : tab_bar->LeadingSection.Width + tab_bar->LeadingSection.InnerSpacing;
|
float offset_leading = (flags & ImGuiTabItemFlags_Leading) ? 0.0f : tab_bar->Sections[0].Width + tab_bar->Sections[0].InnerSpacing;
|
||||||
bool want_clip_rect = (bb.Min.x < tab_bar->BarRect.Min.x + offset_leading) || (bb.Max.x + offset_trailing > tab_bar->BarRect.Max.x);
|
bool want_clip_rect = (bb.Min.x < tab_bar->BarRect.Min.x + offset_leading) || (bb.Max.x > tab_bar->BarRect.Max.x - offset_trailing);
|
||||||
if (want_clip_rect)
|
if (want_clip_rect)
|
||||||
PushClipRect(ImVec2(ImMax(bb.Min.x, tab_bar->BarRect.Min.x + offset_leading), bb.Min.y - 1), ImVec2(tab_bar->BarRect.Max.x - offset_trailing, bb.Max.y), true);
|
PushClipRect(ImVec2(ImMax(bb.Min.x, tab_bar->BarRect.Min.x + offset_leading), bb.Min.y - 1), ImVec2(tab_bar->BarRect.Max.x - offset_trailing, bb.Max.y), true);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user