mirror of
				https://github.com/ocornut/imgui.git
				synced 2025-11-04 01:34:32 +00:00 
			
		
		
		
	Internal: Refactored Separator into SeparatorEx(), exposed ImGuiSeparatorFlags_SpanAllColumns in imgui_internal.h and support without. (#759) + misc comments
This commit is contained in:
		@@ -133,7 +133,9 @@ It's mostly a bunch of personal notes, probably incomplete. Feel free to query i
 | 
				
			|||||||
 - clipper: ability to disable the clipping through a simple flag/bool.
 | 
					 - clipper: ability to disable the clipping through a simple flag/bool.
 | 
				
			||||||
 - clipper: ability to run without knowing full count in advance.
 | 
					 - clipper: ability to run without knowing full count in advance.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 - splitter/separator: formalize the splitter idiom into an official api (we want to handle n-way split) (#319)
 | 
					 - separator: expose flags (#759)
 | 
				
			||||||
 | 
					 - separator: width, thickness, centering (#1643)
 | 
				
			||||||
 | 
					 - splitter: formalize the splitter idiom into an official api (we want to handle n-way split) (#319)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 - dock: merge docking branch (#2109)
 | 
					 - dock: merge docking branch (#2109)
 | 
				
			||||||
 - dock: dock out from a collapsing header? would work nicely but need emitting window to keep submitting the code.
 | 
					 - dock: dock out from a collapsing header? would work nicely but need emitting window to keep submitting the code.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5445,7 +5445,8 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
 | 
				
			|||||||
        window->InnerMainRect.Max.x = window->Pos.x + window->Size.x - ImMax(window->ScrollbarSizes.x, window->WindowBorderSize);
 | 
					        window->InnerMainRect.Max.x = window->Pos.x + window->Size.x - ImMax(window->ScrollbarSizes.x, window->WindowBorderSize);
 | 
				
			||||||
        window->InnerMainRect.Max.y = window->Pos.y + window->Size.y - ImMax(window->ScrollbarSizes.y, window->WindowBorderSize);
 | 
					        window->InnerMainRect.Max.y = window->Pos.y + window->Size.y - ImMax(window->ScrollbarSizes.y, window->WindowBorderSize);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Inner clipping rectangle
 | 
					        // Inner clipping rectangle will extend a little bit outside the work region.
 | 
				
			||||||
 | 
					        // This is to allow e.g. Selectable or CollapsingHeader or some separators to cover that space.
 | 
				
			||||||
        // Force round operator last to ensure that e.g. (int)(max.x-min.x) in user's render code produce correct result.
 | 
					        // Force round operator last to ensure that e.g. (int)(max.x-min.x) in user's render code produce correct result.
 | 
				
			||||||
        window->InnerClipRect.Min.x = ImFloor(0.5f + window->InnerMainRect.Min.x + ImMax(0.0f, ImFloor(window->WindowPadding.x * 0.5f - window->WindowBorderSize)));
 | 
					        window->InnerClipRect.Min.x = ImFloor(0.5f + window->InnerMainRect.Min.x + ImMax(0.0f, ImFloor(window->WindowPadding.x * 0.5f - window->WindowBorderSize)));
 | 
				
			||||||
        window->InnerClipRect.Min.y = ImFloor(0.5f + window->InnerMainRect.Min.y);
 | 
					        window->InnerClipRect.Min.y = ImFloor(0.5f + window->InnerMainRect.Min.y);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -354,7 +354,8 @@ enum ImGuiSeparatorFlags_
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    ImGuiSeparatorFlags_None                = 0,
 | 
					    ImGuiSeparatorFlags_None                = 0,
 | 
				
			||||||
    ImGuiSeparatorFlags_Horizontal          = 1 << 0,   // Axis default to current layout type, so generally Horizontal unless e.g. in a menu bar
 | 
					    ImGuiSeparatorFlags_Horizontal          = 1 << 0,   // Axis default to current layout type, so generally Horizontal unless e.g. in a menu bar
 | 
				
			||||||
    ImGuiSeparatorFlags_Vertical            = 1 << 1
 | 
					    ImGuiSeparatorFlags_Vertical            = 1 << 1,
 | 
				
			||||||
 | 
					    ImGuiSeparatorFlags_SpanAllColumns      = 1 << 2
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Transient per-window flags, reset at the beginning of the frame. For child window, inherited from parent on first Begin().
 | 
					// Transient per-window flags, reset at the beginning of the frame. For child window, inherited from parent on first Begin().
 | 
				
			||||||
@@ -1551,7 +1552,7 @@ namespace ImGui
 | 
				
			|||||||
    IMGUI_API bool          ArrowButtonEx(const char* str_id, ImGuiDir dir, ImVec2 size_arg, ImGuiButtonFlags flags);
 | 
					    IMGUI_API bool          ArrowButtonEx(const char* str_id, ImGuiDir dir, ImVec2 size_arg, ImGuiButtonFlags flags);
 | 
				
			||||||
    IMGUI_API void          Scrollbar(ImGuiAxis axis);
 | 
					    IMGUI_API void          Scrollbar(ImGuiAxis axis);
 | 
				
			||||||
    IMGUI_API ImGuiID       GetScrollbarID(ImGuiWindow* window, ImGuiAxis axis);
 | 
					    IMGUI_API ImGuiID       GetScrollbarID(ImGuiWindow* window, ImGuiAxis axis);
 | 
				
			||||||
    IMGUI_API void          VerticalSeparator();        // Vertical separator, for menu bars (use current line height). Not exposed because it is misleading and it doesn't have an effect on regular layout.
 | 
					    IMGUI_API void          SeparatorEx(ImGuiSeparatorFlags flags);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Widgets low-level behaviors
 | 
					    // Widgets low-level behaviors
 | 
				
			||||||
    IMGUI_API bool          ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool* out_held, ImGuiButtonFlags flags = 0);
 | 
					    IMGUI_API bool          ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool* out_held, ImGuiButtonFlags flags = 0);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1146,8 +1146,8 @@ void ImGui::Bullet()
 | 
				
			|||||||
// - Dummy()
 | 
					// - Dummy()
 | 
				
			||||||
// - NewLine()
 | 
					// - NewLine()
 | 
				
			||||||
// - AlignTextToFramePadding()
 | 
					// - AlignTextToFramePadding()
 | 
				
			||||||
 | 
					// - SeparatorEx() [Internal]
 | 
				
			||||||
// - Separator()
 | 
					// - Separator()
 | 
				
			||||||
// - VerticalSeparator() [Internal]
 | 
					 | 
				
			||||||
// - SplitterBehavior() [Internal]
 | 
					// - SplitterBehavior() [Internal]
 | 
				
			||||||
//-------------------------------------------------------------------------
 | 
					//-------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1198,69 +1198,75 @@ void ImGui::AlignTextToFramePadding()
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Horizontal/vertical separating line
 | 
					// Horizontal/vertical separating line
 | 
				
			||||||
void ImGui::Separator()
 | 
					void ImGui::SeparatorEx(ImGuiSeparatorFlags flags)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ImGuiWindow* window = GetCurrentWindow();
 | 
					    ImGuiWindow* window = GetCurrentWindow();
 | 
				
			||||||
    if (window->SkipItems)
 | 
					    if (window->SkipItems)
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
    ImGuiContext& g = *GImGui;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Those flags should eventually be overrideable by the user
 | 
					    ImGuiContext& g = *GImGui;
 | 
				
			||||||
    ImGuiSeparatorFlags flags = (window->DC.LayoutType == ImGuiLayoutType_Horizontal) ? ImGuiSeparatorFlags_Vertical : ImGuiSeparatorFlags_Horizontal;
 | 
					 | 
				
			||||||
    IM_ASSERT(ImIsPowerOfTwo(flags & (ImGuiSeparatorFlags_Horizontal | ImGuiSeparatorFlags_Vertical)));   // Check that only 1 option is selected
 | 
					    IM_ASSERT(ImIsPowerOfTwo(flags & (ImGuiSeparatorFlags_Horizontal | ImGuiSeparatorFlags_Vertical)));   // Check that only 1 option is selected
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (flags & ImGuiSeparatorFlags_Vertical)
 | 
					    if (flags & ImGuiSeparatorFlags_Vertical)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        VerticalSeparator();
 | 
					        // Vertical separator, for menu bars (use current line height). Not exposed because it is misleading and it doesn't have an effect on regular layout.
 | 
				
			||||||
        return;
 | 
					        float y1 = window->DC.CursorPos.y;
 | 
				
			||||||
 | 
					        float y2 = window->DC.CursorPos.y + window->DC.CurrentLineSize.y;
 | 
				
			||||||
 | 
					        const ImRect bb(ImVec2(window->DC.CursorPos.x, y1), ImVec2(window->DC.CursorPos.x + 1.0f, y2));
 | 
				
			||||||
 | 
					        ItemSize(ImVec2(1.0f, 0.0f));
 | 
				
			||||||
 | 
					        if (!ItemAdd(bb, 0))
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Draw
 | 
				
			||||||
 | 
					        window->DrawList->AddLine(ImVec2(bb.Min.x, bb.Min.y), ImVec2(bb.Min.x, bb.Max.y), GetColorU32(ImGuiCol_Separator));
 | 
				
			||||||
 | 
					        if (g.LogEnabled)
 | 
				
			||||||
 | 
					            LogText(" |");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    else if (flags & ImGuiSeparatorFlags_Horizontal)
 | 
				
			||||||
    // Horizontal Separator
 | 
					 | 
				
			||||||
    if (window->DC.CurrentColumns)
 | 
					 | 
				
			||||||
        PushColumnsBackground();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    float x1 = window->Pos.x;
 | 
					 | 
				
			||||||
    float x2 = window->Pos.x + window->Size.x;
 | 
					 | 
				
			||||||
    if (!window->DC.GroupStack.empty())
 | 
					 | 
				
			||||||
        x1 += window->DC.Indent.x;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    const ImRect bb(ImVec2(x1, window->DC.CursorPos.y), ImVec2(x2, window->DC.CursorPos.y+1.0f));
 | 
					 | 
				
			||||||
    ItemSize(ImVec2(0.0f, 1.0f)); // NB: we don't provide our width so that it doesn't get feed back into AutoFit
 | 
					 | 
				
			||||||
    if (!ItemAdd(bb, 0))
 | 
					 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        if (window->DC.CurrentColumns)
 | 
					        // Horizontal Separator
 | 
				
			||||||
 | 
					        float x1 = window->Pos.x;
 | 
				
			||||||
 | 
					        float x2 = window->Pos.x + window->Size.x;
 | 
				
			||||||
 | 
					        if (!window->DC.GroupStack.empty())
 | 
				
			||||||
 | 
					            x1 += window->DC.Indent.x;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ImGuiColumns* columns = (flags & ImGuiSeparatorFlags_SpanAllColumns) ? window->DC.CurrentColumns : NULL;
 | 
				
			||||||
 | 
					        if (columns)
 | 
				
			||||||
 | 
					            PushColumnsBackground();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const ImRect bb(ImVec2(x1, window->DC.CursorPos.y), ImVec2(x2, window->DC.CursorPos.y + 1.0f));
 | 
				
			||||||
 | 
					        ItemSize(ImVec2(0.0f, 1.0f)); // NB: we don't provide our width so that it doesn't get feed back into AutoFit
 | 
				
			||||||
 | 
					        if (!ItemAdd(bb, 0))
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (columns)
 | 
				
			||||||
 | 
					                PopColumnsBackground();
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Draw
 | 
				
			||||||
 | 
					        window->DrawList->AddLine(bb.Min, ImVec2(bb.Max.x, bb.Min.y), GetColorU32(ImGuiCol_Separator));
 | 
				
			||||||
 | 
					        if (g.LogEnabled)
 | 
				
			||||||
 | 
					            LogRenderedText(&bb.Min, "--------------------------------");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (columns)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
            PopColumnsBackground();
 | 
					            PopColumnsBackground();
 | 
				
			||||||
        return;
 | 
					            columns->LineMinY = window->DC.CursorPos.y;
 | 
				
			||||||
    }
 | 
					        }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    window->DrawList->AddLine(bb.Min, ImVec2(bb.Max.x,bb.Min.y), GetColorU32(ImGuiCol_Separator));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (g.LogEnabled)
 | 
					 | 
				
			||||||
        LogRenderedText(&bb.Min, "--------------------------------");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (window->DC.CurrentColumns)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        PopColumnsBackground();
 | 
					 | 
				
			||||||
        window->DC.CurrentColumns->LineMinY = window->DC.CursorPos.y;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ImGui::VerticalSeparator()
 | 
					void ImGui::Separator()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ImGuiWindow* window = GetCurrentWindow();
 | 
					    ImGuiContext& g = *GImGui;
 | 
				
			||||||
 | 
					    ImGuiWindow* window = g.CurrentWindow;
 | 
				
			||||||
    if (window->SkipItems)
 | 
					    if (window->SkipItems)
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
    ImGuiContext& g = *GImGui;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    float y1 = window->DC.CursorPos.y;
 | 
					    // Those flags should eventually be overridable by the user
 | 
				
			||||||
    float y2 = window->DC.CursorPos.y + window->DC.CurrentLineSize.y;
 | 
					    ImGuiSeparatorFlags flags = (window->DC.LayoutType == ImGuiLayoutType_Horizontal) ? ImGuiSeparatorFlags_Vertical : ImGuiSeparatorFlags_Horizontal;
 | 
				
			||||||
    const ImRect bb(ImVec2(window->DC.CursorPos.x, y1), ImVec2(window->DC.CursorPos.x + 1.0f, y2));
 | 
					    flags |= ImGuiSeparatorFlags_SpanAllColumns;
 | 
				
			||||||
    ItemSize(ImVec2(1.0f, 0.0f));
 | 
					    SeparatorEx(flags);
 | 
				
			||||||
    if (!ItemAdd(bb, 0))
 | 
					 | 
				
			||||||
        return;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    window->DrawList->AddLine(ImVec2(bb.Min.x, bb.Min.y), ImVec2(bb.Min.x, bb.Max.y), GetColorU32(ImGuiCol_Separator));
 | 
					 | 
				
			||||||
    if (g.LogEnabled)
 | 
					 | 
				
			||||||
        LogText(" |");
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Using 'hover_visibility_delay' allows us to hide the highlight and mouse cursor for a short time, which can be convenient to reduce visual noise.
 | 
					// Using 'hover_visibility_delay' allows us to hide the highlight and mouse cursor for a short time, which can be convenient to reduce visual noise.
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user