2
0
Эх сурвалжийг харах

Tabs: when scrolling is enabled, track selected tabs when resizing down parent container. (#3421, #8800)

ocornut 2 өдөр өмнө
parent
commit
320c94bfaa

+ 3 - 0
docs/CHANGELOG.txt

@@ -60,6 +60,9 @@ Other Changes:
 - Tabs: added style.TabMinWidthShrink, ImGuiStyleVar_TabMinWidthShrink to
 - Tabs: added style.TabMinWidthShrink, ImGuiStyleVar_TabMinWidthShrink to
   control the width to shrink to in ImGuiTabBarFlags_FittingPolicyMixed mode.
   control the width to shrink to in ImGuiTabBarFlags_FittingPolicyMixed mode.
   (#3421, #8800). 
   (#3421, #8800). 
+- Tabs: when scrolling is enabled, track selected tabs when resizing down
+  parent container. This does not prevent to horizontally scroll it out of
+  view during normal operations. (#3421, #8800)
 - Tabs: added style.TabMinWidthBase, ImGuiStyleVar_TabMinWidthBase to control
 - Tabs: added style.TabMinWidthBase, ImGuiStyleVar_TabMinWidthBase to control
   the base minimum width of a tab (default to 1.0f). This is the size before
   the base minimum width of a tab (default to 1.0f). This is the size before
   any potential shrinking is applied.
   any potential shrinking is applied.

+ 1 - 0
imgui_internal.h

@@ -2758,6 +2758,7 @@ struct IMGUI_API ImGuiTabBar
     int                 CurrFrameVisible;
     int                 CurrFrameVisible;
     int                 PrevFrameVisible;
     int                 PrevFrameVisible;
     ImRect              BarRect;
     ImRect              BarRect;
+    float               BarRectPrevWidth;       // Backup of previous width. When width change we enforce keep horizontal scroll on focused tab.
     float               CurrTabsContentsHeight;
     float               CurrTabsContentsHeight;
     float               PrevTabsContentsHeight; // Record the height of contents submitted below the tab bar
     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)

+ 6 - 0
imgui_widgets.cpp

@@ -9555,6 +9555,10 @@ static void ImGui::TabBarLayout(ImGuiTabBar* tab_bar)
     ImGuiContext& g = *GImGui;
     ImGuiContext& g = *GImGui;
     tab_bar->WantLayout = false;
     tab_bar->WantLayout = false;
 
 
+    // Track selected tab when resizing our parent down
+    const bool scroll_to_selected_tab = (tab_bar->BarRectPrevWidth > tab_bar->BarRect.GetWidth());
+    tab_bar->BarRectPrevWidth = tab_bar->BarRect.GetWidth();
+
     // Garbage collect by compacting list
     // Garbage collect by compacting list
     // Detect if we need to sort out tab list (e.g. in rare case where a tab changed section)
     // Detect if we need to sort out tab list (e.g. in rare case where a tab changed section)
     int tab_dst_n = 0;
     int tab_dst_n = 0;
@@ -9693,6 +9697,8 @@ static void ImGui::TabBarLayout(ImGuiTabBar* tab_bar)
             if ((scroll_and_select_tab->Flags & ImGuiTabItemFlags_Button) == 0)
             if ((scroll_and_select_tab->Flags & ImGuiTabItemFlags_Button) == 0)
                 tab_bar->SelectedTabId = scroll_to_tab_id;
                 tab_bar->SelectedTabId = scroll_to_tab_id;
         }
         }
+    if (scroll_to_tab_id == 0 && scroll_to_selected_tab)
+        scroll_to_tab_id = tab_bar->SelectedTabId;
 
 
     // Shrink widths if full tabs don't fit in their allocated space
     // Shrink widths if full tabs don't fit in their allocated space
     float section_0_w = sections[0].Width + sections[0].Spacing;
     float section_0_w = sections[0].Width + sections[0].Spacing;