mirror of
https://github.com/ocornut/imgui.git
synced 2024-11-12 02:00:58 +01:00
Internals: TabBar: minor tweaks and renaming.
This commit is contained in:
parent
6f4b9c65ae
commit
3776ba565f
@ -1897,7 +1897,7 @@ struct ImGuiTabBar
|
|||||||
ImGuiTabBarFlags Flags;
|
ImGuiTabBarFlags Flags;
|
||||||
ImGuiID ID; // Zero for tab-bars used by docking
|
ImGuiID ID; // Zero for tab-bars used by docking
|
||||||
ImGuiID SelectedTabId; // Selected tab/window
|
ImGuiID SelectedTabId; // Selected tab/window
|
||||||
ImGuiID NextSelectedTabId;
|
ImGuiID NextSelectedTabId; // Next selected tab/window. Will also trigger a scrolling animation
|
||||||
ImGuiID VisibleTabId; // Can occasionally be != SelectedTabId (e.g. when previewing contents for CTRL+TAB preview)
|
ImGuiID VisibleTabId; // Can occasionally be != SelectedTabId (e.g. when previewing contents for CTRL+TAB preview)
|
||||||
int CurrFrameVisible;
|
int CurrFrameVisible;
|
||||||
int PrevFrameVisible;
|
int PrevFrameVisible;
|
||||||
|
@ -6906,7 +6906,7 @@ namespace ImGui
|
|||||||
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);
|
||||||
static void TabBarScrollToTab(ImGuiTabBar* tab_bar, ImGuiTabItem* tab, ImGuiTabBarSection* sections);
|
static void TabBarScrollToTab(ImGuiTabBar* tab_bar, ImGuiID tab_id, ImGuiTabBarSection* sections);
|
||||||
static ImGuiTabItem* TabBarScrollingButtons(ImGuiTabBar* tab_bar);
|
static ImGuiTabItem* TabBarScrollingButtons(ImGuiTabBar* tab_bar);
|
||||||
static ImGuiTabItem* TabBarTabListPopupButton(ImGuiTabBar* tab_bar);
|
static ImGuiTabItem* TabBarTabListPopupButton(ImGuiTabBar* tab_bar);
|
||||||
}
|
}
|
||||||
@ -7117,12 +7117,12 @@ static void ImGui::TabBarLayout(ImGuiTabBar* tab_bar)
|
|||||||
sections[1].Spacing = sections[1].TabCount > 0 && sections[2].TabCount > 0 ? g.Style.ItemInnerSpacing.x : 0.0f;
|
sections[1].Spacing = sections[1].TabCount > 0 && sections[2].TabCount > 0 ? g.Style.ItemInnerSpacing.x : 0.0f;
|
||||||
|
|
||||||
// Setup next selected tab
|
// Setup next selected tab
|
||||||
ImGuiID scroll_track_selected_tab_id = 0;
|
ImGuiID scroll_to_tab_id = 0;
|
||||||
if (tab_bar->NextSelectedTabId)
|
if (tab_bar->NextSelectedTabId)
|
||||||
{
|
{
|
||||||
tab_bar->SelectedTabId = tab_bar->NextSelectedTabId;
|
tab_bar->SelectedTabId = tab_bar->NextSelectedTabId;
|
||||||
tab_bar->NextSelectedTabId = 0;
|
tab_bar->NextSelectedTabId = 0;
|
||||||
scroll_track_selected_tab_id = tab_bar->SelectedTabId;
|
scroll_to_tab_id = tab_bar->SelectedTabId;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Process order change request (we could probably process it when requested but it's just saner to do it in a single spot).
|
// Process order change request (we could probably process it when requested but it's just saner to do it in a single spot).
|
||||||
@ -7130,7 +7130,7 @@ static void ImGui::TabBarLayout(ImGuiTabBar* tab_bar)
|
|||||||
{
|
{
|
||||||
if (TabBarProcessReorder(tab_bar))
|
if (TabBarProcessReorder(tab_bar))
|
||||||
if (tab_bar->ReorderRequestTabId == tab_bar->SelectedTabId)
|
if (tab_bar->ReorderRequestTabId == tab_bar->SelectedTabId)
|
||||||
scroll_track_selected_tab_id = tab_bar->ReorderRequestTabId;
|
scroll_to_tab_id = tab_bar->ReorderRequestTabId;
|
||||||
tab_bar->ReorderRequestTabId = 0;
|
tab_bar->ReorderRequestTabId = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -7138,7 +7138,7 @@ static void ImGui::TabBarLayout(ImGuiTabBar* tab_bar)
|
|||||||
const bool tab_list_popup_button = (tab_bar->Flags & ImGuiTabBarFlags_TabListPopupButton) != 0;
|
const bool tab_list_popup_button = (tab_bar->Flags & ImGuiTabBarFlags_TabListPopupButton) != 0;
|
||||||
if (tab_list_popup_button)
|
if (tab_list_popup_button)
|
||||||
if (ImGuiTabItem* tab_to_select = TabBarTabListPopupButton(tab_bar)) // NB: Will alter BarRect.Min.x!
|
if (ImGuiTabItem* tab_to_select = TabBarTabListPopupButton(tab_bar)) // NB: Will alter BarRect.Min.x!
|
||||||
scroll_track_selected_tab_id = tab_bar->SelectedTabId = tab_to_select->ID;
|
scroll_to_tab_id = tab_bar->SelectedTabId = tab_to_select->ID;
|
||||||
|
|
||||||
// Leading/Trailing tabs will be shrink only if central one aren't visible anymore, so layout the shrink data as: leading, trailing, central
|
// Leading/Trailing tabs will be shrink only if central one aren't visible anymore, so layout the shrink data as: leading, trailing, central
|
||||||
// (whereas our tabs are stored as: leading, central, trailing)
|
// (whereas our tabs are stored as: leading, central, trailing)
|
||||||
@ -7158,8 +7158,8 @@ static void ImGui::TabBarLayout(ImGuiTabBar* tab_bar)
|
|||||||
most_recently_selected_tab = tab;
|
most_recently_selected_tab = tab;
|
||||||
if (tab->ID == tab_bar->SelectedTabId)
|
if (tab->ID == tab_bar->SelectedTabId)
|
||||||
found_selected_tab_id = true;
|
found_selected_tab_id = true;
|
||||||
if (scroll_track_selected_tab_id == 0 && g.NavJustMovedToId == tab->ID)
|
if (scroll_to_tab_id == 0 && g.NavJustMovedToId == tab->ID)
|
||||||
scroll_track_selected_tab_id = tab->ID;
|
scroll_to_tab_id = tab->ID;
|
||||||
|
|
||||||
// Refresh tab width immediately, otherwise changes of style e.g. style.FramePadding.x would noticeably lag in the tab bar.
|
// Refresh tab width immediately, otherwise changes of style e.g. style.FramePadding.x would noticeably lag in the tab bar.
|
||||||
// Additionally, when using TabBarAddTab() to manipulate tab bar order we occasionally insert new tabs that don't have a width yet,
|
// Additionally, when using TabBarAddTab() to manipulate tab bar order we occasionally insert new tabs that don't have a width yet,
|
||||||
@ -7190,11 +7190,11 @@ static void ImGui::TabBarLayout(ImGuiTabBar* tab_bar)
|
|||||||
// Horizontal scrolling buttons
|
// Horizontal scrolling buttons
|
||||||
// (note that TabBarScrollButtons() will alter BarRect.Max.x)
|
// (note that TabBarScrollButtons() will alter BarRect.Max.x)
|
||||||
if ((tab_bar->WidthAllTabsIdeal > tab_bar->BarRect.GetWidth() && tab_bar->Tabs.Size > 1) && !(tab_bar->Flags & ImGuiTabBarFlags_NoTabListScrollingButtons) && (tab_bar->Flags & ImGuiTabBarFlags_FittingPolicyScroll))
|
if ((tab_bar->WidthAllTabsIdeal > tab_bar->BarRect.GetWidth() && tab_bar->Tabs.Size > 1) && !(tab_bar->Flags & ImGuiTabBarFlags_NoTabListScrollingButtons) && (tab_bar->Flags & ImGuiTabBarFlags_FittingPolicyScroll))
|
||||||
if (ImGuiTabItem* scroll_track_selected_tab = TabBarScrollingButtons(tab_bar))
|
if (ImGuiTabItem* scroll_and_select_tab = TabBarScrollingButtons(tab_bar))
|
||||||
{
|
{
|
||||||
scroll_track_selected_tab_id = scroll_track_selected_tab->ID;
|
scroll_to_tab_id = scroll_and_select_tab->ID;
|
||||||
if (!(scroll_track_selected_tab->Flags & ImGuiTabItemFlags_Button))
|
if ((scroll_and_select_tab->Flags & ImGuiTabItemFlags_Button) == 0)
|
||||||
tab_bar->SelectedTabId = scroll_track_selected_tab_id;
|
tab_bar->SelectedTabId = scroll_to_tab_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Shrink widths if full tabs don't fit in their allocated space
|
// Shrink widths if full tabs don't fit in their allocated space
|
||||||
@ -7254,16 +7254,15 @@ static void ImGui::TabBarLayout(ImGuiTabBar* tab_bar)
|
|||||||
if (found_selected_tab_id == false)
|
if (found_selected_tab_id == false)
|
||||||
tab_bar->SelectedTabId = 0;
|
tab_bar->SelectedTabId = 0;
|
||||||
if (tab_bar->SelectedTabId == 0 && tab_bar->NextSelectedTabId == 0 && most_recently_selected_tab != NULL)
|
if (tab_bar->SelectedTabId == 0 && tab_bar->NextSelectedTabId == 0 && most_recently_selected_tab != NULL)
|
||||||
scroll_track_selected_tab_id = tab_bar->SelectedTabId = most_recently_selected_tab->ID;
|
scroll_to_tab_id = tab_bar->SelectedTabId = most_recently_selected_tab->ID;
|
||||||
|
|
||||||
// Lock in visible tab
|
// Lock in visible tab
|
||||||
tab_bar->VisibleTabId = tab_bar->SelectedTabId;
|
tab_bar->VisibleTabId = tab_bar->SelectedTabId;
|
||||||
tab_bar->VisibleTabWasSubmitted = false;
|
tab_bar->VisibleTabWasSubmitted = false;
|
||||||
|
|
||||||
// Update scrolling
|
// Update scrolling
|
||||||
if (scroll_track_selected_tab_id)
|
if (scroll_to_tab_id != 0)
|
||||||
if (ImGuiTabItem* scroll_track_selected_tab = TabBarFindTabByID(tab_bar, scroll_track_selected_tab_id))
|
TabBarScrollToTab(tab_bar, scroll_to_tab_id, sections);
|
||||||
TabBarScrollToTab(tab_bar, scroll_track_selected_tab, sections);
|
|
||||||
tab_bar->ScrollingAnim = TabBarScrollClamp(tab_bar, tab_bar->ScrollingAnim);
|
tab_bar->ScrollingAnim = TabBarScrollClamp(tab_bar, tab_bar->ScrollingAnim);
|
||||||
tab_bar->ScrollingTarget = TabBarScrollClamp(tab_bar, tab_bar->ScrollingTarget);
|
tab_bar->ScrollingTarget = TabBarScrollClamp(tab_bar, tab_bar->ScrollingTarget);
|
||||||
if (tab_bar->ScrollingAnim != tab_bar->ScrollingTarget)
|
if (tab_bar->ScrollingAnim != tab_bar->ScrollingTarget)
|
||||||
@ -7363,8 +7362,12 @@ static float ImGui::TabBarScrollClamp(ImGuiTabBar* tab_bar, float scrolling)
|
|||||||
return ImMax(scrolling, 0.0f);
|
return ImMax(scrolling, 0.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ImGui::TabBarScrollToTab(ImGuiTabBar* tab_bar, ImGuiTabItem* tab, ImGuiTabBarSection* sections)
|
// Note: we may scroll to tab that are not selected! e.g. using keyboard arrow keys
|
||||||
|
static void ImGui::TabBarScrollToTab(ImGuiTabBar* tab_bar, ImGuiID tab_id, ImGuiTabBarSection* sections)
|
||||||
{
|
{
|
||||||
|
ImGuiTabItem* tab = TabBarFindTabByID(tab_bar, tab_id);
|
||||||
|
if (tab == NULL)
|
||||||
|
return;
|
||||||
if (tab->Flags & (ImGuiTabItemFlags_Leading | ImGuiTabItemFlags_Trailing))
|
if (tab->Flags & (ImGuiTabItemFlags_Leading | ImGuiTabItemFlags_Trailing))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user