mirror of
https://github.com/Drezil/imgui.git
synced 2024-11-22 11:57:00 +00: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:
parent
0e5b1ea297
commit
46d75202b8
@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user