mirror of
https://github.com/ocornut/imgui.git
synced 2024-11-12 02:00:58 +01:00
RadioButton: Fixed label horizontal alignment to precisely match Checkbox(). + Internals: Checkbox, RadioButton: Single call to ItemSize() for flow layout purpose.
This commit is contained in:
parent
0b05ba18df
commit
f7c879eb60
@ -43,6 +43,7 @@ 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)
|
||||||
|
- 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]
|
||||||
|
@ -895,19 +895,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;
|
||||||
|
|
||||||
@ -923,15 +915,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;
|
||||||
@ -963,26 +954,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);
|
||||||
@ -993,21 +976,20 @@ 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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (style.FrameBorderSize > 0.0f)
|
if (style.FrameBorderSize > 0.0f)
|
||||||
{
|
{
|
||||||
window->DrawList->AddCircle(center+ImVec2(1,1), radius, GetColorU32(ImGuiCol_BorderShadow), 16, style.FrameBorderSize);
|
window->DrawList->AddCircle(center + ImVec2(1,1), radius, GetColorU32(ImGuiCol_BorderShadow), 16, style.FrameBorderSize);
|
||||||
window->DrawList->AddCircle(center, radius, GetColorU32(ImGuiCol_Border), 16, style.FrameBorderSize);
|
window->DrawList->AddCircle(center, radius, GetColorU32(ImGuiCol_Border), 16, style.FrameBorderSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user