Lines Matching defs:tab_bar
5823 static void TabBarLayout(ImGuiTabBar* tab_bar);
5824 static ImU32 TabBarCalcTabID(ImGuiTabBar* tab_bar, const char* label);
5826 static float TabBarScrollClamp(ImGuiTabBar* tab_bar, float scrolling);
5827 static void TabBarScrollToTab(ImGuiTabBar* tab_bar, ImGuiTabItem* tab);
5828 static ImGuiTabItem* TabBarScrollingButtons(ImGuiTabBar* tab_bar);
5829 static ImGuiTabItem* TabBarTabListPopupButton(ImGuiTabBar* tab_bar);
5871 ImGuiTabBar* tab_bar = g.TabBars.GetOrAddByKey(id);
5873 tab_bar->ID = id;
5874 return BeginTabBarEx(tab_bar, tab_bar_bb, flags | ImGuiTabBarFlags_IsFocused);
5877 bool ImGui::BeginTabBarEx(ImGuiTabBar* tab_bar, const ImRect& tab_bar_bb, ImGuiTabBarFlags flags)
5885 window->IDStack.push_back(tab_bar->ID);
5887 g.CurrentTabBar.push_back(tab_bar);
5888 if (tab_bar->CurrFrameVisible == g.FrameCount)
5897 if ((flags & ImGuiTabBarFlags_Reorderable) && !(tab_bar->Flags & ImGuiTabBarFlags_Reorderable) && tab_bar->Tabs.Size > 1 && tab_bar->PrevFrameVisible != -1)
5898 ImQsort(tab_bar->Tabs.Data, tab_bar->Tabs.Size, sizeof(ImGuiTabItem), TabItemComparerByVisibleOffset);
5904 tab_bar->Flags = flags;
5905 tab_bar->BarRect = tab_bar_bb;
5906 tab_bar->WantLayout = true; // Layout will be done on the first call to ItemTab()
5907 tab_bar->PrevFrameVisible = tab_bar->CurrFrameVisible;
5908 tab_bar->CurrFrameVisible = g.FrameCount;
5909 tab_bar->FramePadding = g.Style.FramePadding;
5912 ItemSize(ImVec2(tab_bar->OffsetMax, tab_bar->BarRect.GetHeight()));
5913 window->DC.CursorPos.x = tab_bar->BarRect.Min.x;
5917 const float y = tab_bar->BarRect.Max.y - 1.0f;
5919 const float separator_min_x = tab_bar->BarRect.Min.x - window->WindowPadding.x;
5920 const float separator_max_x = tab_bar->BarRect.Max.x + window->WindowPadding.x;
5934 ImGuiTabBar* tab_bar = g.CurrentTabBar.back();
5935 if (tab_bar->WantLayout)
5936 TabBarLayout(tab_bar);
5939 const bool tab_bar_appearing = (tab_bar->PrevFrameVisible + 1 < g.FrameCount);
5940 if (tab_bar->VisibleTabWasSubmitted || tab_bar->VisibleTabId == 0 || tab_bar_appearing)
5941 tab_bar->ContentsHeight = ImMax(window->DC.CursorPos.y - tab_bar->BarRect.Max.y, 0.0f);
5943 window->DC.CursorPos.y = tab_bar->BarRect.Max.y + tab_bar->ContentsHeight;
5945 if ((tab_bar->Flags & ImGuiTabBarFlags_DockNode) == 0)
5952 static void ImGui::TabBarLayout(ImGuiTabBar* tab_bar)
5955 tab_bar->WantLayout = false;
5959 for (int tab_src_n = 0; tab_src_n < tab_bar->Tabs.Size; tab_src_n++)
5961 ImGuiTabItem* tab = &tab_bar->Tabs[tab_src_n];
5962 if (tab->LastFrameVisible < tab_bar->PrevFrameVisible)
5964 if (tab->ID == tab_bar->SelectedTabId)
5965 tab_bar->SelectedTabId = 0;
5969 tab_bar->Tabs[tab_dst_n] = tab_bar->Tabs[tab_src_n];
5972 if (tab_bar->Tabs.Size != tab_dst_n)
5973 tab_bar->Tabs.resize(tab_dst_n);
5977 if (tab_bar->NextSelectedTabId)
5979 tab_bar->SelectedTabId = tab_bar->NextSelectedTabId;
5980 tab_bar->NextSelectedTabId = 0;
5981 scroll_track_selected_tab_id = tab_bar->SelectedTabId;
5985 if (tab_bar->ReorderRequestTabId != 0)
5987 if (ImGuiTabItem* tab1 = TabBarFindTabByID(tab_bar, tab_bar->ReorderRequestTabId))
5989 //IM_ASSERT(tab_bar->Flags & ImGuiTabBarFlags_Reorderable); // <- this may happen when using debug tools
5990 int tab2_order = tab_bar->GetTabOrder(tab1) + tab_bar->ReorderRequestDir;
5991 if (tab2_order >= 0 && tab2_order < tab_bar->Tabs.Size)
5993 ImGuiTabItem* tab2 = &tab_bar->Tabs[tab2_order];
5997 if (tab2->ID == tab_bar->SelectedTabId)
6001 if (tab_bar->Flags & ImGuiTabBarFlags_SaveSettings)
6004 tab_bar->ReorderRequestTabId = 0;
6007 // Tab List Popup (will alter tab_bar->BarRect and therefore the available width!)
6008 const bool tab_list_popup_button = (tab_bar->Flags & ImGuiTabBarFlags_TabListPopupButton) != 0;
6010 if (ImGuiTabItem* tab_to_select = TabBarTabListPopupButton(tab_bar)) // NB: Will alter BarRect.Max.x!
6011 scroll_track_selected_tab_id = tab_bar->SelectedTabId = tab_to_select->ID;
6014 width_sort_buffer.resize(tab_bar->Tabs.Size);
6020 for (int tab_n = 0; tab_n < tab_bar->Tabs.Size; tab_n++)
6022 ImGuiTabItem* tab = &tab_bar->Tabs[tab_n];
6023 IM_ASSERT(tab->LastFrameVisible >= tab_bar->PrevFrameVisible);
6027 if (tab->ID == tab_bar->SelectedTabId)
6033 const char* tab_name = tab_bar->GetTabName(tab);
6044 const float width_avail = tab_bar->BarRect.GetWidth();
6046 if (width_excess > 0.0f && (tab_bar->Flags & ImGuiTabBarFlags_FittingPolicyResizeDown))
6049 if (tab_bar->Tabs.Size > 1)
6052 while (width_excess > 0.0f && tab_count_same_width < tab_bar->Tabs.Size)
6054 while (tab_count_same_width < tab_bar->Tabs.Size && width_sort_buffer[0].Width == width_sort_buffer[tab_count_same_width].Width)
6056 float width_to_remove_per_tab_max = (tab_count_same_width < tab_bar->Tabs.Size) ? (width_sort_buffer[0].Width - width_sort_buffer[tab_count_same_width].Width) : (width_sort_buffer[0].Width - 1.0f);
6062 for (int tab_n = 0; tab_n < tab_bar->Tabs.Size; tab_n++)
6063 tab_bar->Tabs[width_sort_buffer[tab_n].Index].Width = (float)(int)width_sort_buffer[tab_n].Width;
6068 for (int tab_n = 0; tab_n < tab_bar->Tabs.Size; tab_n++)
6070 ImGuiTabItem* tab = &tab_bar->Tabs[tab_n];
6077 for (int tab_n = 0; tab_n < tab_bar->Tabs.Size; tab_n++)
6079 ImGuiTabItem* tab = &tab_bar->Tabs[tab_n];
6085 tab_bar->OffsetMax = ImMax(offset_x - g.Style.ItemInnerSpacing.x, 0.0f);
6086 tab_bar->OffsetNextTab = 0.0f;
6089 const bool scrolling_buttons = (tab_bar->OffsetMax > tab_bar->BarRect.GetWidth() && tab_bar->Tabs.Size > 1) && !(tab_bar->Flags & ImGuiTabBarFlags_NoTabListScrollingButtons) && (tab_bar->Flags & ImGuiTabBarFlags_FittingPolicyScroll);
6091 if (ImGuiTabItem* tab_to_select = TabBarScrollingButtons(tab_bar)) // NB: Will alter BarRect.Max.x!
6092 scroll_track_selected_tab_id = tab_bar->SelectedTabId = tab_to_select->ID;
6096 tab_bar->SelectedTabId = 0;
6097 if (tab_bar->SelectedTabId == 0 && tab_bar->NextSelectedTabId == 0 && most_recently_selected_tab != NULL)
6098 scroll_track_selected_tab_id = tab_bar->SelectedTabId = most_recently_selected_tab->ID;
6101 tab_bar->VisibleTabId = tab_bar->SelectedTabId;
6102 tab_bar->VisibleTabWasSubmitted = false;
6106 if (ImGuiTabItem* scroll_track_selected_tab = TabBarFindTabByID(tab_bar, scroll_track_selected_tab_id))
6107 TabBarScrollToTab(tab_bar, scroll_track_selected_tab);
6108 tab_bar->ScrollingAnim = TabBarScrollClamp(tab_bar, tab_bar->ScrollingAnim);
6109 tab_bar->ScrollingTarget = TabBarScrollClamp(tab_bar, tab_bar->ScrollingTarget);
6110 const float scrolling_speed = (tab_bar->PrevFrameVisible + 1 < g.FrameCount) ? FLT_MAX : (g.IO.DeltaTime * g.FontSize * 70.0f);
6111 if (tab_bar->ScrollingAnim != tab_bar->ScrollingTarget)
6112 tab_bar->ScrollingAnim = ImLinearSweep(tab_bar->ScrollingAnim, tab_bar->ScrollingTarget, scrolling_speed);
6115 if ((tab_bar->Flags & ImGuiTabBarFlags_DockNode) == 0)
6116 tab_bar->TabsNames.Buf.resize(0);
6120 static ImU32 ImGui::TabBarCalcTabID(ImGuiTabBar* tab_bar, const char* label)
6122 if (tab_bar->Flags & ImGuiTabBarFlags_DockNode)
6141 ImGuiTabItem* ImGui::TabBarFindTabByID(ImGuiTabBar* tab_bar, ImGuiID tab_id)
6144 for (int n = 0; n < tab_bar->Tabs.Size; n++)
6145 if (tab_bar->Tabs[n].ID == tab_id)
6146 return &tab_bar->Tabs[n];
6151 void ImGui::TabBarRemoveTab(ImGuiTabBar* tab_bar, ImGuiID tab_id)
6153 if (ImGuiTabItem* tab = TabBarFindTabByID(tab_bar, tab_id))
6154 tab_bar->Tabs.erase(tab);
6155 if (tab_bar->VisibleTabId == tab_id) { tab_bar->VisibleTabId = 0; }
6156 if (tab_bar->SelectedTabId == tab_id) { tab_bar->SelectedTabId = 0; }
6157 if (tab_bar->NextSelectedTabId == tab_id) { tab_bar->NextSelectedTabId = 0; }
6161 void ImGui::TabBarCloseTab(ImGuiTabBar* tab_bar, ImGuiTabItem* tab)
6163 if ((tab_bar->VisibleTabId == tab->ID) && !(tab->Flags & ImGuiTabItemFlags_UnsavedDocument))
6168 tab_bar->SelectedTabId = tab_bar->NextSelectedTabId = 0;
6170 else if ((tab_bar->VisibleTabId != tab->ID) && (tab->Flags & ImGuiTabItemFlags_UnsavedDocument))
6173 tab_bar->NextSelectedTabId = tab->ID;
6177 static float ImGui::TabBarScrollClamp(ImGuiTabBar* tab_bar, float scrolling)
6179 scrolling = ImMin(scrolling, tab_bar->OffsetMax - tab_bar->BarRect.GetWidth());
6183 static void ImGui::TabBarScrollToTab(ImGuiTabBar* tab_bar, ImGuiTabItem* tab)
6187 int order = tab_bar->GetTabOrder(tab);
6189 float tab_x2 = tab->Offset + tab->Width + (order + 1 < tab_bar->Tabs.Size ? margin : 1.0f);
6190 if (tab_bar->ScrollingTarget > tab_x1)
6191 tab_bar->ScrollingTarget = tab_x1;
6192 if (tab_bar->ScrollingTarget + tab_bar->BarRect.GetWidth() < tab_x2)
6193 tab_bar->ScrollingTarget = tab_x2 - tab_bar->BarRect.GetWidth();
6196 void ImGui::TabBarQueueChangeTabOrder(ImGuiTabBar* tab_bar, const ImGuiTabItem* tab, int dir)
6199 IM_ASSERT(tab_bar->ReorderRequestTabId == 0);
6200 tab_bar->ReorderRequestTabId = tab->ID;
6201 tab_bar->ReorderRequestDir = dir;
6204 static ImGuiTabItem* ImGui::TabBarScrollingButtons(ImGuiTabBar* tab_bar)
6213 //window->DrawList->AddRect(ImVec2(tab_bar->BarRect.Max.x - scrolling_buttons_width, tab_bar->BarRect.Min.y), ImVec2(tab_bar->BarRect.Max.x, tab_bar->BarRect.Max.y), IM_COL32(255,0,0,255));
6215 const ImRect avail_bar_rect = tab_bar->BarRect;
6218 PushClipRect(tab_bar->BarRect.Min, tab_bar->BarRect.Max + ImVec2(g.Style.ItemInnerSpacing.x, 0.0f), true);
6232 window->DC.CursorPos = ImVec2(tab_bar->BarRect.Max.x - scrolling_buttons_width, tab_bar->BarRect.Min.y);
6235 window->DC.CursorPos = ImVec2(tab_bar->BarRect.Max.x - scrolling_buttons_width + arrow_button_size.x, tab_bar->BarRect.Min.y);
6246 if (ImGuiTabItem* tab_item = TabBarFindTabByID(tab_bar, tab_bar->SelectedTabId))
6248 int selected_order = tab_bar->GetTabOrder(tab_item);
6250 tab_to_select = &tab_bar->Tabs[(target_order >= 0 && target_order < tab_bar->Tabs.Size) ? target_order : selected_order]; // If we are at the end of the list, still scroll to make our tab visible
6253 tab_bar->BarRect.Max.x -= scrolling_buttons_width + 1.0f;
6258 static ImGuiTabItem* ImGui::TabBarTabListPopupButton(ImGuiTabBar* tab_bar)
6266 window->DC.CursorPos = ImVec2(tab_bar->BarRect.Min.x - g.Style.FramePadding.y, tab_bar->BarRect.Min.y);
6267 tab_bar->BarRect.Min.x += tab_list_popup_button_width;
6279 for (int tab_n = 0; tab_n < tab_bar->Tabs.Size; tab_n++)
6281 ImGuiTabItem* tab = &tab_bar->Tabs[tab_n];
6282 const char* tab_name = tab_bar->GetTabName(tab);
6283 if (Selectable(tab_name, tab_bar->SelectedTabId == tab->ID))
6315 ImGuiTabBar* tab_bar = g.CurrentTabBar.back();
6316 bool ret = TabItemEx(tab_bar, label, p_open, flags);
6319 ImGuiTabItem* tab = &tab_bar->Tabs[tab_bar->LastTabItemIdx];
6332 ImGuiTabBar* tab_bar = g.CurrentTabBar.back();
6333 IM_ASSERT(tab_bar->LastTabItemIdx >= 0 && "Needs to be called between BeginTabItem() and EndTabItem()");
6334 ImGuiTabItem* tab = &tab_bar->Tabs[tab_bar->LastTabItemIdx];
6339 bool ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, ImGuiTabItemFlags flags)
6342 if (tab_bar->WantLayout)
6343 TabBarLayout(tab_bar);
6351 const ImGuiID id = TabBarCalcTabID(tab_bar, label);
6366 ImGuiTabItem* tab = TabBarFindTabByID(tab_bar, id);
6370 tab_bar->Tabs.push_back(ImGuiTabItem());
6371 tab = &tab_bar->Tabs.back();
6376 tab_bar->LastTabItemIdx = (short)tab_bar->Tabs.index_from_ptr(tab);
6382 const bool tab_bar_appearing = (tab_bar->PrevFrameVisible + 1 < g.FrameCount);
6383 const bool tab_bar_focused = (tab_bar->Flags & ImGuiTabBarFlags_IsFocused) != 0;
6389 tab->NameOffset = tab_bar->TabsNames.size();
6390 tab_bar->TabsNames.append(label, label + strlen(label) + 1);
6394 if (!tab_appearing && !(tab_bar->Flags & ImGuiTabBarFlags_Reorderable))
6396 tab->Offset = tab_bar->OffsetNextTab;
6397 tab_bar->OffsetNextTab += tab->Width + g.Style.ItemInnerSpacing.x;
6401 if (tab_appearing && (tab_bar->Flags & ImGuiTabBarFlags_AutoSelectNewTabs) && tab_bar->NextSelectedTabId == 0)
6402 if (!tab_bar_appearing || tab_bar->SelectedTabId == 0)
6403 tab_bar->NextSelectedTabId = id; // New tabs gets activated
6406 bool tab_contents_visible = (tab_bar->VisibleTabId == id);
6408 tab_bar->VisibleTabWasSubmitted = true;
6411 if (!tab_contents_visible && tab_bar->SelectedTabId == 0 && tab_bar_appearing)
6412 if (tab_bar->Tabs.Size == 1 && !(tab_bar->Flags & ImGuiTabBarFlags_AutoSelectNewTabs))
6423 if (tab_bar->SelectedTabId == id)
6431 window->DC.CursorPos = tab_bar->BarRect.Min + ImVec2((float)(int)tab->Offset - tab_bar->ScrollingAnim, 0.0f);
6436 bool want_clip_rect = (bb.Min.x < tab_bar->BarRect.Min.x) || (bb.Max.x >= tab_bar->BarRect.Max.x);
6438 PushClipRect(ImVec2(ImMax(bb.Min.x, tab_bar->BarRect.Min.x), bb.Min.y - 1), ImVec2(tab_bar->BarRect.Max.x, bb.Max.y), true);
6457 tab_bar->NextSelectedTabId = id;
6466 if (!g.DragDropActive && (tab_bar->Flags & ImGuiTabBarFlags_Reorderable))
6471 if (tab_bar->Flags & ImGuiTabBarFlags_Reorderable)
6472 TabBarQueueChangeTabOrder(tab_bar, tab, -1);
6476 if (tab_bar->Flags & ImGuiTabBarFlags_Reorderable)
6477 TabBarQueueChangeTabOrder(tab_bar, tab, +1);
6501 tab_bar->NextSelectedTabId = id;
6503 if (tab_bar->Flags & ImGuiTabBarFlags_NoCloseWithMiddleMouseButton)
6508 bool just_closed = TabItemLabelAndCloseButton(display_draw_list, bb, flags, tab_bar->FramePadding, label, id, close_button_id);
6512 TabBarCloseTab(tab_bar, tab);
6522 if (!(tab_bar->Flags & ImGuiTabBarFlags_NoTooltip))
6536 ImGuiTabBar* tab_bar = g.CurrentTabBar.back();
6537 IM_ASSERT(tab_bar->WantLayout); // Needs to be called AFTER BeginTabBar() and BEFORE the first call to BeginTabItem()
6538 ImGuiID tab_id = TabBarCalcTabID(tab_bar, label);
6539 TabBarRemoveTab(tab_bar, tab_id);