mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-11-03 22:51:06 +01:00 
			
		
		
		
	Merge branch 'master' into docking
# Conflicts: # imgui_internal.h # imgui_widgets.cpp
This commit is contained in:
		@@ -107,6 +107,9 @@ Other Changes:
 | 
				
			|||||||
- InputText: Fixed a bug where ESCAPE would be first captured by the Keyboard Navigation code. (#2321, #787)
 | 
					- 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 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)
 | 
					- 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.
 | 
					- 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"
 | 
					- ImDrawList: Fixed AddCircle(), AddCircleFilled() angle step being off, which was visible when drawing a "circle"
 | 
				
			||||||
  with a small number of segments (e.g. an hexagon). (#2287) [@baktery]
 | 
					  with a small number of segments (e.g. an hexagon). (#2287) [@baktery]
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										18
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								imgui.cpp
									
									
									
									
									
								
							@@ -1150,7 +1150,6 @@ void ImGuiStyle::ScaleAllSizes(float scale_factor)
 | 
				
			|||||||
    PopupRounding = ImFloor(PopupRounding * scale_factor);
 | 
					    PopupRounding = ImFloor(PopupRounding * scale_factor);
 | 
				
			||||||
    FramePadding = ImFloor(FramePadding * scale_factor);
 | 
					    FramePadding = ImFloor(FramePadding * scale_factor);
 | 
				
			||||||
    FrameRounding = ImFloor(FrameRounding * scale_factor);
 | 
					    FrameRounding = ImFloor(FrameRounding * scale_factor);
 | 
				
			||||||
    TabRounding = ImFloor(TabRounding * scale_factor);
 | 
					 | 
				
			||||||
    ItemSpacing = ImFloor(ItemSpacing * scale_factor);
 | 
					    ItemSpacing = ImFloor(ItemSpacing * scale_factor);
 | 
				
			||||||
    ItemInnerSpacing = ImFloor(ItemInnerSpacing * scale_factor);
 | 
					    ItemInnerSpacing = ImFloor(ItemInnerSpacing * scale_factor);
 | 
				
			||||||
    TouchExtraPadding = ImFloor(TouchExtraPadding * scale_factor);
 | 
					    TouchExtraPadding = ImFloor(TouchExtraPadding * scale_factor);
 | 
				
			||||||
@@ -1160,6 +1159,7 @@ void ImGuiStyle::ScaleAllSizes(float scale_factor)
 | 
				
			|||||||
    ScrollbarRounding = ImFloor(ScrollbarRounding * scale_factor);
 | 
					    ScrollbarRounding = ImFloor(ScrollbarRounding * scale_factor);
 | 
				
			||||||
    GrabMinSize = ImFloor(GrabMinSize * scale_factor);
 | 
					    GrabMinSize = ImFloor(GrabMinSize * scale_factor);
 | 
				
			||||||
    GrabRounding = ImFloor(GrabRounding * scale_factor);
 | 
					    GrabRounding = ImFloor(GrabRounding * scale_factor);
 | 
				
			||||||
 | 
					    TabRounding = ImFloor(TabRounding * scale_factor);
 | 
				
			||||||
    DisplayWindowPadding = ImFloor(DisplayWindowPadding * scale_factor);
 | 
					    DisplayWindowPadding = ImFloor(DisplayWindowPadding * scale_factor);
 | 
				
			||||||
    DisplaySafeAreaPadding = ImFloor(DisplaySafeAreaPadding * scale_factor);
 | 
					    DisplaySafeAreaPadding = ImFloor(DisplaySafeAreaPadding * scale_factor);
 | 
				
			||||||
    MouseCursorScale = ImFloor(MouseCursorScale * scale_factor);
 | 
					    MouseCursorScale = ImFloor(MouseCursorScale * scale_factor);
 | 
				
			||||||
@@ -6199,7 +6199,7 @@ void ImGui::SetCurrentFont(ImFont* font)
 | 
				
			|||||||
    IM_ASSERT(font && font->IsLoaded());    // Font Atlas not created. Did you call io.Fonts->GetTexDataAsRGBA32 / GetTexDataAsAlpha8 ?
 | 
					    IM_ASSERT(font && font->IsLoaded());    // Font Atlas not created. Did you call io.Fonts->GetTexDataAsRGBA32 / GetTexDataAsAlpha8 ?
 | 
				
			||||||
    IM_ASSERT(font->Scale > 0.0f);
 | 
					    IM_ASSERT(font->Scale > 0.0f);
 | 
				
			||||||
    g.Font = font;
 | 
					    g.Font = font;
 | 
				
			||||||
    g.FontBaseSize = g.IO.FontGlobalScale * g.Font->FontSize * g.Font->Scale;
 | 
					    g.FontBaseSize = ImMax(1.0f, g.IO.FontGlobalScale * g.Font->FontSize * g.Font->Scale);
 | 
				
			||||||
    g.FontSize = g.CurrentWindow ? g.CurrentWindow->CalcFontSize() : 0.0f;
 | 
					    g.FontSize = g.CurrentWindow ? g.CurrentWindow->CalcFontSize() : 0.0f;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ImFontAtlas* atlas = g.Font->ContainerAtlas;
 | 
					    ImFontAtlas* atlas = g.Font->ContainerAtlas;
 | 
				
			||||||
@@ -11516,7 +11516,7 @@ static void ImGui::DockNodeUpdateTabBar(ImGuiDockNode* node, ImGuiWindow* host_w
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // Begin tab bar
 | 
					    // Begin tab bar
 | 
				
			||||||
    const ImRect tab_bar_rect = DockNodeCalcTabBarRect(node);
 | 
					    const ImRect tab_bar_rect = DockNodeCalcTabBarRect(node);
 | 
				
			||||||
    ImGuiTabBarFlags tab_bar_flags = ImGuiTabBarFlags_Reorderable | ImGuiTabBarFlags_AutoSelectNewTabs | ImGuiTabBarFlags_NoTabListPopupButton;// | ImGuiTabBarFlags_NoTabListScrollingButtons);
 | 
					    ImGuiTabBarFlags tab_bar_flags = ImGuiTabBarFlags_Reorderable | ImGuiTabBarFlags_AutoSelectNewTabs; // | ImGuiTabBarFlags_NoTabListScrollingButtons);
 | 
				
			||||||
    tab_bar_flags |= ImGuiTabBarFlags_SaveSettings | ImGuiTabBarFlags_DockNode;
 | 
					    tab_bar_flags |= ImGuiTabBarFlags_SaveSettings | ImGuiTabBarFlags_DockNode;
 | 
				
			||||||
    if (!host_window->Collapsed && is_focused)
 | 
					    if (!host_window->Collapsed && is_focused)
 | 
				
			||||||
        tab_bar_flags |= ImGuiTabBarFlags_IsFocused;
 | 
					        tab_bar_flags |= ImGuiTabBarFlags_IsFocused;
 | 
				
			||||||
@@ -11904,7 +11904,7 @@ static void ImGui::DockNodePreviewDockRender(ImGuiWindow* host_window, ImGuiDock
 | 
				
			|||||||
                if (!tab_bar_rect.Contains(tab_bb))
 | 
					                if (!tab_bar_rect.Contains(tab_bb))
 | 
				
			||||||
                    overlay_draw_lists[overlay_n]->PushClipRect(tab_bar_rect.Min, tab_bar_rect.Max);
 | 
					                    overlay_draw_lists[overlay_n]->PushClipRect(tab_bar_rect.Min, tab_bar_rect.Max);
 | 
				
			||||||
                TabItemBackground(overlay_draw_lists[overlay_n], tab_bb, tab_flags, overlay_col_tabs);
 | 
					                TabItemBackground(overlay_draw_lists[overlay_n], tab_bb, tab_flags, overlay_col_tabs);
 | 
				
			||||||
                TabItemLabelAndCloseButton(overlay_draw_lists[overlay_n], tab_bb, tab_flags, payload->Name, 0, 0);
 | 
					                TabItemLabelAndCloseButton(overlay_draw_lists[overlay_n], tab_bb, tab_flags, g.Style.FramePadding, payload->Name, 0, 0);
 | 
				
			||||||
                if (!tab_bar_rect.Contains(tab_bb))
 | 
					                if (!tab_bar_rect.Contains(tab_bb))
 | 
				
			||||||
                    overlay_draw_lists[overlay_n]->PopClipRect();
 | 
					                    overlay_draw_lists[overlay_n]->PopClipRect();
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@@ -13813,16 +13813,18 @@ void ImGui::ShowMetricsWindow(bool* p_open)
 | 
				
			|||||||
                // Display individual triangles/vertices. Hover on to get the corresponding triangle highlighted.
 | 
					                // Display individual triangles/vertices. Hover on to get the corresponding triangle highlighted.
 | 
				
			||||||
                ImGuiListClipper clipper(pcmd->ElemCount/3); // Manually coarse clip our print out of individual vertices to save CPU, only items that may be visible.
 | 
					                ImGuiListClipper clipper(pcmd->ElemCount/3); // Manually coarse clip our print out of individual vertices to save CPU, only items that may be visible.
 | 
				
			||||||
                while (clipper.Step())
 | 
					                while (clipper.Step())
 | 
				
			||||||
                    for (int prim = clipper.DisplayStart, vtx_i = elem_offset + clipper.DisplayStart*3; prim < clipper.DisplayEnd; prim++)
 | 
					                    for (int prim = clipper.DisplayStart, idx_i = elem_offset + clipper.DisplayStart*3; prim < clipper.DisplayEnd; prim++)
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        char buf[300];
 | 
					                        char buf[300];
 | 
				
			||||||
                        char *buf_p = buf, *buf_end = buf + IM_ARRAYSIZE(buf);
 | 
					                        char *buf_p = buf, *buf_end = buf + IM_ARRAYSIZE(buf);
 | 
				
			||||||
                        ImVec2 triangles_pos[3];
 | 
					                        ImVec2 triangles_pos[3];
 | 
				
			||||||
                        for (int n = 0; n < 3; n++, vtx_i++)
 | 
					                        for (int n = 0; n < 3; n++, idx_i++)
 | 
				
			||||||
                        {
 | 
					                        {
 | 
				
			||||||
                            ImDrawVert& v = draw_list->VtxBuffer[idx_buffer ? idx_buffer[vtx_i] : vtx_i];
 | 
					                            int vtx_i = idx_buffer ? idx_buffer[idx_i] : idx_i;
 | 
				
			||||||
 | 
					                            ImDrawVert& v = draw_list->VtxBuffer[vtx_i];
 | 
				
			||||||
                            triangles_pos[n] = v.pos;
 | 
					                            triangles_pos[n] = v.pos;
 | 
				
			||||||
                            buf_p += ImFormatString(buf_p, buf_end - buf_p, "%s %04d: pos (%8.2f,%8.2f), uv (%.6f,%.6f), col %08X\n", (n == 0) ? "vtx" : "   ", vtx_i, v.pos.x, v.pos.y, v.uv.x, v.uv.y, v.col);
 | 
					                            buf_p += ImFormatString(buf_p, buf_end - buf_p, "%s %04d: pos (%8.2f,%8.2f), uv (%.6f,%.6f), col %08X\n",
 | 
				
			||||||
 | 
					                                (n == 0) ? "idx" : "   ", idx_i, v.pos.x, v.pos.y, v.uv.x, v.uv.y, v.col);
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        ImGui::Selectable(buf, false);
 | 
					                        ImGui::Selectable(buf, false);
 | 
				
			||||||
                        if (overlay_draw_list && ImGui::IsItemHovered())
 | 
					                        if (overlay_draw_list && ImGui::IsItemHovered())
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										6
									
								
								imgui.h
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								imgui.h
									
									
									
									
									
								
							@@ -849,8 +849,8 @@ enum ImGuiTabBarFlags_
 | 
				
			|||||||
    ImGuiTabBarFlags_None                           = 0,
 | 
					    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_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_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_TabListPopupButton             = 1 << 2,
 | 
				
			||||||
    ImGuiTabBarFlags_NoTabListPopupButton           = 1 << 3,
 | 
					    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_NoTabListScrollingButtons      = 1 << 4,
 | 
				
			||||||
    ImGuiTabBarFlags_NoTooltip                      = 1 << 5,   // Disable tooltips when hovering a tab
 | 
					    ImGuiTabBarFlags_NoTooltip                      = 1 << 5,   // Disable tooltips when hovering a tab
 | 
				
			||||||
    ImGuiTabBarFlags_FittingPolicyResizeDown        = 1 << 6,   // Resize tabs when they don't fit
 | 
					    ImGuiTabBarFlags_FittingPolicyResizeDown        = 1 << 6,   // Resize tabs when they don't fit
 | 
				
			||||||
@@ -1673,7 +1673,7 @@ struct ImGuiTextBuffer
 | 
				
			|||||||
    inline char         operator[](int i)       { IM_ASSERT(Buf.Data != NULL); return Buf.Data[i]; }
 | 
					    inline char         operator[](int i)       { IM_ASSERT(Buf.Data != NULL); return Buf.Data[i]; }
 | 
				
			||||||
    const char*         begin() const           { return Buf.Data ? &Buf.front() : EmptyString; }
 | 
					    const char*         begin() const           { return Buf.Data ? &Buf.front() : EmptyString; }
 | 
				
			||||||
    const char*         end() const             { return Buf.Data ? &Buf.back() : EmptyString; }   // Buf is zero-terminated, so end() will point on the zero-terminator
 | 
					    const char*         end() const             { return Buf.Data ? &Buf.back() : EmptyString; }   // Buf is zero-terminated, so end() will point on the zero-terminator
 | 
				
			||||||
    int                 size() const            { return Buf.Data ? Buf.Size - 1 : 0; }
 | 
					    int                 size() const            { return Buf.Size ? Buf.Size - 1 : 0; }
 | 
				
			||||||
    bool                empty()                 { return Buf.Size <= 1; }
 | 
					    bool                empty()                 { return Buf.Size <= 1; }
 | 
				
			||||||
    void                clear()                 { Buf.clear(); }
 | 
					    void                clear()                 { Buf.clear(); }
 | 
				
			||||||
    void                reserve(int capacity)   { Buf.reserve(capacity); }
 | 
					    void                reserve(int capacity)   { Buf.reserve(capacity); }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1833,6 +1833,7 @@ static void ShowDemoWindowLayout()
 | 
				
			|||||||
            static ImGuiTabBarFlags tab_bar_flags = ImGuiTabBarFlags_Reorderable;
 | 
					            static ImGuiTabBarFlags tab_bar_flags = ImGuiTabBarFlags_Reorderable;
 | 
				
			||||||
            ImGui::CheckboxFlags("ImGuiTabBarFlags_Reorderable", (unsigned int*)&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_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);
 | 
					            ImGui::CheckboxFlags("ImGuiTabBarFlags_NoCloseWithMiddleMouseButton", (unsigned int*)&tab_bar_flags, ImGuiTabBarFlags_NoCloseWithMiddleMouseButton);
 | 
				
			||||||
            if ((tab_bar_flags & ImGuiTabBarFlags_FittingPolicyMask_) == 0)
 | 
					            if ((tab_bar_flags & ImGuiTabBarFlags_FittingPolicyMask_) == 0)
 | 
				
			||||||
                tab_bar_flags |= ImGuiTabBarFlags_FittingPolicyDefault_;
 | 
					                tab_bar_flags |= ImGuiTabBarFlags_FittingPolicyDefault_;
 | 
				
			||||||
@@ -2873,7 +2874,6 @@ void ImGui::ShowStyleEditor(ImGuiStyle* ref)
 | 
				
			|||||||
        {
 | 
					        {
 | 
				
			||||||
            ImGui::Text("Main");
 | 
					            ImGui::Text("Main");
 | 
				
			||||||
            ImGui::SliderFloat2("WindowPadding", (float*)&style.WindowPadding, 0.0f, 20.0f, "%.0f");
 | 
					            ImGui::SliderFloat2("WindowPadding", (float*)&style.WindowPadding, 0.0f, 20.0f, "%.0f");
 | 
				
			||||||
            ImGui::SliderFloat("PopupRounding", &style.PopupRounding, 0.0f, 16.0f, "%.0f");
 | 
					 | 
				
			||||||
            ImGui::SliderFloat2("FramePadding", (float*)&style.FramePadding, 0.0f, 20.0f, "%.0f");
 | 
					            ImGui::SliderFloat2("FramePadding", (float*)&style.FramePadding, 0.0f, 20.0f, "%.0f");
 | 
				
			||||||
            ImGui::SliderFloat2("ItemSpacing", (float*)&style.ItemSpacing, 0.0f, 20.0f, "%.0f");
 | 
					            ImGui::SliderFloat2("ItemSpacing", (float*)&style.ItemSpacing, 0.0f, 20.0f, "%.0f");
 | 
				
			||||||
            ImGui::SliderFloat2("ItemInnerSpacing", (float*)&style.ItemInnerSpacing, 0.0f, 20.0f, "%.0f");
 | 
					            ImGui::SliderFloat2("ItemInnerSpacing", (float*)&style.ItemInnerSpacing, 0.0f, 20.0f, "%.0f");
 | 
				
			||||||
@@ -2891,6 +2891,7 @@ void ImGui::ShowStyleEditor(ImGuiStyle* ref)
 | 
				
			|||||||
            ImGui::SliderFloat("WindowRounding", &style.WindowRounding, 0.0f, 12.0f, "%.0f");
 | 
					            ImGui::SliderFloat("WindowRounding", &style.WindowRounding, 0.0f, 12.0f, "%.0f");
 | 
				
			||||||
            ImGui::SliderFloat("ChildRounding", &style.ChildRounding, 0.0f, 12.0f, "%.0f");
 | 
					            ImGui::SliderFloat("ChildRounding", &style.ChildRounding, 0.0f, 12.0f, "%.0f");
 | 
				
			||||||
            ImGui::SliderFloat("FrameRounding", &style.FrameRounding, 0.0f, 12.0f, "%.0f");
 | 
					            ImGui::SliderFloat("FrameRounding", &style.FrameRounding, 0.0f, 12.0f, "%.0f");
 | 
				
			||||||
 | 
					            ImGui::SliderFloat("PopupRounding", &style.PopupRounding, 0.0f, 12.0f, "%.0f");
 | 
				
			||||||
            ImGui::SliderFloat("ScrollbarRounding", &style.ScrollbarRounding, 0.0f, 12.0f, "%.0f");
 | 
					            ImGui::SliderFloat("ScrollbarRounding", &style.ScrollbarRounding, 0.0f, 12.0f, "%.0f");
 | 
				
			||||||
            ImGui::SliderFloat("GrabRounding", &style.GrabRounding, 0.0f, 12.0f, "%.0f");
 | 
					            ImGui::SliderFloat("GrabRounding", &style.GrabRounding, 0.0f, 12.0f, "%.0f");
 | 
				
			||||||
            ImGui::SliderFloat("TabRounding", &style.TabRounding, 0.0f, 12.0f, "%.0f");
 | 
					            ImGui::SliderFloat("TabRounding", &style.TabRounding, 0.0f, 12.0f, "%.0f");
 | 
				
			||||||
@@ -2962,7 +2963,8 @@ void ImGui::ShowStyleEditor(ImGuiStyle* ref)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        if (ImGui::BeginTabItem("Fonts"))
 | 
					        if (ImGui::BeginTabItem("Fonts"))
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            ImFontAtlas* atlas = ImGui::GetIO().Fonts;
 | 
					            ImGuiIO& io = ImGui::GetIO();
 | 
				
			||||||
 | 
					            ImFontAtlas* atlas = io.Fonts;
 | 
				
			||||||
            ShowHelpMarker("Read FAQ and misc/fonts/README.txt for details on font loading.");
 | 
					            ShowHelpMarker("Read FAQ and misc/fonts/README.txt for details on font loading.");
 | 
				
			||||||
            ImGui::PushItemWidth(120);
 | 
					            ImGui::PushItemWidth(120);
 | 
				
			||||||
            for (int i = 0; i < atlas->Fonts.Size; i++)
 | 
					            for (int i = 0; i < atlas->Fonts.Size; i++)
 | 
				
			||||||
@@ -2970,7 +2972,7 @@ void ImGui::ShowStyleEditor(ImGuiStyle* ref)
 | 
				
			|||||||
                ImFont* font = atlas->Fonts[i];
 | 
					                ImFont* font = atlas->Fonts[i];
 | 
				
			||||||
                ImGui::PushID(font);
 | 
					                ImGui::PushID(font);
 | 
				
			||||||
                bool font_details_opened = ImGui::TreeNode(font, "Font %d: \"%s\"\n%.2f px, %d glyphs, %d file(s)", i, font->ConfigData ? font->ConfigData[0].Name : "", font->FontSize, font->Glyphs.Size, font->ConfigDataCount);
 | 
					                bool font_details_opened = ImGui::TreeNode(font, "Font %d: \"%s\"\n%.2f px, %d glyphs, %d file(s)", i, font->ConfigData ? font->ConfigData[0].Name : "", font->FontSize, font->Glyphs.Size, font->ConfigDataCount);
 | 
				
			||||||
                ImGui::SameLine(); if (ImGui::SmallButton("Set as default")) ImGui::GetIO().FontDefault = font;
 | 
					                ImGui::SameLine(); if (ImGui::SmallButton("Set as default")) { io.FontDefault = font; }
 | 
				
			||||||
                if (font_details_opened)
 | 
					                if (font_details_opened)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    ImGui::PushFont(font);
 | 
					                    ImGui::PushFont(font);
 | 
				
			||||||
@@ -3035,9 +3037,9 @@ void ImGui::ShowStyleEditor(ImGuiStyle* ref)
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            static float window_scale = 1.0f;
 | 
					            static float window_scale = 1.0f;
 | 
				
			||||||
            if (ImGui::DragFloat("this window scale", &window_scale, 0.005f, 0.3f, 2.0f, "%.1f"))           // scale only this window
 | 
					            if (ImGui::DragFloat("this window scale", &window_scale, 0.005f, 0.3f, 2.0f, "%.2f"))   // scale only this window
 | 
				
			||||||
                ImGui::SetWindowFontScale(window_scale);
 | 
					                ImGui::SetWindowFontScale(window_scale);
 | 
				
			||||||
            ImGui::DragFloat("global scale", &ImGui::GetIO().FontGlobalScale, 0.005f, 0.3f, 2.0f, "%.1f");  // scale everything
 | 
					            ImGui::DragFloat("global scale", &io.FontGlobalScale, 0.005f, 0.3f, 2.0f, "%.2f");      // scale everything
 | 
				
			||||||
            ImGui::PopItemWidth();
 | 
					            ImGui::PopItemWidth();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            ImGui::EndTabItem();
 | 
					            ImGui::EndTabItem();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1598,8 +1598,10 @@ ImFont* ImFontAtlas::AddFontDefault(const ImFontConfig* font_cfg_template)
 | 
				
			|||||||
        font_cfg.OversampleH = font_cfg.OversampleV = 1;
 | 
					        font_cfg.OversampleH = font_cfg.OversampleV = 1;
 | 
				
			||||||
        font_cfg.PixelSnapH = true;
 | 
					        font_cfg.PixelSnapH = true;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (font_cfg.Name[0] == '\0') strcpy(font_cfg.Name, "ProggyClean.ttf, 13px");
 | 
					    if (font_cfg.SizePixels <= 0.0f) 
 | 
				
			||||||
    if (font_cfg.SizePixels <= 0.0f) font_cfg.SizePixels = 13.0f;
 | 
					        font_cfg.SizePixels = 13.0f * 1.0f;
 | 
				
			||||||
 | 
					    if (font_cfg.Name[0] == '\0') 
 | 
				
			||||||
 | 
					        ImFormatString(font_cfg.Name, IM_ARRAYSIZE(font_cfg.Name), "ProggyClean.ttf, %dpx", (int)font_cfg.SizePixels);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const char* ttf_compressed_base85 = GetDefaultCompressedFontDataTTFBase85();
 | 
					    const char* ttf_compressed_base85 = GetDefaultCompressedFontDataTTFBase85();
 | 
				
			||||||
    const ImWchar* glyph_ranges = font_cfg.GlyphRanges != NULL ? font_cfg.GlyphRanges : GetGlyphRangesDefault();
 | 
					    const ImWchar* glyph_ranges = font_cfg.GlyphRanges != NULL ? font_cfg.GlyphRanges : GetGlyphRangesDefault();
 | 
				
			||||||
@@ -3101,7 +3103,8 @@ void ImGui::RenderRectFilledWithHole(ImDrawList* draw_list, ImRect outer, ImRect
 | 
				
			|||||||
void ImGui::RenderPixelEllipsis(ImDrawList* draw_list, ImVec2 pos, int count, ImU32 col)
 | 
					void ImGui::RenderPixelEllipsis(ImDrawList* draw_list, ImVec2 pos, int count, ImU32 col)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ImFont* font = draw_list->_Data->Font;
 | 
					    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++)
 | 
					    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);
 | 
					        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);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1420,8 +1420,9 @@ enum ImGuiTabBarFlagsPrivate_
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
enum ImGuiTabItemFlagsPrivate_
 | 
					enum ImGuiTabItemFlagsPrivate_
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ImGuiTabItemFlags_Unsorted                  = 1 << 20,  // [Docking] Trailing tabs with the _Unsorted flag will be sorted based on the DockOrder of their Window.
 | 
					    ImGuiTabItemFlags_NoCloseButton             = 1 << 20,  // Store whether p_open is set or not, which we need to recompute WidthContents during layout.
 | 
				
			||||||
    ImGuiTabItemFlags_Preview                   = 1 << 21   // [Docking] Display tab shape for docking preview (height is adjusted slightly to compensate for the yet missing tab bar)
 | 
					    ImGuiTabItemFlags_Unsorted                  = 1 << 21,  // [Docking] Trailing tabs with the _Unsorted flag will be sorted based on the DockOrder of their Window.
 | 
				
			||||||
 | 
					    ImGuiTabItemFlags_Preview                   = 1 << 22   // [Docking] Display tab shape for docking preview (height is adjusted slightly to compensate for the yet missing tab bar)
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Storage for one active tab item (sizeof() 32~40 bytes)
 | 
					// Storage for one active tab item (sizeof() 32~40 bytes)
 | 
				
			||||||
@@ -1432,11 +1433,12 @@ struct ImGuiTabItem
 | 
				
			|||||||
    ImGuiWindow*        Window;                 // When TabItem is part of a DockNode's TabBar, we hold on to a window.
 | 
					    ImGuiWindow*        Window;                 // When TabItem is part of a DockNode's TabBar, we hold on to a window.
 | 
				
			||||||
    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               WidthContents;          // Width of actual contents, stored during BeginTabItem() call
 | 
					    float               WidthContents;          // Width of actual contents, stored during BeginTabItem() call
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ImGuiTabItem()      { ID = Flags = 0; Window = NULL;  LastFrameVisible = LastFrameSelected = -1; Offset = Width = WidthContents = 0.0f; }
 | 
					    ImGuiTabItem()      { ID = Flags = 0; Window = NULL; LastFrameVisible = LastFrameSelected = -1; NameOffset = -1; Offset = Width = WidthContents = 0.0f; }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Storage for a tab bar (sizeof() 92~96 bytes)
 | 
					// Storage for a tab bar (sizeof() 92~96 bytes)
 | 
				
			||||||
@@ -1461,9 +1463,18 @@ struct ImGuiTabBar
 | 
				
			|||||||
    bool                WantLayout;
 | 
					    bool                WantLayout;
 | 
				
			||||||
    bool                VisibleTabWasSubmitted;
 | 
					    bool                VisibleTabWasSubmitted;
 | 
				
			||||||
    short               LastTabItemIdx;         // For BeginTabItem()/EndTabItem()
 | 
					    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();
 | 
					    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 
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if (tab->Window)
 | 
				
			||||||
 | 
					            return tab->Window->Name;
 | 
				
			||||||
 | 
					        IM_ASSERT(tab->NameOffset != -1 && tab->NameOffset < TabsNames.Buf.Size); 
 | 
				
			||||||
 | 
					        return TabsNames.Buf.Data + tab->NameOffset;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//-----------------------------------------------------------------------------
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
@@ -1635,7 +1646,7 @@ namespace ImGui
 | 
				
			|||||||
    IMGUI_API bool          TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, ImGuiTabItemFlags flags, ImGuiWindow* docked_window);
 | 
					    IMGUI_API bool          TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, ImGuiTabItemFlags flags, ImGuiWindow* docked_window);
 | 
				
			||||||
    IMGUI_API ImVec2        TabItemCalcSize(const char* label, bool has_close_button);
 | 
					    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 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
 | 
					    // 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.
 | 
					    // 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.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -926,19 +926,11 @@ bool ImGui::Checkbox(const char* label, bool* v)
 | 
				
			|||||||
    const ImGuiID id = window->GetID(label);
 | 
					    const ImGuiID id = window->GetID(label);
 | 
				
			||||||
    const ImVec2 label_size = CalcTextSize(label, NULL, true);
 | 
					    const ImVec2 label_size = CalcTextSize(label, NULL, true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const ImRect check_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(label_size.y + style.FramePadding.y*2, label_size.y + style.FramePadding.y*2)); // We want a square shape to we use Y twice
 | 
					    const float square_sz = GetFrameHeight();
 | 
				
			||||||
    ItemSize(check_bb, style.FramePadding.y);
 | 
					    const ImVec2 pos = window->DC.CursorPos;
 | 
				
			||||||
 | 
					    const ImRect check_bb(pos, pos + ImVec2(square_sz, square_sz));
 | 
				
			||||||
    ImRect total_bb = check_bb;
 | 
					    const ImRect total_bb(pos, pos + ImVec2(square_sz + (label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f), label_size.y + style.FramePadding.y * 2.0f));
 | 
				
			||||||
    if (label_size.x > 0)
 | 
					    ItemSize(total_bb, style.FramePadding.y);
 | 
				
			||||||
        SameLine(0, style.ItemInnerSpacing.x);
 | 
					 | 
				
			||||||
    const ImRect text_bb(window->DC.CursorPos + ImVec2(0,style.FramePadding.y), window->DC.CursorPos + ImVec2(0,style.FramePadding.y) + label_size);
 | 
					 | 
				
			||||||
    if (label_size.x > 0)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        ItemSize(ImVec2(text_bb.GetWidth(), check_bb.GetHeight()), style.FramePadding.y);
 | 
					 | 
				
			||||||
        total_bb = ImRect(ImMin(check_bb.Min, text_bb.Min), ImMax(check_bb.Max, text_bb.Max));
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (!ItemAdd(total_bb, id))
 | 
					    if (!ItemAdd(total_bb, id))
 | 
				
			||||||
        return false;
 | 
					        return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -954,15 +946,14 @@ bool ImGui::Checkbox(const char* label, bool* v)
 | 
				
			|||||||
    RenderFrame(check_bb.Min, check_bb.Max, GetColorU32((held && hovered) ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg), true, style.FrameRounding);
 | 
					    RenderFrame(check_bb.Min, check_bb.Max, GetColorU32((held && hovered) ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg), true, style.FrameRounding);
 | 
				
			||||||
    if (*v)
 | 
					    if (*v)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        const float check_sz = ImMin(check_bb.GetWidth(), check_bb.GetHeight());
 | 
					        const float pad = ImMax(1.0f, (float)(int)(square_sz / 6.0f));
 | 
				
			||||||
        const float pad = ImMax(1.0f, (float)(int)(check_sz / 6.0f));
 | 
					        RenderCheckMark(check_bb.Min + ImVec2(pad, pad), GetColorU32(ImGuiCol_CheckMark), square_sz - pad*2.0f);
 | 
				
			||||||
        RenderCheckMark(check_bb.Min + ImVec2(pad,pad), GetColorU32(ImGuiCol_CheckMark), check_bb.GetWidth() - pad*2.0f);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (g.LogEnabled)
 | 
					    if (g.LogEnabled)
 | 
				
			||||||
        LogRenderedText(&text_bb.Min, *v ? "[x]" : "[ ]");
 | 
					        LogRenderedText(&total_bb.Min, *v ? "[x]" : "[ ]");
 | 
				
			||||||
    if (label_size.x > 0.0f)
 | 
					    if (label_size.x > 0.0f)
 | 
				
			||||||
        RenderText(text_bb.Min, label);
 | 
					        RenderText(ImVec2(check_bb.Max.x + style.ItemInnerSpacing.x, check_bb.Min.y + style.FramePadding.y), label);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    IMGUI_TEST_ENGINE_ITEM_INFO(id, label, window->DC.ItemFlags | ImGuiItemStatusFlags_Checkable | (*v ? ImGuiItemStatusFlags_Checked : 0));
 | 
					    IMGUI_TEST_ENGINE_ITEM_INFO(id, label, window->DC.ItemFlags | ImGuiItemStatusFlags_Checkable | (*v ? ImGuiItemStatusFlags_Checked : 0));
 | 
				
			||||||
    return pressed;
 | 
					    return pressed;
 | 
				
			||||||
@@ -994,26 +985,18 @@ bool ImGui::RadioButton(const char* label, bool active)
 | 
				
			|||||||
    const ImGuiID id = window->GetID(label);
 | 
					    const ImGuiID id = window->GetID(label);
 | 
				
			||||||
    const ImVec2 label_size = CalcTextSize(label, NULL, true);
 | 
					    const ImVec2 label_size = CalcTextSize(label, NULL, true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const ImRect check_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(label_size.y + style.FramePadding.y*2-1, label_size.y + style.FramePadding.y*2-1));
 | 
					    const float square_sz = GetFrameHeight();
 | 
				
			||||||
    ItemSize(check_bb, style.FramePadding.y);
 | 
					    const ImVec2 pos = window->DC.CursorPos;
 | 
				
			||||||
 | 
					    const ImRect check_bb(pos, pos + ImVec2(square_sz, square_sz));
 | 
				
			||||||
    ImRect total_bb = check_bb;
 | 
					    const ImRect total_bb(pos, pos + ImVec2(square_sz + (label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f), label_size.y + style.FramePadding.y * 2.0f));
 | 
				
			||||||
    if (label_size.x > 0)
 | 
					    ItemSize(total_bb, style.FramePadding.y);
 | 
				
			||||||
        SameLine(0, style.ItemInnerSpacing.x);
 | 
					 | 
				
			||||||
    const ImRect text_bb(window->DC.CursorPos + ImVec2(0, style.FramePadding.y), window->DC.CursorPos + ImVec2(0, style.FramePadding.y) + label_size);
 | 
					 | 
				
			||||||
    if (label_size.x > 0)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        ItemSize(ImVec2(text_bb.GetWidth(), check_bb.GetHeight()), style.FramePadding.y);
 | 
					 | 
				
			||||||
        total_bb.Add(text_bb);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (!ItemAdd(total_bb, id))
 | 
					    if (!ItemAdd(total_bb, id))
 | 
				
			||||||
        return false;
 | 
					        return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ImVec2 center = check_bb.GetCenter();
 | 
					    ImVec2 center = check_bb.GetCenter();
 | 
				
			||||||
    center.x = (float)(int)center.x + 0.5f;
 | 
					    center.x = (float)(int)center.x + 0.5f;
 | 
				
			||||||
    center.y = (float)(int)center.y + 0.5f;
 | 
					    center.y = (float)(int)center.y + 0.5f;
 | 
				
			||||||
    const float radius = check_bb.GetHeight() * 0.5f;
 | 
					    const float radius = (square_sz - 1.0f) * 0.5f;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool hovered, held;
 | 
					    bool hovered, held;
 | 
				
			||||||
    bool pressed = ButtonBehavior(total_bb, id, &hovered, &held);
 | 
					    bool pressed = ButtonBehavior(total_bb, id, &hovered, &held);
 | 
				
			||||||
@@ -1024,8 +1007,7 @@ bool ImGui::RadioButton(const char* label, bool active)
 | 
				
			|||||||
    window->DrawList->AddCircleFilled(center, radius, GetColorU32((held && hovered) ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg), 16);
 | 
					    window->DrawList->AddCircleFilled(center, radius, GetColorU32((held && hovered) ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg), 16);
 | 
				
			||||||
    if (active)
 | 
					    if (active)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        const float check_sz = ImMin(check_bb.GetWidth(), check_bb.GetHeight());
 | 
					        const float pad = ImMax(1.0f, (float)(int)(square_sz / 6.0f));
 | 
				
			||||||
        const float pad = ImMax(1.0f, (float)(int)(check_sz / 6.0f));
 | 
					 | 
				
			||||||
        window->DrawList->AddCircleFilled(center, radius - pad, GetColorU32(ImGuiCol_CheckMark), 16);
 | 
					        window->DrawList->AddCircleFilled(center, radius - pad, GetColorU32(ImGuiCol_CheckMark), 16);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1036,9 +1018,9 @@ bool ImGui::RadioButton(const char* label, bool active)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (g.LogEnabled)
 | 
					    if (g.LogEnabled)
 | 
				
			||||||
        LogRenderedText(&text_bb.Min, active ? "(x)" : "( )");
 | 
					        LogRenderedText(&total_bb.Min, active ? "(x)" : "( )");
 | 
				
			||||||
    if (label_size.x > 0.0f)
 | 
					    if (label_size.x > 0.0f)
 | 
				
			||||||
        RenderText(text_bb.Min, label);
 | 
					        RenderText(ImVec2(check_bb.Max.x + style.ItemInnerSpacing.x, check_bb.Min.y + style.FramePadding.y), label);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return pressed;
 | 
					    return pressed;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -1907,12 +1889,10 @@ bool ImGui::DragScalar(const char* label, ImGuiDataType data_type, void* v, floa
 | 
				
			|||||||
    const ImRect inner_bb(frame_bb.Min + style.FramePadding, frame_bb.Max - style.FramePadding);
 | 
					    const ImRect inner_bb(frame_bb.Min + style.FramePadding, frame_bb.Max - style.FramePadding);
 | 
				
			||||||
    const ImRect total_bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f));
 | 
					    const ImRect total_bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // NB- we don't call ItemSize() yet because we may turn into a text edit box below
 | 
					 | 
				
			||||||
    if (!ItemAdd(total_bb, id, &frame_bb))
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
    ItemSize(total_bb, style.FramePadding.y);
 | 
					    ItemSize(total_bb, style.FramePadding.y);
 | 
				
			||||||
 | 
					    if (!ItemAdd(total_bb, id, &frame_bb))
 | 
				
			||||||
        return false;
 | 
					        return false;
 | 
				
			||||||
    }
 | 
					
 | 
				
			||||||
    const bool hovered = ItemHoverable(frame_bb, id);
 | 
					    const bool hovered = ItemHoverable(frame_bb, id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Default format string when passing NULL
 | 
					    // Default format string when passing NULL
 | 
				
			||||||
@@ -1940,12 +1920,12 @@ bool ImGui::DragScalar(const char* label, ImGuiDataType data_type, void* v, floa
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    if (start_text_input || (g.ActiveId == id && g.ScalarAsInputTextId == id))
 | 
					    if (start_text_input || (g.ActiveId == id && g.ScalarAsInputTextId == id))
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 | 
					        window->DC.CursorPos = frame_bb.Min;
 | 
				
			||||||
        FocusableItemUnregister(window);
 | 
					        FocusableItemUnregister(window);
 | 
				
			||||||
        return InputScalarAsWidgetReplacement(frame_bb, id, label, data_type, v, format);
 | 
					        return InputScalarAsWidgetReplacement(frame_bb, id, label, data_type, v, format);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Actual drag behavior
 | 
					    // Actual drag behavior
 | 
				
			||||||
    ItemSize(total_bb, style.FramePadding.y);
 | 
					 | 
				
			||||||
    const bool value_changed = DragBehavior(id, data_type, v, v_speed, v_min, v_max, format, power, ImGuiDragFlags_None);
 | 
					    const bool value_changed = DragBehavior(id, data_type, v, v_speed, v_min, v_max, format, power, ImGuiDragFlags_None);
 | 
				
			||||||
    if (value_changed)
 | 
					    if (value_changed)
 | 
				
			||||||
        MarkItemEdited(id);
 | 
					        MarkItemEdited(id);
 | 
				
			||||||
@@ -2342,12 +2322,9 @@ bool ImGui::SliderScalar(const char* label, ImGuiDataType data_type, void* v, co
 | 
				
			|||||||
    const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w, label_size.y + style.FramePadding.y*2.0f));
 | 
					    const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w, label_size.y + style.FramePadding.y*2.0f));
 | 
				
			||||||
    const ImRect total_bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f));
 | 
					    const ImRect total_bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // NB- we don't call ItemSize() yet because we may turn into a text edit box below
 | 
					 | 
				
			||||||
    if (!ItemAdd(total_bb, id, &frame_bb))
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
    ItemSize(total_bb, style.FramePadding.y);
 | 
					    ItemSize(total_bb, style.FramePadding.y);
 | 
				
			||||||
 | 
					    if (!ItemAdd(total_bb, id, &frame_bb))
 | 
				
			||||||
        return false;
 | 
					        return false;
 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Default format string when passing NULL
 | 
					    // Default format string when passing NULL
 | 
				
			||||||
    // Patch old "%.0f" format string to use "%d", read function comments for more details.
 | 
					    // Patch old "%.0f" format string to use "%d", read function comments for more details.
 | 
				
			||||||
@@ -2375,12 +2352,11 @@ bool ImGui::SliderScalar(const char* label, ImGuiDataType data_type, void* v, co
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    if (start_text_input || (g.ActiveId == id && g.ScalarAsInputTextId == id))
 | 
					    if (start_text_input || (g.ActiveId == id && g.ScalarAsInputTextId == id))
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 | 
					        window->DC.CursorPos = frame_bb.Min;
 | 
				
			||||||
        FocusableItemUnregister(window);
 | 
					        FocusableItemUnregister(window);
 | 
				
			||||||
        return InputScalarAsWidgetReplacement(frame_bb, id, label, data_type, v, format);
 | 
					        return InputScalarAsWidgetReplacement(frame_bb, id, label, data_type, v, format);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ItemSize(total_bb, style.FramePadding.y);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Draw frame
 | 
					    // Draw frame
 | 
				
			||||||
    const ImU32 frame_col = GetColorU32(g.ActiveId == id ? ImGuiCol_FrameBgActive : g.HoveredId == id ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg);
 | 
					    const ImU32 frame_col = GetColorU32(g.ActiveId == id ? ImGuiCol_FrameBgActive : g.HoveredId == id ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg);
 | 
				
			||||||
    RenderNavHighlight(frame_bb, id);
 | 
					    RenderNavHighlight(frame_bb, id);
 | 
				
			||||||
@@ -5931,6 +5907,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->WantLayout = true; // Layout will be done on the first call to ItemTab()
 | 
				
			||||||
    tab_bar->PrevFrameVisible = tab_bar->CurrFrameVisible;
 | 
					    tab_bar->PrevFrameVisible = tab_bar->CurrFrameVisible;
 | 
				
			||||||
    tab_bar->CurrFrameVisible = g.FrameCount;
 | 
					    tab_bar->CurrFrameVisible = g.FrameCount;
 | 
				
			||||||
 | 
					    tab_bar->FramePadding = g.Style.FramePadding;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Layout
 | 
					    // Layout
 | 
				
			||||||
    ItemSize(ImVec2(tab_bar->OffsetMax, tab_bar->BarRect.GetHeight()));
 | 
					    ItemSize(ImVec2(tab_bar->OffsetMax, tab_bar->BarRect.GetHeight()));
 | 
				
			||||||
@@ -6035,6 +6012,12 @@ static void ImGui::TabBarLayout(ImGuiTabBar* tab_bar)
 | 
				
			|||||||
        tab_bar->ReorderRequestTabId = 0;
 | 
					        tab_bar->ReorderRequestTabId = 0;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Tab List Popup (will alter tab_bar->BarRect and therefore the available width!)
 | 
				
			||||||
 | 
					    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;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ImVector<ImGuiTabBarSortItem>& width_sort_buffer = g.TabSortByWidthBuffer;
 | 
					    ImVector<ImGuiTabBarSortItem>& width_sort_buffer = g.TabSortByWidthBuffer;
 | 
				
			||||||
    width_sort_buffer.resize(tab_bar->Tabs.Size);
 | 
					    width_sort_buffer.resize(tab_bar->Tabs.Size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -6052,11 +6035,13 @@ static void ImGui::TabBarLayout(ImGuiTabBar* tab_bar)
 | 
				
			|||||||
        if (tab->ID == tab_bar->SelectedTabId)
 | 
					        if (tab->ID == tab_bar->SelectedTabId)
 | 
				
			||||||
            found_selected_tab_id = true;
 | 
					            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,
 | 
					        // 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.
 | 
					        // and we cannot wait for the next BeginTabItem() call. We cannot compute this width within TabBarAddTab() because font size depends on the active window.
 | 
				
			||||||
        if (tab->Window)
 | 
					        const char* tab_name = tab_bar->GetTabName(tab);
 | 
				
			||||||
            tab->WidthContents = TabItemCalcSize(tab->Window->Name, tab->Window->HasCloseButton).x;
 | 
					        const bool has_close_button = tab->Window ? tab->Window->HasCloseButton : ((tab->Flags & ImGuiTabItemFlags_NoCloseButton) == 0);
 | 
				
			||||||
 | 
					        tab->WidthContents = TabItemCalcSize(tab_name, has_close_button).x;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        width_total_contents += (tab_n > 0 ? g.Style.ItemInnerSpacing.x : 0.0f) + tab->WidthContents;
 | 
					        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
 | 
					        // Store data so we can build an array sorted by width if we need to shrink tabs down
 | 
				
			||||||
@@ -6109,12 +6094,6 @@ static void ImGui::TabBarLayout(ImGuiTabBar* tab_bar)
 | 
				
			|||||||
    tab_bar->OffsetMax = ImMax(offset_x - g.Style.ItemInnerSpacing.x, 0.0f);
 | 
					    tab_bar->OffsetMax = ImMax(offset_x - g.Style.ItemInnerSpacing.x, 0.0f);
 | 
				
			||||||
    tab_bar->OffsetNextTab = 0.0f;
 | 
					    tab_bar->OffsetNextTab = 0.0f;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Tab List Popup
 | 
					 | 
				
			||||||
    const bool tab_list_popup_button = (tab_bar->Flags & ImGuiTabBarFlags_DockNode) != 0 && (tab_bar->Flags & ImGuiTabBarFlags_NoTabListPopupButton) == 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
 | 
					    // 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);
 | 
					    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)
 | 
					    if (scrolling_buttons)
 | 
				
			||||||
@@ -6144,6 +6123,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);
 | 
					    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)
 | 
					    if (tab_bar->ScrollingAnim != tab_bar->ScrollingTarget)
 | 
				
			||||||
        tab_bar->ScrollingAnim = ImLinearSweep(tab_bar->ScrollingAnim, tab_bar->ScrollingTarget, scrolling_speed);
 | 
					        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.
 | 
					// Dockables uses Name/ID in the global namespace. Non-dockable items use the ID stack.
 | 
				
			||||||
@@ -6303,18 +6286,16 @@ static ImGuiTabItem* ImGui::TabBarScrollingButtons(ImGuiTabBar* tab_bar)
 | 
				
			|||||||
    return tab_to_select;
 | 
					    return tab_to_select;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// FIXME-DOCK: Unused by Docking system
 | 
					 | 
				
			||||||
static ImGuiTabItem* ImGui::TabBarTabListPopupButton(ImGuiTabBar* tab_bar)
 | 
					static ImGuiTabItem* ImGui::TabBarTabListPopupButton(ImGuiTabBar* tab_bar)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ImGuiContext& g = *GImGui;
 | 
					    ImGuiContext& g = *GImGui;
 | 
				
			||||||
    ImGuiWindow* window = g.CurrentWindow;
 | 
					    ImGuiWindow* window = g.CurrentWindow;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const float tab_list_popup_button_width = g.FontSize + g.Style.FramePadding.y * 2.0f;
 | 
					    // We use g.Style.FramePadding.y to match the square ArrowButton size
 | 
				
			||||||
 | 
					    const float tab_list_popup_button_width = g.FontSize + g.Style.FramePadding.y;
 | 
				
			||||||
    const ImVec2 backup_cursor_pos = window->DC.CursorPos;
 | 
					    const ImVec2 backup_cursor_pos = window->DC.CursorPos;
 | 
				
			||||||
    tab_bar->BarRect.Max.x -= tab_list_popup_button_width;
 | 
					    window->DC.CursorPos = ImVec2(tab_bar->BarRect.Min.x - g.Style.FramePadding.y, tab_bar->BarRect.Min.y);
 | 
				
			||||||
    if (window->HasCloseButton)
 | 
					    tab_bar->BarRect.Min.x += tab_list_popup_button_width;
 | 
				
			||||||
        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];
 | 
					    ImVec4 arrow_col = g.Style.Colors[ImGuiCol_Text];
 | 
				
			||||||
    arrow_col.w *= 0.5f;
 | 
					    arrow_col.w *= 0.5f;
 | 
				
			||||||
@@ -6329,8 +6310,8 @@ static ImGuiTabItem* ImGui::TabBarTabListPopupButton(ImGuiTabBar* tab_bar)
 | 
				
			|||||||
        for (int tab_n = 0; tab_n < tab_bar->Tabs.Size; tab_n++)
 | 
					        for (int tab_n = 0; tab_n < tab_bar->Tabs.Size; tab_n++)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            ImGuiTabItem* tab = &tab_bar->Tabs[tab_n];
 | 
					            ImGuiTabItem* tab = &tab_bar->Tabs[tab_n];
 | 
				
			||||||
            IM_ASSERT(tab->Window != NULL);
 | 
					            const char* tab_name = tab_bar->GetTabName(tab);
 | 
				
			||||||
            if (MenuItem(tab->Window->Name))
 | 
					            if (Selectable(tab_name, tab_bar->SelectedTabId == tab->ID))
 | 
				
			||||||
                tab_to_select = tab;
 | 
					                tab_to_select = tab;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        EndCombo();
 | 
					        EndCombo();
 | 
				
			||||||
@@ -6425,6 +6406,9 @@ bool    ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open,
 | 
				
			|||||||
    tab_bar->LastTabItemIdx = (short)tab_bar->Tabs.index_from_ptr(tab);
 | 
					    tab_bar->LastTabItemIdx = (short)tab_bar->Tabs.index_from_ptr(tab);
 | 
				
			||||||
    tab->WidthContents = size.x;
 | 
					    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_appearing = (tab_bar->PrevFrameVisible + 1 < g.FrameCount);
 | 
				
			||||||
    const bool tab_bar_focused = (tab_bar->Flags & ImGuiTabBarFlags_IsFocused) != 0;
 | 
					    const bool tab_bar_focused = (tab_bar->Flags & ImGuiTabBarFlags_IsFocused) != 0;
 | 
				
			||||||
    const bool tab_appearing = (tab->LastFrameVisible + 1 < g.FrameCount);
 | 
					    const bool tab_appearing = (tab->LastFrameVisible + 1 < g.FrameCount);
 | 
				
			||||||
@@ -6432,6 +6416,10 @@ bool    ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open,
 | 
				
			|||||||
    tab->Flags = flags;
 | 
					    tab->Flags = flags;
 | 
				
			||||||
    tab->Window = docked_window;
 | 
					    tab->Window = docked_window;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // 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.
 | 
					    // 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!)
 | 
					    // (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))
 | 
					    if (!tab_appearing && !(tab_bar->Flags & ImGuiTabBarFlags_Reorderable))
 | 
				
			||||||
@@ -6593,7 +6581,7 @@ bool    ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // Render tab label, process close button
 | 
					    // Render tab label, process close button
 | 
				
			||||||
    const ImGuiID close_button_id = p_open ? window->GetID((void*)((intptr_t)id + 1)) : 0;
 | 
					    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)
 | 
					    if (just_closed && p_open != NULL)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        *p_open = false;
 | 
					        *p_open = false;
 | 
				
			||||||
@@ -6671,22 +6659,22 @@ void ImGui::TabItemBackground(ImDrawList* draw_list, const ImRect& bb, ImGuiTabI
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Render text label (with custom clipping) + Unsaved Document marker + Close Button logic
 | 
					// 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;
 | 
					    ImGuiContext& g = *GImGui;
 | 
				
			||||||
    ImGuiStyle& style = g.Style;
 | 
					 | 
				
			||||||
    ImVec2 label_size = CalcTextSize(label, NULL, true);
 | 
					    ImVec2 label_size = CalcTextSize(label, NULL, true);
 | 
				
			||||||
    if (bb.GetWidth() <= 1.0f)
 | 
					    if (bb.GetWidth() <= 1.0f)
 | 
				
			||||||
        return false;
 | 
					        return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Render text label (with clipping + alpha gradient) + unsaved marker
 | 
					    // Render text label (with clipping + alpha gradient) + unsaved marker
 | 
				
			||||||
    const char* TAB_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)
 | 
					    if (flags & ImGuiTabItemFlags_UnsavedDocument)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        text_pixel_clip_bb.Max.x -= CalcTextSize(TAB_UNSAVED_MARKER, NULL, false).x;
 | 
					        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));
 | 
					        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 - style.FramePadding, TAB_UNSAVED_MARKER, NULL, NULL);
 | 
					        RenderTextClippedEx(draw_list, unsaved_marker_pos, bb.Max - frame_padding, TAB_UNSAVED_MARKER, NULL, NULL);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    ImRect text_ellipsis_clip_bb = text_pixel_clip_bb;
 | 
					    ImRect text_ellipsis_clip_bb = text_pixel_clip_bb;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -6704,7 +6692,7 @@ bool ImGui::TabItemLabelAndCloseButton(ImDrawList* draw_list, const ImRect& bb,
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
        ImGuiItemHoveredDataBackup last_item_backup;
 | 
					        ImGuiItemHoveredDataBackup last_item_backup;
 | 
				
			||||||
        const float close_button_sz = g.FontSize * 0.5f;
 | 
					        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;
 | 
					            close_button_pressed = true;
 | 
				
			||||||
        last_item_backup.Restore();
 | 
					        last_item_backup.Restore();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user