mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 13:11:05 +01:00 
			
		
		
		
	Tabs: Non-docking tab bars are storing names to allow tab list button + whole style scaling. Added ImGuiTabBarFlags_TabListPopupButton flag to show a popup button on manual tab bars. Locking FramePadding for the scope of a tab-bar to avoid sheering/clipping of tab item. Made scaling of tab ellipsis less awkward. (#261, #351)
This commit is contained in:
		| @@ -43,6 +43,8 @@ Other Changes: | ||||
| - InputText: Fixed a bug where ESCAPE would be first captured by the Keyboard Navigation code. (#2321, #787) | ||||
| - Fixed range-version of PushID() and GetID() not honoring the ### operator to restart from the seed value. | ||||
| - Fixed CloseCurrentPopup() on a child-menu of a modal incorrectly closing the modal. (#2308) | ||||
| - Tabs: Added ImGuiTabBarFlags_TabListPopupButton flag to show a popup button on manual tab bars. (#261, #351) | ||||
| - Tabs: Removed ImGuiTabBarFlags_NoTabListPopupButton which was available in 1.67 but actually had zero use. | ||||
| - RadioButton: Fixed label horizontal alignment to precisely match Checkbox(). | ||||
| - Window: When resizing from an edge, the border is more visible and better follow the rounded corners. | ||||
| - ImDrawList: Fixed AddCircle(), AddCircleFilled() angle step being off, which was visible when drawing a "circle" | ||||
|   | ||||
							
								
								
									
										4
									
								
								imgui.h
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								imgui.h
									
									
									
									
									
								
							| @@ -810,8 +810,8 @@ enum ImGuiTabBarFlags_ | ||||
|     ImGuiTabBarFlags_None                           = 0, | ||||
|     ImGuiTabBarFlags_Reorderable                    = 1 << 0,   // Allow manually dragging tabs to re-order them + New tabs are appended at the end of list | ||||
|     ImGuiTabBarFlags_AutoSelectNewTabs              = 1 << 1,   // Automatically select new tabs when they appear | ||||
|     ImGuiTabBarFlags_NoCloseWithMiddleMouseButton   = 1 << 2,   // Disable behavior of closing tabs (that are submitted with p_open != NULL) with middle mouse button. You can still repro this behavior on user's side with if (IsItemHovered() && IsMouseClicked(2)) *p_open = false. | ||||
|     ImGuiTabBarFlags_NoTabListPopupButton           = 1 << 3, | ||||
|     ImGuiTabBarFlags_TabListPopupButton             = 1 << 2, | ||||
|     ImGuiTabBarFlags_NoCloseWithMiddleMouseButton   = 1 << 3,   // Disable behavior of closing tabs (that are submitted with p_open != NULL) with middle mouse button. You can still repro this behavior on user's side with if (IsItemHovered() && IsMouseClicked(2)) *p_open = false. | ||||
|     ImGuiTabBarFlags_NoTabListScrollingButtons      = 1 << 4, | ||||
|     ImGuiTabBarFlags_NoTooltip                      = 1 << 5,   // Disable tooltips when hovering a tab | ||||
|     ImGuiTabBarFlags_FittingPolicyResizeDown        = 1 << 6,   // Resize tabs when they don't fit | ||||
|   | ||||
| @@ -1774,6 +1774,7 @@ static void ShowDemoWindowLayout() | ||||
|             static ImGuiTabBarFlags tab_bar_flags = ImGuiTabBarFlags_Reorderable; | ||||
|             ImGui::CheckboxFlags("ImGuiTabBarFlags_Reorderable", (unsigned int*)&tab_bar_flags, ImGuiTabBarFlags_Reorderable); | ||||
|             ImGui::CheckboxFlags("ImGuiTabBarFlags_AutoSelectNewTabs", (unsigned int*)&tab_bar_flags, ImGuiTabBarFlags_AutoSelectNewTabs); | ||||
|             ImGui::CheckboxFlags("ImGuiTabBarFlags_TabListPopupButton", (unsigned int*)&tab_bar_flags, ImGuiTabBarFlags_TabListPopupButton); | ||||
|             ImGui::CheckboxFlags("ImGuiTabBarFlags_NoCloseWithMiddleMouseButton", (unsigned int*)&tab_bar_flags, ImGuiTabBarFlags_NoCloseWithMiddleMouseButton); | ||||
|             if ((tab_bar_flags & ImGuiTabBarFlags_FittingPolicyMask_) == 0) | ||||
|                 tab_bar_flags |= ImGuiTabBarFlags_FittingPolicyDefault_; | ||||
|   | ||||
| @@ -3058,7 +3058,8 @@ void ImGui::RenderRectFilledRangeH(ImDrawList* draw_list, const ImRect& rect, Im | ||||
| void ImGui::RenderPixelEllipsis(ImDrawList* draw_list, ImVec2 pos, int count, ImU32 col) | ||||
| { | ||||
|     ImFont* font = draw_list->_Data->Font; | ||||
|     pos.y += (float)(int)(font->DisplayOffset.y + font->Ascent + 0.5f - 1.0f); | ||||
|     const float font_scale = draw_list->_Data->FontSize / font->FontSize; | ||||
|     pos.y += (float)(int)(font->DisplayOffset.y + font->Ascent * font_scale + 0.5f - 1.0f); | ||||
|     for (int dot_n = 0; dot_n < count; dot_n++) | ||||
|         draw_list->AddRectFilled(ImVec2(pos.x + dot_n * 2.0f, pos.y), ImVec2(pos.x + dot_n * 2.0f + 1.0f, pos.y + 1.0f), col); | ||||
| } | ||||
|   | ||||
| @@ -1245,10 +1245,14 @@ struct ImGuiItemHoveredDataBackup | ||||
|  | ||||
| enum ImGuiTabBarFlagsPrivate_ | ||||
| { | ||||
|     ImGuiTabBarFlags_DockNode                   = 1 << 20,  // [Docking: Unused in Master Branch] Part of a dock node | ||||
|     ImGuiTabBarFlags_DockNodeIsDockSpace        = 1 << 21,  // [Docking: Unused in Master Branch] Part of an explicit dockspace node node | ||||
|     ImGuiTabBarFlags_IsFocused                  = 1 << 22, | ||||
|     ImGuiTabBarFlags_SaveSettings               = 1 << 23   // FIXME: Settings are handled by the docking system, this only request the tab bar to mark settings dirty when reordering tabs | ||||
|     ImGuiTabBarFlags_DockNode                   = 1 << 20,  // Part of a dock node | ||||
|     ImGuiTabBarFlags_IsFocused                  = 1 << 21, | ||||
|     ImGuiTabBarFlags_SaveSettings               = 1 << 22   // FIXME: Settings are handled by the docking system, this only request the tab bar to mark settings dirty when reordering tabs | ||||
| }; | ||||
|  | ||||
| enum ImGuiTabItemFlagsPrivate_ | ||||
| { | ||||
|     ImGuiTabItemFlags_NoCloseButton             = 1 << 20   // Store whether p_open is set or not, which we need to recompute WidthContents during layout. | ||||
| }; | ||||
|  | ||||
| // Storage for one active tab item (sizeof() 26~32 bytes) | ||||
| @@ -1258,11 +1262,12 @@ struct ImGuiTabItem | ||||
|     ImGuiTabItemFlags   Flags; | ||||
|     int                 LastFrameVisible; | ||||
|     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               Width;                  // Width currently displayed | ||||
|     float               WidthContents;          // Width of actual contents, stored during BeginTabItem() call | ||||
|  | ||||
|     ImGuiTabItem()      { ID = Flags = 0; LastFrameVisible = LastFrameSelected = -1; Offset = Width = WidthContents = 0.0f; } | ||||
|     ImGuiTabItem()      { ID = Flags = 0; LastFrameVisible = LastFrameSelected = -1; NameOffset = -1; Offset = Width = WidthContents = 0.0f; } | ||||
| }; | ||||
|  | ||||
| // Storage for a tab bar (sizeof() 92~96 bytes) | ||||
| @@ -1287,9 +1292,16 @@ struct ImGuiTabBar | ||||
|     bool                WantLayout; | ||||
|     bool                VisibleTabWasSubmitted; | ||||
|     short               LastTabItemIdx;         // For BeginTabItem()/EndTabItem() | ||||
|     ImVec2              FramePadding;           // style.FramePadding locked at the time of BeginTabBar() | ||||
|     ImGuiTextBuffer     TabsNames;              // For non-docking tab bar we re-append names in a contiguous buffer.  | ||||
|  | ||||
|     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  | ||||
|     { | ||||
|         IM_ASSERT(tab->NameOffset != -1 && tab->NameOffset < TabsNames.Buf.Size);  | ||||
|         return TabsNames.Buf.Data + tab->NameOffset; | ||||
|     } | ||||
| }; | ||||
|  | ||||
| //----------------------------------------------------------------------------- | ||||
| @@ -1421,7 +1433,7 @@ namespace ImGui | ||||
|     IMGUI_API bool          TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, ImGuiTabItemFlags flags); | ||||
|     IMGUI_API ImVec2        TabItemCalcSize(const char* label, bool has_close_button); | ||||
|     IMGUI_API void          TabItemBackground(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, ImU32 col); | ||||
|     IMGUI_API bool          TabItemLabelAndCloseButton(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, const char* label, ImGuiID tab_id, ImGuiID close_button_id); | ||||
|     IMGUI_API bool          TabItemLabelAndCloseButton(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, ImVec2 frame_padding, const char* label, ImGuiID tab_id, ImGuiID close_button_id); | ||||
|  | ||||
|     // Render helpers | ||||
|     // AVOID USING OUTSIDE OF IMGUI.CPP! NOT FOR PUBLIC CONSUMPTION. THOSE FUNCTIONS ARE A MESS. THEIR SIGNATURE AND BEHAVIOR WILL CHANGE, THEY NEED TO BE REFACTORED INTO SOMETHING DECENT. | ||||
|   | ||||
| @@ -5780,6 +5780,7 @@ bool ImGui::MenuItem(const char* label, const char* shortcut, bool* p_selected, | ||||
| // - TabBarScrollToTab() [Internal] | ||||
| // - TabBarQueueChangeTabOrder() [Internal] | ||||
| // - TabBarScrollingButtons() [Internal] | ||||
| // - TabBarTabListPopupButton() [Internal] | ||||
| //------------------------------------------------------------------------- | ||||
|  | ||||
| namespace ImGui | ||||
| @@ -5790,6 +5791,7 @@ namespace ImGui | ||||
|     static float            TabBarScrollClamp(ImGuiTabBar* tab_bar, float scrolling); | ||||
|     static void             TabBarScrollToTab(ImGuiTabBar* tab_bar, ImGuiTabItem* tab); | ||||
|     static ImGuiTabItem*    TabBarScrollingButtons(ImGuiTabBar* tab_bar); | ||||
|     static ImGuiTabItem*    TabBarTabListPopupButton(ImGuiTabBar* tab_bar); | ||||
| } | ||||
|  | ||||
| ImGuiTabBar::ImGuiTabBar() | ||||
| @@ -5869,6 +5871,7 @@ bool    ImGui::BeginTabBarEx(ImGuiTabBar* tab_bar, const ImRect& tab_bar_bb, ImG | ||||
|     tab_bar->WantLayout = true; // Layout will be done on the first call to ItemTab() | ||||
|     tab_bar->PrevFrameVisible = tab_bar->CurrFrameVisible; | ||||
|     tab_bar->CurrFrameVisible = g.FrameCount; | ||||
|     tab_bar->FramePadding = g.Style.FramePadding; | ||||
|  | ||||
|     // Layout | ||||
|     ItemSize(ImVec2(tab_bar->OffsetMax, tab_bar->BarRect.GetHeight())); | ||||
| @@ -5878,8 +5881,8 @@ bool    ImGui::BeginTabBarEx(ImGuiTabBar* tab_bar, const ImRect& tab_bar_bb, ImG | ||||
|     const ImU32 col = GetColorU32((flags & ImGuiTabBarFlags_IsFocused) ? ImGuiCol_TabActive : ImGuiCol_Tab); | ||||
|     const float y = tab_bar->BarRect.Max.y - 1.0f; | ||||
|     { | ||||
|         const float separator_min_x = tab_bar->BarRect.Min.x - ((flags & ImGuiTabBarFlags_DockNodeIsDockSpace) ? 0.0f : window->WindowPadding.x); | ||||
|         const float separator_max_x = tab_bar->BarRect.Max.x + ((flags & ImGuiTabBarFlags_DockNodeIsDockSpace) ? 0.0f : window->WindowPadding.x); | ||||
|         const float separator_min_x = tab_bar->BarRect.Min.x - window->WindowPadding.x; | ||||
|         const float separator_max_x = tab_bar->BarRect.Max.x + window->WindowPadding.x; | ||||
|         window->DrawList->AddLine(ImVec2(separator_min_x, y), ImVec2(separator_max_x, y), col, 1.0f); | ||||
|     } | ||||
|     return true; | ||||
| @@ -5983,9 +5986,12 @@ static void ImGui::TabBarLayout(ImGuiTabBar* tab_bar) | ||||
|         if (tab->ID == tab_bar->SelectedTabId) | ||||
|             found_selected_tab_id = true; | ||||
|  | ||||
|         // Refresh tab width immediately if we can (for manual tab bar, WidthContent will lag by one frame which is mostly noticeable when changing style.FramePadding.x) | ||||
|         // 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, | ||||
|         // and we cannot wait for the next BeginTabItem() call. We cannot compute this width within TabBarAddTab() because font size depends on the active window. | ||||
|         const char* tab_name = tab_bar->GetTabName(tab); | ||||
|         tab->WidthContents = TabItemCalcSize(tab_name, (tab->Flags & ImGuiTabItemFlags_NoCloseButton) ? false : true).x; | ||||
|  | ||||
|         width_total_contents += (tab_n > 0 ? g.Style.ItemInnerSpacing.x : 0.0f) + tab->WidthContents; | ||||
|  | ||||
|         // Store data so we can build an array sorted by width if we need to shrink tabs down | ||||
| @@ -6038,6 +6044,12 @@ static void ImGui::TabBarLayout(ImGuiTabBar* tab_bar) | ||||
|     tab_bar->OffsetMax = ImMax(offset_x - g.Style.ItemInnerSpacing.x, 0.0f); | ||||
|     tab_bar->OffsetNextTab = 0.0f; | ||||
|  | ||||
|     // Tab List Popup | ||||
|     const bool tab_list_popup_button = (tab_bar->Flags & ImGuiTabBarFlags_TabListPopupButton) != 0; | ||||
|     if (tab_list_popup_button) | ||||
|         if (ImGuiTabItem* tab_to_select = TabBarTabListPopupButton(tab_bar)) // NB: Will alter BarRect.Max.x! | ||||
|             scroll_track_selected_tab_id = tab_bar->SelectedTabId = tab_to_select->ID; | ||||
|  | ||||
|     // Horizontal scrolling buttons | ||||
|     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); | ||||
|     if (scrolling_buttons) | ||||
| @@ -6063,6 +6075,10 @@ static void ImGui::TabBarLayout(ImGuiTabBar* tab_bar) | ||||
|     const float scrolling_speed = (tab_bar->PrevFrameVisible + 1 < g.FrameCount) ? FLT_MAX : (g.IO.DeltaTime * g.FontSize * 70.0f); | ||||
|     if (tab_bar->ScrollingAnim != tab_bar->ScrollingTarget) | ||||
|         tab_bar->ScrollingAnim = ImLinearSweep(tab_bar->ScrollingAnim, tab_bar->ScrollingTarget, scrolling_speed); | ||||
|  | ||||
|     // Clear name buffers | ||||
|     if ((tab_bar->Flags & ImGuiTabBarFlags_DockNode) == 0) | ||||
|         tab_bar->TabsNames.Buf.resize(0); | ||||
| } | ||||
|  | ||||
| // Dockables uses Name/ID in the global namespace. Non-dockable items use the ID stack. | ||||
| @@ -6204,6 +6220,42 @@ static ImGuiTabItem* ImGui::TabBarScrollingButtons(ImGuiTabBar* tab_bar) | ||||
|     return tab_to_select; | ||||
| } | ||||
|  | ||||
| static ImGuiTabItem* ImGui::TabBarTabListPopupButton(ImGuiTabBar* tab_bar) | ||||
| { | ||||
|     ImGuiContext& g = *GImGui; | ||||
|     ImGuiWindow* window = g.CurrentWindow; | ||||
|  | ||||
|     const float tab_list_popup_button_width = g.FontSize + g.Style.FramePadding.y * 2.0f; | ||||
|     const ImVec2 backup_cursor_pos = window->DC.CursorPos; | ||||
|     tab_bar->BarRect.Max.x -= tab_list_popup_button_width; | ||||
|     if (window->HasCloseButton) | ||||
|         tab_bar->BarRect.Max.x += g.Style.ItemInnerSpacing.x; | ||||
|     window->DC.CursorPos = ImVec2(tab_bar->BarRect.Max.x, tab_bar->BarRect.Min.y); | ||||
|  | ||||
|     ImVec4 arrow_col = g.Style.Colors[ImGuiCol_Text]; | ||||
|     arrow_col.w *= 0.5f; | ||||
|     PushStyleColor(ImGuiCol_Text, arrow_col); | ||||
|     PushStyleColor(ImGuiCol_Button, ImVec4(0, 0, 0, 0)); | ||||
|     bool open = BeginCombo("##v", NULL, ImGuiComboFlags_NoPreview | ImGuiComboFlags_PopupAlignLeft); | ||||
|     PopStyleColor(2); | ||||
|  | ||||
|     ImGuiTabItem* tab_to_select = NULL; | ||||
|     if (open) | ||||
|     { | ||||
|         for (int tab_n = 0; tab_n < tab_bar->Tabs.Size; tab_n++) | ||||
|         { | ||||
|             ImGuiTabItem* tab = &tab_bar->Tabs[tab_n]; | ||||
|             const char* tab_name = tab_bar->GetTabName(tab); | ||||
|             if (MenuItem(tab_name)) | ||||
|                 tab_to_select = tab; | ||||
|         } | ||||
|         EndCombo(); | ||||
|     } | ||||
|  | ||||
|     window->DC.CursorPos = backup_cursor_pos; | ||||
|     return tab_to_select; | ||||
| } | ||||
|  | ||||
| //------------------------------------------------------------------------- | ||||
| // [SECTION] Widgets: BeginTabItem, EndTabItem, etc. | ||||
| //------------------------------------------------------------------------- | ||||
| @@ -6290,12 +6342,19 @@ bool    ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, | ||||
|     tab_bar->LastTabItemIdx = (short)tab_bar->Tabs.index_from_ptr(tab); | ||||
|     tab->WidthContents = size.x; | ||||
|  | ||||
|     if (p_open == NULL) | ||||
|         flags |= ImGuiTabItemFlags_NoCloseButton; | ||||
|  | ||||
|     const bool tab_bar_appearing = (tab_bar->PrevFrameVisible + 1 < g.FrameCount); | ||||
|     const bool tab_bar_focused = (tab_bar->Flags & ImGuiTabBarFlags_IsFocused) != 0; | ||||
|     const bool tab_appearing = (tab->LastFrameVisible + 1 < g.FrameCount); | ||||
|     tab->LastFrameVisible = g.FrameCount; | ||||
|     tab->Flags = flags; | ||||
|  | ||||
|     // Append name with zero-terminator | ||||
|     tab->NameOffset = tab_bar->TabsNames.size(); | ||||
|     tab_bar->TabsNames.append(label, label + strlen(label) + 1); | ||||
|  | ||||
|     // If we are not reorderable, always reset offset based on submission order. | ||||
|     // (We already handled layout and sizing using the previous known order, but sizing is not affected by order!) | ||||
|     if (!tab_appearing && !(tab_bar->Flags & ImGuiTabBarFlags_Reorderable)) | ||||
| @@ -6412,7 +6471,7 @@ bool    ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, | ||||
|  | ||||
|     // Render tab label, process close button | ||||
|     const ImGuiID close_button_id = p_open ? window->GetID((void*)((intptr_t)id + 1)) : 0; | ||||
|     bool just_closed = TabItemLabelAndCloseButton(display_draw_list, bb, flags, label, id, close_button_id); | ||||
|     bool just_closed = TabItemLabelAndCloseButton(display_draw_list, bb, flags, tab_bar->FramePadding, label, id, close_button_id); | ||||
|     if (just_closed && p_open != NULL) | ||||
|     { | ||||
|         *p_open = false; | ||||
| @@ -6480,22 +6539,22 @@ void ImGui::TabItemBackground(ImDrawList* draw_list, const ImRect& bb, ImGuiTabI | ||||
| } | ||||
|  | ||||
| // Render text label (with custom clipping) + Unsaved Document marker + Close Button logic | ||||
| bool ImGui::TabItemLabelAndCloseButton(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, const char* label, ImGuiID tab_id, ImGuiID close_button_id) | ||||
| // We tend to lock style.FramePadding for a given tab-bar, hence the 'frame_padding' parameter. | ||||
| bool ImGui::TabItemLabelAndCloseButton(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, ImVec2 frame_padding, const char* label, ImGuiID tab_id, ImGuiID close_button_id) | ||||
| { | ||||
|     ImGuiContext& g = *GImGui; | ||||
|     ImGuiStyle& style = g.Style; | ||||
|     ImVec2 label_size = CalcTextSize(label, NULL, true); | ||||
|     if (bb.GetWidth() <= 1.0f) | ||||
|         return false; | ||||
|  | ||||
|     // Render text label (with clipping + alpha gradient) + unsaved marker | ||||
|     const char* TAB_UNSAVED_MARKER = "*"; | ||||
|     ImRect text_pixel_clip_bb(bb.Min.x + style.FramePadding.x, bb.Min.y + style.FramePadding.y, bb.Max.x - style.FramePadding.x, bb.Max.y); | ||||
|     ImRect text_pixel_clip_bb(bb.Min.x + frame_padding.x, bb.Min.y + frame_padding.y, bb.Max.x - frame_padding.x, bb.Max.y); | ||||
|     if (flags & ImGuiTabItemFlags_UnsavedDocument) | ||||
|     { | ||||
|         text_pixel_clip_bb.Max.x -= CalcTextSize(TAB_UNSAVED_MARKER, NULL, false).x; | ||||
|         ImVec2 unsaved_marker_pos(ImMin(bb.Min.x + style.FramePadding.x + label_size.x + 2, text_pixel_clip_bb.Max.x), bb.Min.y + style.FramePadding.y + (float)(int)(-g.FontSize * 0.25f)); | ||||
|         RenderTextClippedEx(draw_list, unsaved_marker_pos, bb.Max - style.FramePadding, TAB_UNSAVED_MARKER, NULL, NULL); | ||||
|         ImVec2 unsaved_marker_pos(ImMin(bb.Min.x + frame_padding.x + label_size.x + 2, text_pixel_clip_bb.Max.x), bb.Min.y + frame_padding.y + (float)(int)(-g.FontSize * 0.25f)); | ||||
|         RenderTextClippedEx(draw_list, unsaved_marker_pos, bb.Max - frame_padding, TAB_UNSAVED_MARKER, NULL, NULL); | ||||
|     } | ||||
|     ImRect text_ellipsis_clip_bb = text_pixel_clip_bb; | ||||
|  | ||||
| @@ -6513,7 +6572,7 @@ bool ImGui::TabItemLabelAndCloseButton(ImDrawList* draw_list, const ImRect& bb, | ||||
|     { | ||||
|         ImGuiItemHoveredDataBackup last_item_backup; | ||||
|         const float close_button_sz = g.FontSize * 0.5f; | ||||
|         if (CloseButton(close_button_id, ImVec2(bb.Max.x - style.FramePadding.x - close_button_sz, bb.Min.y + style.FramePadding.y + close_button_sz), close_button_sz)) | ||||
|         if (CloseButton(close_button_id, ImVec2(bb.Max.x - frame_padding.x - close_button_sz, bb.Min.y + frame_padding.y + close_button_sz), close_button_sz)) | ||||
|             close_button_pressed = true; | ||||
|         last_item_backup.Restore(); | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user