|
|
@@ -325,7 +325,7 @@ void ImGui::LabelTextV(const char* label, const char* fmt, va_list args)
|
|
|
|
|
|
ImGuiContext& g = *GImGui;
|
|
|
const ImGuiStyle& style = g.Style;
|
|
|
- const float w = CalcItemWidth();
|
|
|
+ const float w = GetNextItemWidth();
|
|
|
|
|
|
const ImVec2 label_size = CalcTextSize(label, NULL, true);
|
|
|
const ImRect value_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w, label_size.y + style.FramePadding.y*2));
|
|
|
@@ -788,16 +788,19 @@ void ImGui::Scrollbar(ImGuiAxis axis)
|
|
|
// Render background
|
|
|
bool other_scrollbar = (horizontal ? window->ScrollbarY : window->ScrollbarX);
|
|
|
float other_scrollbar_size_w = other_scrollbar ? style.ScrollbarSize : 0.0f;
|
|
|
- const ImRect window_rect = window->Rect();
|
|
|
+ const ImRect host_rect = window->Rect();
|
|
|
const float border_size = window->WindowBorderSize;
|
|
|
ImRect bb = horizontal
|
|
|
- ? ImRect(window->Pos.x + border_size, window_rect.Max.y - style.ScrollbarSize, window_rect.Max.x - other_scrollbar_size_w - border_size, window_rect.Max.y - border_size)
|
|
|
- : ImRect(window_rect.Max.x - style.ScrollbarSize, window->Pos.y + border_size, window_rect.Max.x - border_size, window_rect.Max.y - other_scrollbar_size_w - border_size);
|
|
|
+ ? ImRect(host_rect.Min.x + border_size, host_rect.Max.y - style.ScrollbarSize, host_rect.Max.x - other_scrollbar_size_w - border_size, host_rect.Max.y - border_size)
|
|
|
+ : ImRect(host_rect.Max.x - style.ScrollbarSize, host_rect.Min.y + border_size, host_rect.Max.x - border_size, host_rect.Max.y - other_scrollbar_size_w - border_size);
|
|
|
+ bb.Min.x = ImMax(host_rect.Min.x, bb.Min.x); // Handle case where the host rectangle is smaller than the scrollbar
|
|
|
+ bb.Min.y = ImMax(host_rect.Min.y, bb.Min.y);
|
|
|
if (!horizontal)
|
|
|
bb.Min.y += window->TitleBarHeight() + ((window->Flags & ImGuiWindowFlags_MenuBar) ? window->MenuBarHeight() : 0.0f); // FIXME: InnerRect?
|
|
|
|
|
|
+ const float bb_width = bb.GetWidth();
|
|
|
const float bb_height = bb.GetHeight();
|
|
|
- if (bb.GetWidth() <= 0.0f || bb_height <= 0.0f)
|
|
|
+ if (bb_width <= 0.0f || bb_height <= 0.0f)
|
|
|
return;
|
|
|
|
|
|
// When we are too small, start hiding and disabling the grab (this reduce visual noise on very small window and facilitate using the resize grab)
|
|
|
@@ -816,7 +819,7 @@ void ImGui::Scrollbar(ImGuiAxis axis)
|
|
|
else
|
|
|
window_rounding_corners = (((window->Flags & ImGuiWindowFlags_NoTitleBar) && !(window->Flags & ImGuiWindowFlags_MenuBar)) ? ImDrawCornerFlags_TopRight : 0) | (other_scrollbar ? 0 : ImDrawCornerFlags_BotRight);
|
|
|
window->DrawList->AddRectFilled(bb.Min, bb.Max, GetColorU32(ImGuiCol_ScrollbarBg), window->WindowRounding, window_rounding_corners);
|
|
|
- bb.Expand(ImVec2(-ImClamp((float)(int)((bb.Max.x - bb.Min.x - 2.0f) * 0.5f), 0.0f, 3.0f), -ImClamp((float)(int)((bb.Max.y - bb.Min.y - 2.0f) * 0.5f), 0.0f, 3.0f)));
|
|
|
+ bb.Expand(ImVec2(-ImClamp((float)(int)((bb_width - 2.0f) * 0.5f), 0.0f, 3.0f), -ImClamp((float)(int)((bb_height - 2.0f) * 0.5f), 0.0f, 3.0f)));
|
|
|
|
|
|
// V denote the main, longer axis of the scrollbar (= height for a vertical scrollbar)
|
|
|
float scrollbar_size_v = horizontal ? bb.GetWidth() : bb.GetHeight();
|
|
|
@@ -887,9 +890,9 @@ void ImGui::Scrollbar(ImGuiAxis axis)
|
|
|
const ImU32 grab_col = GetColorU32(held ? ImGuiCol_ScrollbarGrabActive : hovered ? ImGuiCol_ScrollbarGrabHovered : ImGuiCol_ScrollbarGrab, alpha);
|
|
|
ImRect grab_rect;
|
|
|
if (horizontal)
|
|
|
- grab_rect = ImRect(ImLerp(bb.Min.x, bb.Max.x, grab_v_norm), bb.Min.y, ImMin(ImLerp(bb.Min.x, bb.Max.x, grab_v_norm) + grab_h_pixels, window_rect.Max.x), bb.Max.y);
|
|
|
+ grab_rect = ImRect(ImLerp(bb.Min.x, bb.Max.x, grab_v_norm), bb.Min.y, ImMin(ImLerp(bb.Min.x, bb.Max.x, grab_v_norm) + grab_h_pixels, host_rect.Max.x), bb.Max.y);
|
|
|
else
|
|
|
- grab_rect = ImRect(bb.Min.x, ImLerp(bb.Min.y, bb.Max.y, grab_v_norm), bb.Max.x, ImMin(ImLerp(bb.Min.y, bb.Max.y, grab_v_norm) + grab_h_pixels, window_rect.Max.y));
|
|
|
+ grab_rect = ImRect(bb.Min.x, ImLerp(bb.Min.y, bb.Max.y, grab_v_norm), bb.Max.x, ImMin(ImLerp(bb.Min.y, bb.Max.y, grab_v_norm) + grab_h_pixels, host_rect.Max.y));
|
|
|
window->DrawList->AddRectFilled(grab_rect.Min, grab_rect.Max, grab_col, style.ScrollbarRounding);
|
|
|
}
|
|
|
|
|
|
@@ -1086,7 +1089,7 @@ void ImGui::ProgressBar(float fraction, const ImVec2& size_arg, const char* over
|
|
|
const ImGuiStyle& style = g.Style;
|
|
|
|
|
|
ImVec2 pos = window->DC.CursorPos;
|
|
|
- ImVec2 size = CalcItemSize(size_arg, CalcItemWidth(), g.FontSize + style.FramePadding.y*2.0f);
|
|
|
+ ImVec2 size = CalcItemSize(size_arg, GetNextItemWidth(), g.FontSize + style.FramePadding.y*2.0f);
|
|
|
ImRect bb(pos, pos + size);
|
|
|
ItemSize(size, style.FramePadding.y);
|
|
|
if (!ItemAdd(bb, 0))
|
|
|
@@ -1350,7 +1353,8 @@ bool ImGui::BeginCombo(const char* label, const char* preview_value, ImGuiComboF
|
|
|
|
|
|
const float arrow_size = (flags & ImGuiComboFlags_NoArrowButton) ? 0.0f : GetFrameHeight();
|
|
|
const ImVec2 label_size = CalcTextSize(label, NULL, true);
|
|
|
- const float w = (flags & ImGuiComboFlags_NoPreview) ? arrow_size : CalcItemWidth();
|
|
|
+ const float expected_w = GetNextItemWidth();
|
|
|
+ const float w = (flags & ImGuiComboFlags_NoPreview) ? arrow_size : expected_w;
|
|
|
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));
|
|
|
ItemSize(total_bb, style.FramePadding.y);
|
|
|
@@ -1361,19 +1365,19 @@ bool ImGui::BeginCombo(const char* label, const char* preview_value, ImGuiComboF
|
|
|
bool pressed = ButtonBehavior(frame_bb, id, &hovered, &held);
|
|
|
bool popup_open = IsPopupOpen(id);
|
|
|
|
|
|
- const ImRect value_bb(frame_bb.Min, frame_bb.Max - ImVec2(arrow_size, 0.0f));
|
|
|
const ImU32 frame_col = GetColorU32(hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg);
|
|
|
+ const float value_x2 = ImMax(frame_bb.Min.x, frame_bb.Max.x - arrow_size);
|
|
|
RenderNavHighlight(frame_bb, id);
|
|
|
if (!(flags & ImGuiComboFlags_NoPreview))
|
|
|
- window->DrawList->AddRectFilled(frame_bb.Min, ImVec2(frame_bb.Max.x - arrow_size, frame_bb.Max.y), frame_col, style.FrameRounding, ImDrawCornerFlags_Left);
|
|
|
+ window->DrawList->AddRectFilled(frame_bb.Min, ImVec2(value_x2, frame_bb.Max.y), frame_col, style.FrameRounding, ImDrawCornerFlags_Left);
|
|
|
if (!(flags & ImGuiComboFlags_NoArrowButton))
|
|
|
{
|
|
|
- window->DrawList->AddRectFilled(ImVec2(frame_bb.Max.x - arrow_size, frame_bb.Min.y), frame_bb.Max, GetColorU32((popup_open || hovered) ? ImGuiCol_ButtonHovered : ImGuiCol_Button), style.FrameRounding, (w <= arrow_size) ? ImDrawCornerFlags_All : ImDrawCornerFlags_Right);
|
|
|
- RenderArrow(ImVec2(frame_bb.Max.x - arrow_size + style.FramePadding.y, frame_bb.Min.y + style.FramePadding.y), ImGuiDir_Down);
|
|
|
+ window->DrawList->AddRectFilled(ImVec2(value_x2, frame_bb.Min.y), frame_bb.Max, GetColorU32((popup_open || hovered) ? ImGuiCol_ButtonHovered : ImGuiCol_Button), style.FrameRounding, (w <= arrow_size) ? ImDrawCornerFlags_All : ImDrawCornerFlags_Right);
|
|
|
+ RenderArrow(ImVec2(value_x2 + style.FramePadding.y, frame_bb.Min.y + style.FramePadding.y), ImGuiDir_Down);
|
|
|
}
|
|
|
RenderFrameBorder(frame_bb.Min, frame_bb.Max, style.FrameRounding);
|
|
|
if (preview_value != NULL && !(flags & ImGuiComboFlags_NoPreview))
|
|
|
- RenderTextClipped(frame_bb.Min + style.FramePadding, value_bb.Max, preview_value, NULL, NULL, ImVec2(0.0f,0.0f));
|
|
|
+ RenderTextClipped(frame_bb.Min + style.FramePadding, ImVec2(value_x2, frame_bb.Max.y), preview_value, NULL, NULL, ImVec2(0.0f,0.0f));
|
|
|
if (label_size.x > 0)
|
|
|
RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y), label);
|
|
|
|
|
|
@@ -1975,7 +1979,7 @@ bool ImGui::DragScalar(const char* label, ImGuiDataType data_type, void* v, floa
|
|
|
ImGuiContext& g = *GImGui;
|
|
|
const ImGuiStyle& style = g.Style;
|
|
|
const ImGuiID id = window->GetID(label);
|
|
|
- const float w = CalcItemWidth();
|
|
|
+ const float w = GetNextItemWidth();
|
|
|
|
|
|
const ImVec2 label_size = CalcTextSize(label, NULL, true);
|
|
|
const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w, label_size.y + style.FramePadding.y*2.0f));
|
|
|
@@ -2049,7 +2053,7 @@ bool ImGui::DragScalarN(const char* label, ImGuiDataType data_type, void* v, int
|
|
|
bool value_changed = false;
|
|
|
BeginGroup();
|
|
|
PushID(label);
|
|
|
- PushMultiItemsWidths(components);
|
|
|
+ PushMultiItemsWidths(components, GetNextItemWidth());
|
|
|
size_t type_size = GDataTypeInfo[data_type].Size;
|
|
|
for (int i = 0; i < components; i++)
|
|
|
{
|
|
|
@@ -2096,7 +2100,7 @@ bool ImGui::DragFloatRange2(const char* label, float* v_current_min, float* v_cu
|
|
|
ImGuiContext& g = *GImGui;
|
|
|
PushID(label);
|
|
|
BeginGroup();
|
|
|
- PushMultiItemsWidths(2);
|
|
|
+ PushMultiItemsWidths(2, GetNextItemWidth());
|
|
|
|
|
|
bool value_changed = DragFloat("##min", v_current_min, v_speed, (v_min >= v_max) ? -FLT_MAX : v_min, (v_min >= v_max) ? *v_current_max : ImMin(v_max, *v_current_max), format, power);
|
|
|
PopItemWidth();
|
|
|
@@ -2141,7 +2145,7 @@ bool ImGui::DragIntRange2(const char* label, int* v_current_min, int* v_current_
|
|
|
ImGuiContext& g = *GImGui;
|
|
|
PushID(label);
|
|
|
BeginGroup();
|
|
|
- PushMultiItemsWidths(2);
|
|
|
+ PushMultiItemsWidths(2, GetNextItemWidth());
|
|
|
|
|
|
bool value_changed = DragInt("##min", v_current_min, v_speed, (v_min >= v_max) ? INT_MIN : v_min, (v_min >= v_max) ? *v_current_max : ImMin(v_max, *v_current_max), format);
|
|
|
PopItemWidth();
|
|
|
@@ -2238,16 +2242,16 @@ bool ImGui::SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_typ
|
|
|
grab_sz = ImMax((float)(slider_sz / (v_range + 1)), style.GrabMinSize); // For integer sliders: if possible have the grab size represent 1 unit
|
|
|
grab_sz = ImMin(grab_sz, slider_sz);
|
|
|
const float slider_usable_sz = slider_sz - grab_sz;
|
|
|
- const float slider_usable_pos_min = bb.Min[axis] + grab_padding + grab_sz*0.5f;
|
|
|
- const float slider_usable_pos_max = bb.Max[axis] - grab_padding - grab_sz*0.5f;
|
|
|
+ const float slider_usable_pos_min = bb.Min[axis] + grab_padding + grab_sz * 0.5f;
|
|
|
+ const float slider_usable_pos_max = bb.Max[axis] - grab_padding - grab_sz * 0.5f;
|
|
|
|
|
|
// For power curve sliders that cross over sign boundary we want the curve to be symmetric around 0.0f
|
|
|
float linear_zero_pos; // 0.0->1.0f
|
|
|
if (is_power && v_min * v_max < 0.0f)
|
|
|
{
|
|
|
// Different sign
|
|
|
- const FLOATTYPE linear_dist_min_to_0 = ImPow(v_min >= 0 ? (FLOATTYPE)v_min : -(FLOATTYPE)v_min, (FLOATTYPE)1.0f/power);
|
|
|
- const FLOATTYPE linear_dist_max_to_0 = ImPow(v_max >= 0 ? (FLOATTYPE)v_max : -(FLOATTYPE)v_max, (FLOATTYPE)1.0f/power);
|
|
|
+ const FLOATTYPE linear_dist_min_to_0 = ImPow(v_min >= 0 ? (FLOATTYPE)v_min : -(FLOATTYPE)v_min, (FLOATTYPE)1.0f / power);
|
|
|
+ const FLOATTYPE linear_dist_max_to_0 = ImPow(v_max >= 0 ? (FLOATTYPE)v_max : -(FLOATTYPE)v_max, (FLOATTYPE)1.0f / power);
|
|
|
linear_zero_pos = (float)(linear_dist_min_to_0 / (linear_dist_min_to_0 + linear_dist_max_to_0));
|
|
|
}
|
|
|
else
|
|
|
@@ -2370,15 +2374,22 @@ bool ImGui::SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_typ
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // Output grab position so it can be displayed by the caller
|
|
|
- float grab_t = SliderCalcRatioFromValueT<TYPE,FLOATTYPE>(data_type, *v, v_min, v_max, power, linear_zero_pos);
|
|
|
- if (axis == ImGuiAxis_Y)
|
|
|
- grab_t = 1.0f - grab_t;
|
|
|
- const float grab_pos = ImLerp(slider_usable_pos_min, slider_usable_pos_max, grab_t);
|
|
|
- if (axis == ImGuiAxis_X)
|
|
|
- *out_grab_bb = ImRect(grab_pos - grab_sz*0.5f, bb.Min.y + grab_padding, grab_pos + grab_sz*0.5f, bb.Max.y - grab_padding);
|
|
|
+ if (slider_sz < 1.0f)
|
|
|
+ {
|
|
|
+ *out_grab_bb = ImRect(bb.Min, bb.Min);
|
|
|
+ }
|
|
|
else
|
|
|
- *out_grab_bb = ImRect(bb.Min.x + grab_padding, grab_pos - grab_sz*0.5f, bb.Max.x - grab_padding, grab_pos + grab_sz*0.5f);
|
|
|
+ {
|
|
|
+ // Output grab position so it can be displayed by the caller
|
|
|
+ float grab_t = SliderCalcRatioFromValueT<TYPE, FLOATTYPE>(data_type, *v, v_min, v_max, power, linear_zero_pos);
|
|
|
+ if (axis == ImGuiAxis_Y)
|
|
|
+ grab_t = 1.0f - grab_t;
|
|
|
+ const float grab_pos = ImLerp(slider_usable_pos_min, slider_usable_pos_max, grab_t);
|
|
|
+ if (axis == ImGuiAxis_X)
|
|
|
+ *out_grab_bb = ImRect(grab_pos - grab_sz * 0.5f, bb.Min.y + grab_padding, grab_pos + grab_sz * 0.5f, bb.Max.y - grab_padding);
|
|
|
+ else
|
|
|
+ *out_grab_bb = ImRect(bb.Min.x + grab_padding, grab_pos - grab_sz * 0.5f, bb.Max.x - grab_padding, grab_pos + grab_sz * 0.5f);
|
|
|
+ }
|
|
|
|
|
|
return value_changed;
|
|
|
}
|
|
|
@@ -2427,7 +2438,7 @@ bool ImGui::SliderScalar(const char* label, ImGuiDataType data_type, void* v, co
|
|
|
ImGuiContext& g = *GImGui;
|
|
|
const ImGuiStyle& style = g.Style;
|
|
|
const ImGuiID id = window->GetID(label);
|
|
|
- const float w = CalcItemWidth();
|
|
|
+ const float w = GetNextItemWidth();
|
|
|
|
|
|
const ImVec2 label_size = CalcTextSize(label, NULL, true);
|
|
|
const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w, label_size.y + style.FramePadding.y*2.0f));
|
|
|
@@ -2480,7 +2491,8 @@ bool ImGui::SliderScalar(const char* label, ImGuiDataType data_type, void* v, co
|
|
|
MarkItemEdited(id);
|
|
|
|
|
|
// Render grab
|
|
|
- window->DrawList->AddRectFilled(grab_bb.Min, grab_bb.Max, GetColorU32(g.ActiveId == id ? ImGuiCol_SliderGrabActive : ImGuiCol_SliderGrab), style.GrabRounding);
|
|
|
+ if (grab_bb.Max.x > grab_bb.Min.x)
|
|
|
+ window->DrawList->AddRectFilled(grab_bb.Min, grab_bb.Max, GetColorU32(g.ActiveId == id ? ImGuiCol_SliderGrabActive : ImGuiCol_SliderGrab), style.GrabRounding);
|
|
|
|
|
|
// Display value using user-provided display format so user can add prefix/suffix/decorations to the value.
|
|
|
char value_buf[64];
|
|
|
@@ -2505,7 +2517,7 @@ bool ImGui::SliderScalarN(const char* label, ImGuiDataType data_type, void* v, i
|
|
|
bool value_changed = false;
|
|
|
BeginGroup();
|
|
|
PushID(label);
|
|
|
- PushMultiItemsWidths(components);
|
|
|
+ PushMultiItemsWidths(components, GetNextItemWidth());
|
|
|
size_t type_size = GDataTypeInfo[data_type].Size;
|
|
|
for (int i = 0; i < components; i++)
|
|
|
{
|
|
|
@@ -2620,7 +2632,8 @@ bool ImGui::VSliderScalar(const char* label, const ImVec2& size, ImGuiDataType d
|
|
|
MarkItemEdited(id);
|
|
|
|
|
|
// Render grab
|
|
|
- window->DrawList->AddRectFilled(grab_bb.Min, grab_bb.Max, GetColorU32(g.ActiveId == id ? ImGuiCol_SliderGrabActive : ImGuiCol_SliderGrab), style.GrabRounding);
|
|
|
+ if (grab_bb.Max.y > grab_bb.Min.y)
|
|
|
+ window->DrawList->AddRectFilled(grab_bb.Min, grab_bb.Max, GetColorU32(g.ActiveId == id ? ImGuiCol_SliderGrabActive : ImGuiCol_SliderGrab), style.GrabRounding);
|
|
|
|
|
|
// Display value using user-provided display format so user can add prefix/suffix/decorations to the value.
|
|
|
// For the vertical slider we allow centered text to overlap the frame padding
|
|
|
@@ -2793,10 +2806,9 @@ bool ImGui::InputScalar(const char* label, ImGuiDataType data_type, void* data_p
|
|
|
|
|
|
BeginGroup(); // The only purpose of the group here is to allow the caller to query item data e.g. IsItemActive()
|
|
|
PushID(label);
|
|
|
- PushItemWidth(ImMax(1.0f, CalcItemWidth() - (button_size + style.ItemInnerSpacing.x) * 2));
|
|
|
+ SetNextItemWidth(ImMax(1.0f, GetNextItemWidth() - (button_size + style.ItemInnerSpacing.x) * 2));
|
|
|
if (InputText("", buf, IM_ARRAYSIZE(buf), flags)) // PushId(label) + "" gives us the expected ID from outside point of view
|
|
|
value_changed = DataTypeApplyOpFromText(buf, g.InputTextState.InitialTextA.Data, data_type, data_ptr, format);
|
|
|
- PopItemWidth();
|
|
|
|
|
|
// Step buttons
|
|
|
const ImVec2 backup_frame_padding = style.FramePadding;
|
|
|
@@ -2842,7 +2854,7 @@ bool ImGui::InputScalarN(const char* label, ImGuiDataType data_type, void* v, in
|
|
|
bool value_changed = false;
|
|
|
BeginGroup();
|
|
|
PushID(label);
|
|
|
- PushMultiItemsWidths(components);
|
|
|
+ PushMultiItemsWidths(components, GetNextItemWidth());
|
|
|
size_t type_size = GDataTypeInfo[data_type].Size;
|
|
|
for (int i = 0; i < components; i++)
|
|
|
{
|
|
|
@@ -3292,7 +3304,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
|
|
|
BeginGroup();
|
|
|
const ImGuiID id = window->GetID(label);
|
|
|
const ImVec2 label_size = CalcTextSize(label, NULL, true);
|
|
|
- ImVec2 size = CalcItemSize(size_arg, CalcItemWidth(), (is_multiline ? GetTextLineHeight() * 8.0f : label_size.y) + style.FramePadding.y*2.0f); // Arbitrary default of 8 lines high for multi-line
|
|
|
+ ImVec2 size = CalcItemSize(size_arg, GetNextItemWidth(), (is_multiline ? GetTextLineHeight() * 8.0f : label_size.y) + style.FramePadding.y*2.0f); // Arbitrary default of 8 lines high for multi-line
|
|
|
const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + size);
|
|
|
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));
|
|
|
|
|
|
@@ -4050,7 +4062,7 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag
|
|
|
const ImGuiStyle& style = g.Style;
|
|
|
const float square_sz = GetFrameHeight();
|
|
|
const float w_extra = (flags & ImGuiColorEditFlags_NoSmallPreview) ? 0.0f : (square_sz + style.ItemInnerSpacing.x);
|
|
|
- const float w_items_all = CalcItemWidth() - w_extra;
|
|
|
+ const float w_items_all = GetNextItemWidth() - w_extra;
|
|
|
const char* label_display_end = FindRenderedTextEnd(label);
|
|
|
|
|
|
BeginGroup();
|
|
|
@@ -4115,13 +4127,11 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag
|
|
|
};
|
|
|
const int fmt_idx = hide_prefix ? 0 : (flags & ImGuiColorEditFlags_DisplayHSV) ? 2 : 1;
|
|
|
|
|
|
- PushItemWidth(w_item_one);
|
|
|
for (int n = 0; n < components; n++)
|
|
|
{
|
|
|
if (n > 0)
|
|
|
SameLine(0, style.ItemInnerSpacing.x);
|
|
|
- if (n + 1 == components)
|
|
|
- PushItemWidth(w_item_last);
|
|
|
+ SetNextItemWidth((n + 1 < components) ? w_item_one : w_item_last);
|
|
|
if (flags & ImGuiColorEditFlags_Float)
|
|
|
{
|
|
|
value_changed |= DragFloat(ids[n], &f[n], 1.0f/255.0f, 0.0f, hdr ? 0.0f : 1.0f, fmt_table_float[fmt_idx][n]);
|
|
|
@@ -4134,8 +4144,6 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag
|
|
|
if (!(flags & ImGuiColorEditFlags_NoOptions))
|
|
|
OpenPopupOnItemClick("context");
|
|
|
}
|
|
|
- PopItemWidth();
|
|
|
- PopItemWidth();
|
|
|
}
|
|
|
else if ((flags & ImGuiColorEditFlags_DisplayHex) != 0 && (flags & ImGuiColorEditFlags_NoInputs) == 0)
|
|
|
{
|
|
|
@@ -4145,7 +4153,7 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag
|
|
|
ImFormatString(buf, IM_ARRAYSIZE(buf), "#%02X%02X%02X%02X", ImClamp(i[0],0,255), ImClamp(i[1],0,255), ImClamp(i[2],0,255), ImClamp(i[3],0,255));
|
|
|
else
|
|
|
ImFormatString(buf, IM_ARRAYSIZE(buf), "#%02X%02X%02X", ImClamp(i[0],0,255), ImClamp(i[1],0,255), ImClamp(i[2],0,255));
|
|
|
- PushItemWidth(w_items_all);
|
|
|
+ SetNextItemWidth(w_items_all);
|
|
|
if (InputText("##Text", buf, IM_ARRAYSIZE(buf), ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsUppercase))
|
|
|
{
|
|
|
value_changed = true;
|
|
|
@@ -4160,7 +4168,6 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag
|
|
|
}
|
|
|
if (!(flags & ImGuiColorEditFlags_NoOptions))
|
|
|
OpenPopupOnItemClick("context");
|
|
|
- PopItemWidth();
|
|
|
}
|
|
|
|
|
|
ImGuiWindow* picker_active_window = NULL;
|
|
|
@@ -4193,9 +4200,8 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag
|
|
|
}
|
|
|
ImGuiColorEditFlags picker_flags_to_forward = ImGuiColorEditFlags__DataTypeMask | ImGuiColorEditFlags__PickerMask | ImGuiColorEditFlags__InputMask | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_AlphaBar;
|
|
|
ImGuiColorEditFlags picker_flags = (flags_untouched & picker_flags_to_forward) | ImGuiColorEditFlags_DisplayHSV | ImGuiColorEditFlags_NoLabel | ImGuiColorEditFlags_AlphaPreviewHalf;
|
|
|
- PushItemWidth(square_sz * 12.0f); // Use 256 + bar sizes?
|
|
|
+ SetNextItemWidth(square_sz * 12.0f); // Use 256 + bar sizes?
|
|
|
value_changed |= ColorPicker4("##picker", col, picker_flags, &g.ColorPickerRef.x);
|
|
|
- PopItemWidth();
|
|
|
EndPopup();
|
|
|
}
|
|
|
}
|
|
|
@@ -4363,7 +4369,7 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl
|
|
|
ImVec2 picker_pos = window->DC.CursorPos;
|
|
|
float square_sz = GetFrameHeight();
|
|
|
float bars_width = square_sz; // Arbitrary smallish width of Hue/Alpha picking bars
|
|
|
- float sv_picker_size = ImMax(bars_width * 1, CalcItemWidth() - (alpha_bar ? 2 : 1) * (bars_width + style.ItemInnerSpacing.x)); // Saturation/Value picking box
|
|
|
+ float sv_picker_size = ImMax(bars_width * 1, GetNextItemWidth() - (alpha_bar ? 2 : 1) * (bars_width + style.ItemInnerSpacing.x)); // Saturation/Value picking box
|
|
|
float bar0_pos_x = picker_pos.x + sv_picker_size + style.ItemInnerSpacing.x;
|
|
|
float bar1_pos_x = bar0_pos_x + bars_width + style.ItemInnerSpacing.x;
|
|
|
float bars_triangles_half_sz = (float)(int)(bars_width * 0.20f);
|
|
|
@@ -5060,7 +5066,7 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* l
|
|
|
// We vertically grow up to current line height up the typical widget height.
|
|
|
const float text_base_offset_y = ImMax(padding.y, window->DC.CurrentLineTextBaseOffset); // Latch before ItemSize changes it
|
|
|
const float frame_height = ImMax(ImMin(window->DC.CurrentLineSize.y, g.FontSize + style.FramePadding.y*2), label_size.y + padding.y*2);
|
|
|
- ImRect frame_bb = ImRect(window->DC.CursorPos, ImVec2(window->Pos.x + GetContentRegionMax().x, window->DC.CursorPos.y + frame_height));
|
|
|
+ ImRect frame_bb = ImRect(window->DC.CursorPos, ImVec2(GetContentRegionMaxScreen().x, window->DC.CursorPos.y + frame_height));
|
|
|
if (display_frame)
|
|
|
{
|
|
|
// Framed header expand a little outside the default padding
|
|
|
@@ -5443,6 +5449,9 @@ bool ImGui::Selectable(const char* label, bool* p_selected, ImGuiSelectableFlags
|
|
|
// - ListBoxHeader()
|
|
|
// - ListBoxFooter()
|
|
|
//-------------------------------------------------------------------------
|
|
|
+// FIXME: This is an old API. We should redesign some of it, rename ListBoxHeader->BeginListBox, ListBoxFooter->EndListBox
|
|
|
+// and promote using them over existing ListBox() functions, similarly to change with combo boxes.
|
|
|
+//-------------------------------------------------------------------------
|
|
|
|
|
|
// FIXME: In principle this function should be called BeginListBox(). We should rename it after re-evaluating if we want to keep the same signature.
|
|
|
// Helper to calculate the size of a listbox and display a label on the right.
|
|
|
@@ -5458,7 +5467,7 @@ bool ImGui::ListBoxHeader(const char* label, const ImVec2& size_arg)
|
|
|
const ImVec2 label_size = CalcTextSize(label, NULL, true);
|
|
|
|
|
|
// Size default to hold ~7 items. Fractional number of items helps seeing that we can scroll down/up without looking at scrollbar.
|
|
|
- ImVec2 size = CalcItemSize(size_arg, CalcItemWidth(), GetTextLineHeightWithSpacing() * 7.4f + style.ItemSpacing.y);
|
|
|
+ ImVec2 size = CalcItemSize(size_arg, GetNextItemWidth(), GetTextLineHeightWithSpacing() * 7.4f + style.ItemSpacing.y);
|
|
|
ImVec2 frame_size = ImVec2(size.x, ImMax(size.y, label_size.y));
|
|
|
ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + frame_size);
|
|
|
ImRect bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f));
|
|
|
@@ -5575,7 +5584,7 @@ void ImGui::PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_ge
|
|
|
|
|
|
const ImVec2 label_size = CalcTextSize(label, NULL, true);
|
|
|
if (frame_size.x == 0.0f)
|
|
|
- frame_size.x = CalcItemWidth();
|
|
|
+ frame_size.x = GetNextItemWidth();
|
|
|
if (frame_size.y == 0.0f)
|
|
|
frame_size.y = label_size.y + (style.FramePadding.y * 2);
|
|
|
|