mirror of
https://github.com/ocornut/imgui.git
synced 2025-12-17 03:45:31 +00:00
Internals: refactor RenderRectFilledRangeH() into RenderRectFilledInRangeH() to take absolute coordinates instead of normalized ones.
Amend 01d4bf299a (#1296)
This commit is contained in:
2
imgui.h
2
imgui.h
@@ -1927,7 +1927,7 @@ enum ImGuiSliderFlags_
|
|||||||
ImGuiSliderFlags_ClampZeroRange = 1 << 10, // Clamp even if min==max==0.0f. Otherwise due to legacy reason DragXXX functions don't clamp with those values. When your clamping limits are dynamic you almost always want to use it.
|
ImGuiSliderFlags_ClampZeroRange = 1 << 10, // Clamp even if min==max==0.0f. Otherwise due to legacy reason DragXXX functions don't clamp with those values. When your clamping limits are dynamic you almost always want to use it.
|
||||||
ImGuiSliderFlags_NoSpeedTweaks = 1 << 11, // Disable keyboard modifiers altering tweak speed. Useful if you want to alter tweak speed yourself based on your own logic.
|
ImGuiSliderFlags_NoSpeedTweaks = 1 << 11, // Disable keyboard modifiers altering tweak speed. Useful if you want to alter tweak speed yourself based on your own logic.
|
||||||
ImGuiSliderFlags_AlwaysClamp = ImGuiSliderFlags_ClampOnInput | ImGuiSliderFlags_ClampZeroRange,
|
ImGuiSliderFlags_AlwaysClamp = ImGuiSliderFlags_ClampOnInput | ImGuiSliderFlags_ClampZeroRange,
|
||||||
ImGuiSliderFlags_InvalidMask_ = 0x7000000F, // [Internal] We treat using those bits as being potentially a 'float power' argument from the previous API that has got miscast to this enum, and will trigger an assert if needed.
|
ImGuiSliderFlags_InvalidMask_ = 0x7000000F, // [Internal] We treat using those bits as being potentially a 'float power' argument from legacy API (obsoleted 2020-08) that has got miscast to this enum, and will trigger an assert if needed.
|
||||||
};
|
};
|
||||||
|
|
||||||
// Identify a mouse button.
|
// Identify a mouse button.
|
||||||
|
|||||||
@@ -2045,10 +2045,12 @@ static void DemoWindowWidgetsProgressBars()
|
|||||||
if (ImGui::TreeNode("Progress Bars"))
|
if (ImGui::TreeNode("Progress Bars"))
|
||||||
{
|
{
|
||||||
// Animate a simple progress bar
|
// Animate a simple progress bar
|
||||||
static float progress = 0.0f, progress_dir = 1.0f;
|
static float progress_accum = 0.0f, progress_dir = 1.0f;
|
||||||
progress += progress_dir * 0.4f * ImGui::GetIO().DeltaTime;
|
progress_accum += progress_dir * 0.4f * ImGui::GetIO().DeltaTime;
|
||||||
if (progress >= +1.1f) { progress = +1.1f; progress_dir *= -1.0f; }
|
if (progress_accum >= +1.1f) { progress_accum = +1.1f; progress_dir *= -1.0f; }
|
||||||
if (progress <= -0.1f) { progress = -0.1f; progress_dir *= -1.0f; }
|
if (progress_accum <= -0.1f) { progress_accum = -0.1f; progress_dir *= -1.0f; }
|
||||||
|
|
||||||
|
const float progress = IM_CLAMP(progress_accum, 0.0f, 1.0f);
|
||||||
|
|
||||||
// Typically we would use ImVec2(-1.0f,0.0f) or ImVec2(-FLT_MIN,0.0f) to use all available width,
|
// Typically we would use ImVec2(-1.0f,0.0f) or ImVec2(-FLT_MIN,0.0f) to use all available width,
|
||||||
// or ImVec2(width,0.0f) for a specified width. ImVec2(0.0f,0.0f) uses ItemWidth.
|
// or ImVec2(width,0.0f) for a specified width. ImVec2(0.0f,0.0f) uses ItemWidth.
|
||||||
@@ -2056,9 +2058,8 @@ static void DemoWindowWidgetsProgressBars()
|
|||||||
ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x);
|
ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x);
|
||||||
ImGui::Text("Progress Bar");
|
ImGui::Text("Progress Bar");
|
||||||
|
|
||||||
float progress_saturated = IM_CLAMP(progress, 0.0f, 1.0f);
|
|
||||||
char buf[32];
|
char buf[32];
|
||||||
sprintf(buf, "%d/%d", (int)(progress_saturated * 1753), 1753);
|
sprintf(buf, "%d/%d", (int)(progress * 1753), 1753);
|
||||||
ImGui::ProgressBar(progress, ImVec2(0.f, 0.f), buf);
|
ImGui::ProgressBar(progress, ImVec2(0.f, 0.f), buf);
|
||||||
|
|
||||||
// Pass an animated negative value, e.g. -1.0f * (float)ImGui::GetTime() is the recommended value.
|
// Pass an animated negative value, e.g. -1.0f * (float)ImGui::GetTime() is the recommended value.
|
||||||
|
|||||||
@@ -5830,7 +5830,7 @@ begin:
|
|||||||
// - RenderBullet()
|
// - RenderBullet()
|
||||||
// - RenderCheckMark()
|
// - RenderCheckMark()
|
||||||
// - RenderArrowPointingAt()
|
// - RenderArrowPointingAt()
|
||||||
// - RenderRectFilledRangeH()
|
// - RenderRectFilledInRangeH()
|
||||||
// - RenderRectFilledWithHole()
|
// - RenderRectFilledWithHole()
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Function in need of a redesign (legacy mess)
|
// Function in need of a redesign (legacy mess)
|
||||||
@@ -5913,15 +5913,15 @@ static inline float ImAcos01(float x)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: Cleanup and move code to ImDrawList.
|
// FIXME: Cleanup and move code to ImDrawList.
|
||||||
void ImGui::RenderRectFilledRangeH(ImDrawList* draw_list, const ImRect& rect, ImU32 col, float x_start_norm, float x_end_norm, float rounding)
|
// - Before 2025-12-04: RenderRectFilledRangeH() with 'float x_start_norm, float x_end_norm` <- normalized
|
||||||
|
// - After 2025-12-04: RenderRectFilledInRangeH() with 'float x1, float x2' <- absolute coords!!
|
||||||
|
void ImGui::RenderRectFilledInRangeH(ImDrawList* draw_list, const ImRect& rect, ImU32 col, float x1, float x2, float rounding)
|
||||||
{
|
{
|
||||||
if (x_end_norm == x_start_norm)
|
if (x1 == x2)
|
||||||
return;
|
return;
|
||||||
if (x_start_norm > x_end_norm)
|
|
||||||
ImSwap(x_start_norm, x_end_norm);
|
|
||||||
|
|
||||||
ImVec2 p0 = ImVec2(ImLerp(rect.Min.x, rect.Max.x, x_start_norm), rect.Min.y);
|
ImVec2 p0 = ImVec2(x1, rect.Min.y);
|
||||||
ImVec2 p1 = ImVec2(ImLerp(rect.Min.x, rect.Max.x, x_end_norm), rect.Max.y);
|
ImVec2 p1 = ImVec2(x2, rect.Max.y);
|
||||||
if (rounding == 0.0f)
|
if (rounding == 0.0f)
|
||||||
{
|
{
|
||||||
draw_list->AddRectFilled(p0, p1, col, 0.0f);
|
draw_list->AddRectFilled(p0, p1, col, 0.0f);
|
||||||
|
|||||||
@@ -3587,7 +3587,7 @@ namespace ImGui
|
|||||||
IMGUI_API void RenderBullet(ImDrawList* draw_list, ImVec2 pos, ImU32 col);
|
IMGUI_API void RenderBullet(ImDrawList* draw_list, ImVec2 pos, ImU32 col);
|
||||||
IMGUI_API void RenderCheckMark(ImDrawList* draw_list, ImVec2 pos, ImU32 col, float sz);
|
IMGUI_API void RenderCheckMark(ImDrawList* draw_list, ImVec2 pos, ImU32 col, float sz);
|
||||||
IMGUI_API void RenderArrowPointingAt(ImDrawList* draw_list, ImVec2 pos, ImVec2 half_sz, ImGuiDir direction, ImU32 col);
|
IMGUI_API void RenderArrowPointingAt(ImDrawList* draw_list, ImVec2 pos, ImVec2 half_sz, ImGuiDir direction, ImU32 col);
|
||||||
IMGUI_API void RenderRectFilledRangeH(ImDrawList* draw_list, const ImRect& rect, ImU32 col, float x_start_norm, float x_end_norm, float rounding);
|
IMGUI_API void RenderRectFilledInRangeH(ImDrawList* draw_list, const ImRect& rect, ImU32 col, float x1, float x2, float rounding);
|
||||||
IMGUI_API void RenderRectFilledWithHole(ImDrawList* draw_list, const ImRect& outer, const ImRect& inner, ImU32 col, float rounding);
|
IMGUI_API void RenderRectFilledWithHole(ImDrawList* draw_list, const ImRect& outer, const ImRect& inner, ImU32 col, float rounding);
|
||||||
|
|
||||||
// Widgets: Text
|
// Widgets: Text
|
||||||
|
|||||||
@@ -1440,7 +1440,10 @@ void ImGui::ProgressBar(float fraction, const ImVec2& size_arg, const char* over
|
|||||||
// Render
|
// Render
|
||||||
RenderFrame(bb.Min, bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding);
|
RenderFrame(bb.Min, bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding);
|
||||||
bb.Expand(ImVec2(-style.FrameBorderSize, -style.FrameBorderSize));
|
bb.Expand(ImVec2(-style.FrameBorderSize, -style.FrameBorderSize));
|
||||||
RenderRectFilledRangeH(window->DrawList, bb, GetColorU32(ImGuiCol_PlotHistogram), fill_n0, fill_n1, style.FrameRounding);
|
float fill_x0 = ImLerp(bb.Min.x, bb.Max.x, fill_n0);
|
||||||
|
float fill_x1 = ImLerp(bb.Min.x, bb.Max.x, fill_n1);
|
||||||
|
if (fill_x0 < fill_x1)
|
||||||
|
RenderRectFilledInRangeH(window->DrawList, bb, GetColorU32(ImGuiCol_PlotHistogram), fill_x0, fill_x1, style.FrameRounding);
|
||||||
|
|
||||||
// Default displaying the fraction as percentage string, but user can override it
|
// Default displaying the fraction as percentage string, but user can override it
|
||||||
// Don't display text for indeterminate bars by default
|
// Don't display text for indeterminate bars by default
|
||||||
@@ -1456,7 +1459,7 @@ void ImGui::ProgressBar(float fraction, const ImVec2& size_arg, const char* over
|
|||||||
ImVec2 overlay_size = CalcTextSize(overlay, NULL);
|
ImVec2 overlay_size = CalcTextSize(overlay, NULL);
|
||||||
if (overlay_size.x > 0.0f)
|
if (overlay_size.x > 0.0f)
|
||||||
{
|
{
|
||||||
float text_x = is_indeterminate ? (bb.Min.x + bb.Max.x - overlay_size.x) * 0.5f : ImLerp(bb.Min.x, bb.Max.x, fill_n1) + style.ItemSpacing.x;
|
float text_x = is_indeterminate ? (bb.Min.x + bb.Max.x - overlay_size.x) * 0.5f : fill_x1 + style.ItemSpacing.x;
|
||||||
RenderTextClipped(ImVec2(ImClamp(text_x, bb.Min.x, bb.Max.x - overlay_size.x - style.ItemInnerSpacing.x), bb.Min.y), bb.Max, overlay, NULL, &overlay_size, ImVec2(0.0f, 0.5f), &bb);
|
RenderTextClipped(ImVec2(ImClamp(text_x, bb.Min.x, bb.Max.x - overlay_size.x - style.ItemInnerSpacing.x), bb.Min.y), bb.Max, overlay, NULL, &overlay_size, ImVec2(0.0f, 0.5f), &bb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user