mirror of
				https://github.com/ocornut/imgui.git
				synced 2025-11-04 01:34:32 +00:00 
			
		
		
		
	Internals: swapped blocks in TextEx() to make it easier to step through common cases. Tweak demo.
This commit is contained in:
		
							
								
								
									
										13
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								imgui.cpp
									
									
									
									
									
								
							@@ -8301,20 +8301,22 @@ bool ImGui::ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb_arg, ImGu
 | 
				
			|||||||
//      spacing_w >= 0           : enforce spacing amount
 | 
					//      spacing_w >= 0           : enforce spacing amount
 | 
				
			||||||
void ImGui::SameLine(float offset_from_start_x, float spacing_w)
 | 
					void ImGui::SameLine(float offset_from_start_x, float spacing_w)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ImGuiWindow* window = GetCurrentWindow();
 | 
					    ImGuiContext& g = *GImGui;
 | 
				
			||||||
 | 
					    ImGuiWindow* window = g.CurrentWindow;
 | 
				
			||||||
    if (window->SkipItems)
 | 
					    if (window->SkipItems)
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ImGuiContext& g = *GImGui;
 | 
					 | 
				
			||||||
    if (offset_from_start_x != 0.0f)
 | 
					    if (offset_from_start_x != 0.0f)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        if (spacing_w < 0.0f) spacing_w = 0.0f;
 | 
					        if (spacing_w < 0.0f)
 | 
				
			||||||
 | 
					            spacing_w = 0.0f;
 | 
				
			||||||
        window->DC.CursorPos.x = window->Pos.x - window->Scroll.x + offset_from_start_x + spacing_w + window->DC.GroupOffset.x + window->DC.ColumnsOffset.x;
 | 
					        window->DC.CursorPos.x = window->Pos.x - window->Scroll.x + offset_from_start_x + spacing_w + window->DC.GroupOffset.x + window->DC.ColumnsOffset.x;
 | 
				
			||||||
        window->DC.CursorPos.y = window->DC.CursorPosPrevLine.y;
 | 
					        window->DC.CursorPos.y = window->DC.CursorPosPrevLine.y;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        if (spacing_w < 0.0f) spacing_w = g.Style.ItemSpacing.x;
 | 
					        if (spacing_w < 0.0f)
 | 
				
			||||||
 | 
					            spacing_w = g.Style.ItemSpacing.x;
 | 
				
			||||||
        window->DC.CursorPos.x = window->DC.CursorPosPrevLine.x + spacing_w;
 | 
					        window->DC.CursorPos.x = window->DC.CursorPosPrevLine.x + spacing_w;
 | 
				
			||||||
        window->DC.CursorPos.y = window->DC.CursorPosPrevLine.y;
 | 
					        window->DC.CursorPos.y = window->DC.CursorPosPrevLine.y;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -8464,7 +8466,8 @@ float ImGui::CalcItemWidth()
 | 
				
			|||||||
// The 4.0f here may be changed to match CalcItemWidth() and/or BeginChild() (right now we have a mismatch which is harmless but undesirable)
 | 
					// The 4.0f here may be changed to match CalcItemWidth() and/or BeginChild() (right now we have a mismatch which is harmless but undesirable)
 | 
				
			||||||
ImVec2 ImGui::CalcItemSize(ImVec2 size, float default_w, float default_h)
 | 
					ImVec2 ImGui::CalcItemSize(ImVec2 size, float default_w, float default_h)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ImGuiWindow* window = GImGui->CurrentWindow;
 | 
					    ImGuiContext& g = *GImGui;
 | 
				
			||||||
 | 
					    ImGuiWindow* window = g.CurrentWindow;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ImVec2 region_max;
 | 
					    ImVec2 region_max;
 | 
				
			||||||
    if (size.x < 0.0f || size.y < 0.0f)
 | 
					    if (size.x < 0.0f || size.y < 0.0f)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1882,6 +1882,15 @@ static void ShowDemoWindowWidgets()
 | 
				
			|||||||
        if (ImGui::Button("Default: Float + HDR + Hue Wheel"))
 | 
					        if (ImGui::Button("Default: Float + HDR + Hue Wheel"))
 | 
				
			||||||
            ImGui::SetColorEditOptions(ImGuiColorEditFlags_Float | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_PickerHueWheel);
 | 
					            ImGui::SetColorEditOptions(ImGuiColorEditFlags_Float | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_PickerHueWheel);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Always both a small version of both types of pickers (to make it more visible in the demo to people who are skimming quickly through it)
 | 
				
			||||||
 | 
					        ImGui::Text("Both types:");
 | 
				
			||||||
 | 
					        float w = (ImGui::GetContentRegionAvail().x - ImGui::GetStyle().ItemSpacing.y) * 0.40f;
 | 
				
			||||||
 | 
					        ImGui::SetNextItemWidth(w);
 | 
				
			||||||
 | 
					        ImGui::ColorPicker3("##MyColor##5", (float*)&color, ImGuiColorEditFlags_PickerHueBar | ImGuiColorEditFlags_NoSidePreview | ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoAlpha);
 | 
				
			||||||
 | 
					        ImGui::SameLine();
 | 
				
			||||||
 | 
					        ImGui::SetNextItemWidth(w);
 | 
				
			||||||
 | 
					        ImGui::ColorPicker3("##MyColor##6", (float*)&color, ImGuiColorEditFlags_PickerHueWheel | ImGuiColorEditFlags_NoSidePreview | ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoAlpha);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // HSV encoded support (to avoid RGB<>HSV round trips and singularities when S==0 or V==0)
 | 
					        // HSV encoded support (to avoid RGB<>HSV round trips and singularities when S==0 or V==0)
 | 
				
			||||||
        static ImVec4 color_hsv(0.23f, 1.0f, 1.0f, 1.0f); // Stored as HSV!
 | 
					        static ImVec4 color_hsv(0.23f, 1.0f, 1.0f, 1.0f); // Stored as HSV!
 | 
				
			||||||
        ImGui::Spacing();
 | 
					        ImGui::Spacing();
 | 
				
			||||||
@@ -4419,14 +4428,16 @@ static void ShowDemoWindowTables()
 | 
				
			|||||||
            {
 | 
					            {
 | 
				
			||||||
                ImGui::TableNextColumn();
 | 
					                ImGui::TableNextColumn();
 | 
				
			||||||
                ImGui::PushID(column);
 | 
					                ImGui::PushID(column);
 | 
				
			||||||
                ImGui::AlignTextToFramePadding(); // FIXME-TABLE: Workaround for wrong text baseline propagation
 | 
					                ImGui::AlignTextToFramePadding(); // FIXME-TABLE: Workaround for wrong text baseline propagation across columns
 | 
				
			||||||
                ImGui::Text("'%s'", column_names[column]);
 | 
					                ImGui::Text("'%s'", column_names[column]);
 | 
				
			||||||
                ImGui::Spacing();
 | 
					                ImGui::Spacing();
 | 
				
			||||||
                ImGui::Text("Input flags:");
 | 
					                ImGui::Text("Input flags:");
 | 
				
			||||||
                EditTableColumnsFlags(&column_flags[column]);
 | 
					                EditTableColumnsFlags(&column_flags[column]);
 | 
				
			||||||
                ImGui::Spacing();
 | 
					                ImGui::Spacing();
 | 
				
			||||||
                ImGui::Text("Output flags:");
 | 
					                ImGui::Text("Output flags:");
 | 
				
			||||||
 | 
					                ImGui::BeginDisabled();
 | 
				
			||||||
                ShowTableColumnsStatusFlags(column_flags_out[column]);
 | 
					                ShowTableColumnsStatusFlags(column_flags_out[column]);
 | 
				
			||||||
 | 
					                ImGui::EndDisabled();
 | 
				
			||||||
                ImGui::PopID();
 | 
					                ImGui::PopID();
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            PopStyleCompact();
 | 
					            PopStyleCompact();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -167,7 +167,21 @@ void ImGui::TextEx(const char* text, const char* text_end, ImGuiTextFlags flags)
 | 
				
			|||||||
    const ImVec2 text_pos(window->DC.CursorPos.x, window->DC.CursorPos.y + window->DC.CurrLineTextBaseOffset);
 | 
					    const ImVec2 text_pos(window->DC.CursorPos.x, window->DC.CursorPos.y + window->DC.CurrLineTextBaseOffset);
 | 
				
			||||||
    const float wrap_pos_x = window->DC.TextWrapPos;
 | 
					    const float wrap_pos_x = window->DC.TextWrapPos;
 | 
				
			||||||
    const bool wrap_enabled = (wrap_pos_x >= 0.0f);
 | 
					    const bool wrap_enabled = (wrap_pos_x >= 0.0f);
 | 
				
			||||||
    if (text_end - text > 2000 && !wrap_enabled)
 | 
					    if (text_end - text <= 2000 || wrap_enabled)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        // Common case
 | 
				
			||||||
 | 
					        const float wrap_width = wrap_enabled ? CalcWrapWidthForPos(window->DC.CursorPos, wrap_pos_x) : 0.0f;
 | 
				
			||||||
 | 
					        const ImVec2 text_size = CalcTextSize(text_begin, text_end, false, wrap_width);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ImRect bb(text_pos, text_pos + text_size);
 | 
				
			||||||
 | 
					        ItemSize(text_size, 0.0f);
 | 
				
			||||||
 | 
					        if (!ItemAdd(bb, 0))
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Render (we don't hide text after ## in this end-user function)
 | 
				
			||||||
 | 
					        RenderTextWrapped(bb.Min, text_begin, text_end, wrap_width);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        // Long text!
 | 
					        // Long text!
 | 
				
			||||||
        // Perform manual coarse clipping to optimize for long multi-line text
 | 
					        // Perform manual coarse clipping to optimize for long multi-line text
 | 
				
			||||||
@@ -240,19 +254,6 @@ void ImGui::TextEx(const char* text, const char* text_end, ImGuiTextFlags flags)
 | 
				
			|||||||
        ItemSize(text_size, 0.0f);
 | 
					        ItemSize(text_size, 0.0f);
 | 
				
			||||||
        ItemAdd(bb, 0);
 | 
					        ItemAdd(bb, 0);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        const float wrap_width = wrap_enabled ? CalcWrapWidthForPos(window->DC.CursorPos, wrap_pos_x) : 0.0f;
 | 
					 | 
				
			||||||
        const ImVec2 text_size = CalcTextSize(text_begin, text_end, false, wrap_width);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        ImRect bb(text_pos, text_pos + text_size);
 | 
					 | 
				
			||||||
        ItemSize(text_size, 0.0f);
 | 
					 | 
				
			||||||
        if (!ItemAdd(bb, 0))
 | 
					 | 
				
			||||||
            return;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // Render (we don't hide text after ## in this end-user function)
 | 
					 | 
				
			||||||
        RenderTextWrapped(bb.Min, text_begin, text_end, wrap_width);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ImGui::TextUnformatted(const char* text, const char* text_end)
 | 
					void ImGui::TextUnformatted(const char* text, const char* text_end)
 | 
				
			||||||
@@ -1285,7 +1286,7 @@ void ImGui::Bullet()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    ImGuiContext& g = *GImGui;
 | 
					    ImGuiContext& g = *GImGui;
 | 
				
			||||||
    const ImGuiStyle& style = g.Style;
 | 
					    const ImGuiStyle& style = g.Style;
 | 
				
			||||||
    const float line_height = ImMax(ImMin(window->DC.CurrLineSize.y, g.FontSize + g.Style.FramePadding.y * 2), g.FontSize);
 | 
					    const float line_height = ImMax(ImMin(window->DC.CurrLineSize.y, g.FontSize + style.FramePadding.y * 2), g.FontSize);
 | 
				
			||||||
    const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(g.FontSize, line_height));
 | 
					    const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(g.FontSize, line_height));
 | 
				
			||||||
    ItemSize(bb);
 | 
					    ItemSize(bb);
 | 
				
			||||||
    if (!ItemAdd(bb, 0))
 | 
					    if (!ItemAdd(bb, 0))
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user