mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 21:21:06 +01:00 
			
		
		
		
	Tab Bar: Allow calling SetTabItemClosed() after a tab has been submitted (will process next frame).
+ larger combo height on TabBarTabListPopupButton()
This commit is contained in:
		| @@ -55,6 +55,7 @@ Other Changes: | |||||||
|   limits when close-enough by (WindowPadding - ItemPadding), which was a tweak with too many |   limits when close-enough by (WindowPadding - ItemPadding), which was a tweak with too many | ||||||
|   side-effects. The behavior is still present in SetScrollHere functions as they are more explicitly |   side-effects. The behavior is still present in SetScrollHere functions as they are more explicitly | ||||||
|   aiming at making widgets visible. May later be moved to a flag. |   aiming at making widgets visible. May later be moved to a flag. | ||||||
|  | - Tab Bar: Allow calling SetTabItemClosed() after a tab has been submitted (will process next frame). | ||||||
| - InvisibleButton: Made public a small selection of ImGuiButtonFlags (previously in imgui_internal.h) | - InvisibleButton: Made public a small selection of ImGuiButtonFlags (previously in imgui_internal.h) | ||||||
|   and allowed to pass them to InvisibleButton(): ImGuiButtonFlags_MouseButtonLeft/Right/Middle. |   and allowed to pass them to InvisibleButton(): ImGuiButtonFlags_MouseButtonLeft/Right/Middle. | ||||||
|   This is a small but rather important change because lots of multi-button behaviors could previously |   This is a small but rather important change because lots of multi-button behaviors could previously | ||||||
|   | |||||||
| @@ -161,6 +161,7 @@ It's mostly a bunch of personal notes, probably incomplete. Feel free to query i | |||||||
|  - dock: merge docking branch (#2109) |  - dock: merge docking branch (#2109) | ||||||
|  - dock: dock out from a collapsing header? would work nicely but need emitting window to keep submitting the code. |  - dock: dock out from a collapsing header? would work nicely but need emitting window to keep submitting the code. | ||||||
|  |  | ||||||
|  |  - tabs: while dragging/reordering a tab, close button decoration shouldn't appear on other tabs | ||||||
|  - tabs: make EndTabBar fail if users doesn't respect BeginTabBar return value, for consistency/future-proofing. |  - tabs: make EndTabBar fail if users doesn't respect BeginTabBar return value, for consistency/future-proofing. | ||||||
|  - tabs: persistent order/focus in BeginTabBar() api (#261, #351) |  - tabs: persistent order/focus in BeginTabBar() api (#261, #351) | ||||||
|  - tabs: TabItem could honor SetNextItemWidth()? |  - tabs: TabItem could honor SetNextItemWidth()? | ||||||
|   | |||||||
| @@ -1696,19 +1696,20 @@ enum ImGuiTabItemFlagsPrivate_ | |||||||
|     ImGuiTabItemFlags_NoCloseButton             = 1 << 20   // Track whether p_open was set or not (we'll need this info on the next frame to recompute ContentWidth during layout) |     ImGuiTabItemFlags_NoCloseButton             = 1 << 20   // Track whether p_open was set or not (we'll need this info on the next frame to recompute ContentWidth during layout) | ||||||
| }; | }; | ||||||
|  |  | ||||||
| // Storage for one active tab item (sizeof() 26~32 bytes) | // Storage for one active tab item (sizeof() 28~32 bytes) | ||||||
| struct ImGuiTabItem | struct ImGuiTabItem | ||||||
| { | { | ||||||
|     ImGuiID             ID; |     ImGuiID             ID; | ||||||
|     ImGuiTabItemFlags   Flags; |     ImGuiTabItemFlags   Flags; | ||||||
|     int                 LastFrameVisible; |     int                 LastFrameVisible; | ||||||
|     int                 LastFrameSelected;      // This allows us to infer an ordered list of the last activated tabs with little maintenance |     int                 LastFrameSelected;      // This allows us to infer an ordered list of the last activated tabs with little maintenance | ||||||
|     int                 NameOffset;             // When Window==NULL, offset to name within parent ImGuiTabBar::TabsNames |  | ||||||
|     float               Offset;                 // Position relative to beginning of tab |     float               Offset;                 // Position relative to beginning of tab | ||||||
|     float               Width;                  // Width currently displayed |     float               Width;                  // Width currently displayed | ||||||
|     float               ContentWidth;           // Width of actual contents, stored during BeginTabItem() call |     float               ContentWidth;           // Width of actual contents, stored during BeginTabItem() call | ||||||
|  |     ImS16               NameOffset;             // When Window==NULL, offset to name within parent ImGuiTabBar::TabsNames | ||||||
|  |     bool                WantClose;              // Marked as closed by SetTabItemClosed() | ||||||
|  |  | ||||||
|     ImGuiTabItem()      { ID = 0; Flags = ImGuiTabItemFlags_None; LastFrameVisible = LastFrameSelected = -1; NameOffset = -1; Offset = Width = ContentWidth = 0.0f; } |     ImGuiTabItem()      { ID = 0; Flags = ImGuiTabItemFlags_None; LastFrameVisible = LastFrameSelected = -1; NameOffset = -1; Offset = Width = ContentWidth = 0.0f; WantClose = false; } | ||||||
| }; | }; | ||||||
|  |  | ||||||
| // Storage for a tab bar (sizeof() 92~96 bytes) | // Storage for a tab bar (sizeof() 92~96 bytes) | ||||||
| @@ -1743,7 +1744,7 @@ struct ImGuiTabBar | |||||||
|     int                 GetTabOrder(const ImGuiTabItem* tab) const  { return Tabs.index_from_ptr(tab); } |     int                 GetTabOrder(const ImGuiTabItem* tab) const  { return Tabs.index_from_ptr(tab); } | ||||||
|     const char*         GetTabName(const ImGuiTabItem* tab) const |     const char*         GetTabName(const ImGuiTabItem* tab) const | ||||||
|     { |     { | ||||||
|         IM_ASSERT(tab->NameOffset != -1 && tab->NameOffset < TabsNames.Buf.Size); |         IM_ASSERT(tab->NameOffset != -1 && (int)tab->NameOffset < TabsNames.Buf.Size); | ||||||
|         return TabsNames.Buf.Data + tab->NameOffset; |         return TabsNames.Buf.Data + tab->NameOffset; | ||||||
|     } |     } | ||||||
| }; | }; | ||||||
|   | |||||||
| @@ -6709,15 +6709,17 @@ static void ImGui::TabBarLayout(ImGuiTabBar* tab_bar) | |||||||
|     ImGuiContext& g = *GImGui; |     ImGuiContext& g = *GImGui; | ||||||
|     tab_bar->WantLayout = false; |     tab_bar->WantLayout = false; | ||||||
|  |  | ||||||
|     // Garbage collect |     // Garbage collect by compacting list | ||||||
|     int tab_dst_n = 0; |     int tab_dst_n = 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]; | ||||||
|         if (tab->LastFrameVisible < tab_bar->PrevFrameVisible) |         if (tab->LastFrameVisible < tab_bar->PrevFrameVisible || tab->WantClose) | ||||||
|         { |         { | ||||||
|             if (tab->ID == tab_bar->SelectedTabId) |             // Remove tab | ||||||
|                 tab_bar->SelectedTabId = 0; |             if (tab_bar->VisibleTabId == tab->ID) { tab_bar->VisibleTabId = 0; } | ||||||
|  |             if (tab_bar->SelectedTabId == tab->ID) { tab_bar->SelectedTabId = 0; } | ||||||
|  |             if (tab_bar->NextSelectedTabId == tab->ID) { tab_bar->NextSelectedTabId = 0; } | ||||||
|             continue; |             continue; | ||||||
|         } |         } | ||||||
|         if (tab_dst_n != tab_src_n) |         if (tab_dst_n != tab_src_n) | ||||||
| @@ -7039,7 +7041,7 @@ static ImGuiTabItem* ImGui::TabBarTabListPopupButton(ImGuiTabBar* tab_bar) | |||||||
|     arrow_col.w *= 0.5f; |     arrow_col.w *= 0.5f; | ||||||
|     PushStyleColor(ImGuiCol_Text, arrow_col); |     PushStyleColor(ImGuiCol_Text, arrow_col); | ||||||
|     PushStyleColor(ImGuiCol_Button, ImVec4(0, 0, 0, 0)); |     PushStyleColor(ImGuiCol_Button, ImVec4(0, 0, 0, 0)); | ||||||
|     bool open = BeginCombo("##v", NULL, ImGuiComboFlags_NoPreview); |     bool open = BeginCombo("##v", NULL, ImGuiComboFlags_NoPreview | ImGuiComboFlags_HeightLargest); | ||||||
|     PopStyleColor(2); |     PopStyleColor(2); | ||||||
|  |  | ||||||
|     ImGuiTabItem* tab_to_select = NULL; |     ImGuiTabItem* tab_to_select = NULL; | ||||||
| @@ -7167,7 +7169,7 @@ bool    ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, | |||||||
|     tab->Flags = flags; |     tab->Flags = flags; | ||||||
|  |  | ||||||
|     // Append name with zero-terminator |     // Append name with zero-terminator | ||||||
|     tab->NameOffset = tab_bar->TabsNames.size(); |     tab->NameOffset = (ImS16)tab_bar->TabsNames.size(); | ||||||
|     tab_bar->TabsNames.append(label, label + strlen(label) + 1); |     tab_bar->TabsNames.append(label, label + strlen(label) + 1); | ||||||
|  |  | ||||||
|     // If we are not reorderable, always reset offset based on submission order. |     // If we are not reorderable, always reset offset based on submission order. | ||||||
| @@ -7316,9 +7318,8 @@ bool    ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, | |||||||
| } | } | ||||||
|  |  | ||||||
| // [Public] This is call is 100% optional but it allows to remove some one-frame glitches when a tab has been unexpectedly removed. | // [Public] This is call is 100% optional but it allows to remove some one-frame glitches when a tab has been unexpectedly removed. | ||||||
| // To use it to need to call the function SetTabItemClosed() after BeginTabBar() and before any call to BeginTabItem(). | // To use it to need to call the function SetTabItemClosed() between BeginTabBar() and EndTabBar(). | ||||||
| // Tabs closed by the close button will automatically be flagged to avoid this issue. | // Tabs closed by the close button will automatically be flagged to avoid this issue. | ||||||
| // FIXME: We should aim to support calling SetTabItemClosed() after the tab submission (for next frame) |  | ||||||
| void    ImGui::SetTabItemClosed(const char* label) | void    ImGui::SetTabItemClosed(const char* label) | ||||||
| { | { | ||||||
|     ImGuiContext& g = *GImGui; |     ImGuiContext& g = *GImGui; | ||||||
| @@ -7326,9 +7327,9 @@ void    ImGui::SetTabItemClosed(const char* label) | |||||||
|     if (is_within_manual_tab_bar) |     if (is_within_manual_tab_bar) | ||||||
|     { |     { | ||||||
|         ImGuiTabBar* tab_bar = g.CurrentTabBar; |         ImGuiTabBar* tab_bar = g.CurrentTabBar; | ||||||
|         IM_ASSERT(tab_bar->WantLayout);         // Needs to be called AFTER BeginTabBar() and BEFORE the first call to BeginTabItem() |  | ||||||
|         ImGuiID tab_id = TabBarCalcTabID(tab_bar, label); |         ImGuiID tab_id = TabBarCalcTabID(tab_bar, label); | ||||||
|         TabBarRemoveTab(tab_bar, tab_id); |         if (ImGuiTabItem* tab = TabBarFindTabByID(tab_bar, tab_id)) | ||||||
|  |             tab->WantClose = true; // Will be processed by next call to TabBarLayout() | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user