mirror of
https://github.com/ocornut/imgui.git
synced 2024-11-24 07:40:22 +01:00
Sliders, Drags: Fixed using hexadecimal display format strings (pretty much never worked). (#5165, #3133)
Ditched unnecessary code. When transitioning from float in3e8087458
we added an unnecessary path there, which evolved inc5fb92955
.
This commit is contained in:
parent
f5c5926fb9
commit
508c9aaf60
@ -53,6 +53,7 @@ Other Changes:
|
|||||||
or interacting with a game/3D view).
|
or interacting with a game/3D view).
|
||||||
- Clipper: Fixed a regression in 1.86 when not calling clipper.End() and late destructing the
|
- Clipper: Fixed a regression in 1.86 when not calling clipper.End() and late destructing the
|
||||||
clipper instance. High-level languages (Lua,Rust etc.) would typically be affected. (#4822)
|
clipper instance. High-level languages (Lua,Rust etc.) would typically be affected. (#4822)
|
||||||
|
- Sliders, Drags: Fixed using hexadecimal display format strings (it never worked). (#5165, #3133)
|
||||||
- IsItemHovered(): added ImGuiHoveredFlags_NoNavOverride to disable the behavior where the
|
- IsItemHovered(): added ImGuiHoveredFlags_NoNavOverride to disable the behavior where the
|
||||||
return value is overriden by focus when gamepad/keyboard navigation is active.
|
return value is overriden by focus when gamepad/keyboard navigation is active.
|
||||||
- InputText: Fixed pressing Tab emitting two tabs characters because of dual Keys/Chars events being
|
- InputText: Fixed pressing Tab emitting two tabs characters because of dual Keys/Chars events being
|
||||||
|
2
imgui.h
2
imgui.h
@ -65,7 +65,7 @@ Index of this file:
|
|||||||
// Version
|
// Version
|
||||||
// (Integer encoded as XYYZZ for use in #if preprocessor conditionals. Work in progress versions typically starts at XYY99 then bounce up to XYY00, XYY01 etc. when release tagging happens)
|
// (Integer encoded as XYYZZ for use in #if preprocessor conditionals. Work in progress versions typically starts at XYY99 then bounce up to XYY00, XYY01 etc. when release tagging happens)
|
||||||
#define IMGUI_VERSION "1.88 WIP"
|
#define IMGUI_VERSION "1.88 WIP"
|
||||||
#define IMGUI_VERSION_NUM 18713
|
#define IMGUI_VERSION_NUM 18714
|
||||||
#define IMGUI_CHECKVERSION() ImGui::DebugCheckVersionAndDataLayout(IMGUI_VERSION, sizeof(ImGuiIO), sizeof(ImGuiStyle), sizeof(ImVec2), sizeof(ImVec4), sizeof(ImDrawVert), sizeof(ImDrawIdx))
|
#define IMGUI_CHECKVERSION() ImGui::DebugCheckVersionAndDataLayout(IMGUI_VERSION, sizeof(ImGuiIO), sizeof(ImGuiStyle), sizeof(ImVec2), sizeof(ImVec4), sizeof(ImDrawVert), sizeof(ImDrawIdx))
|
||||||
#define IMGUI_HAS_TABLE
|
#define IMGUI_HAS_TABLE
|
||||||
|
|
||||||
|
@ -1921,6 +1921,7 @@ static void ShowDemoWindowWidgets()
|
|||||||
ImGui::DragFloat("DragFloat (-inf -> 1)", &drag_f, 0.005f, -FLT_MAX, 1.0f, "%.3f", flags);
|
ImGui::DragFloat("DragFloat (-inf -> 1)", &drag_f, 0.005f, -FLT_MAX, 1.0f, "%.3f", flags);
|
||||||
ImGui::DragFloat("DragFloat (-inf -> +inf)", &drag_f, 0.005f, -FLT_MAX, +FLT_MAX, "%.3f", flags);
|
ImGui::DragFloat("DragFloat (-inf -> +inf)", &drag_f, 0.005f, -FLT_MAX, +FLT_MAX, "%.3f", flags);
|
||||||
ImGui::DragInt("DragInt (0 -> 100)", &drag_i, 0.5f, 0, 100, "%d", flags);
|
ImGui::DragInt("DragInt (0 -> 100)", &drag_i, 0.5f, 0, 100, "%d", flags);
|
||||||
|
ImGui::DragInt("DragInt (gex)", &drag_i, 0.5f, 0, 100, "0x%04X", flags);
|
||||||
|
|
||||||
// Sliders
|
// Sliders
|
||||||
static float slider_f = 0.5f;
|
static float slider_f = 0.5f;
|
||||||
@ -1928,6 +1929,7 @@ static void ShowDemoWindowWidgets()
|
|||||||
ImGui::Text("Underlying float value: %f", slider_f);
|
ImGui::Text("Underlying float value: %f", slider_f);
|
||||||
ImGui::SliderFloat("SliderFloat (0 -> 1)", &slider_f, 0.0f, 1.0f, "%.3f", flags);
|
ImGui::SliderFloat("SliderFloat (0 -> 1)", &slider_f, 0.0f, 1.0f, "%.3f", flags);
|
||||||
ImGui::SliderInt("SliderInt (0 -> 100)", &slider_i, 0, 100, "%d", flags);
|
ImGui::SliderInt("SliderInt (0 -> 100)", &slider_i, 0, 100, "%d", flags);
|
||||||
|
ImGui::SliderInt("SliderInt (hex)", &slider_i, 0, 100, "0x%04X", flags);
|
||||||
|
|
||||||
ImGui::TreePop();
|
ImGui::TreePop();
|
||||||
}
|
}
|
||||||
|
@ -2823,7 +2823,7 @@ namespace ImGui
|
|||||||
template<typename T, typename SIGNED_T, typename FLOAT_T> IMGUI_API T ScaleValueFromRatioT(ImGuiDataType data_type, float t, T v_min, T v_max, bool is_logarithmic, float logarithmic_zero_epsilon, float zero_deadzone_size);
|
template<typename T, typename SIGNED_T, typename FLOAT_T> IMGUI_API T ScaleValueFromRatioT(ImGuiDataType data_type, float t, T v_min, T v_max, bool is_logarithmic, float logarithmic_zero_epsilon, float zero_deadzone_size);
|
||||||
template<typename T, typename SIGNED_T, typename FLOAT_T> IMGUI_API bool DragBehaviorT(ImGuiDataType data_type, T* v, float v_speed, T v_min, T v_max, const char* format, ImGuiSliderFlags flags);
|
template<typename T, typename SIGNED_T, typename FLOAT_T> IMGUI_API bool DragBehaviorT(ImGuiDataType data_type, T* v, float v_speed, T v_min, T v_max, const char* format, ImGuiSliderFlags flags);
|
||||||
template<typename T, typename SIGNED_T, typename FLOAT_T> IMGUI_API bool SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, T* v, T v_min, T v_max, const char* format, ImGuiSliderFlags flags, ImRect* out_grab_bb);
|
template<typename T, typename SIGNED_T, typename FLOAT_T> IMGUI_API bool SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, T* v, T v_min, T v_max, const char* format, ImGuiSliderFlags flags, ImRect* out_grab_bb);
|
||||||
template<typename T, typename SIGNED_T> IMGUI_API T RoundScalarWithFormatT(const char* format, ImGuiDataType data_type, T v);
|
template<typename T> IMGUI_API T RoundScalarWithFormatT(const char* format, ImGuiDataType data_type, T v);
|
||||||
template<typename T> IMGUI_API bool CheckboxFlagsT(const char* label, T* flags, T flags_value);
|
template<typename T> IMGUI_API bool CheckboxFlagsT(const char* label, T* flags, T flags_value);
|
||||||
|
|
||||||
// Data type helpers
|
// Data type helpers
|
||||||
|
@ -2104,19 +2104,6 @@ static float GetMinimumStepAtDecimalPrecision(int decimal_precision)
|
|||||||
return (decimal_precision < IM_ARRAYSIZE(min_steps)) ? min_steps[decimal_precision] : ImPow(10.0f, (float)-decimal_precision);
|
return (decimal_precision < IM_ARRAYSIZE(min_steps)) ? min_steps[decimal_precision] : ImPow(10.0f, (float)-decimal_precision);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename TYPE>
|
|
||||||
static const char* ImAtoi(const char* src, TYPE* output)
|
|
||||||
{
|
|
||||||
int negative = 0;
|
|
||||||
if (*src == '-') { negative = 1; src++; }
|
|
||||||
if (*src == '+') { src++; }
|
|
||||||
TYPE v = 0;
|
|
||||||
while (*src >= '0' && *src <= '9')
|
|
||||||
v = (v * 10) + (*src++ - '0');
|
|
||||||
*output = negative ? -v : v;
|
|
||||||
return src;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sanitize format
|
// Sanitize format
|
||||||
// - Zero terminate so extra characters after format (e.g. "%f123") don't confuse atof/atoi
|
// - Zero terminate so extra characters after format (e.g. "%f123") don't confuse atof/atoi
|
||||||
// - stb_sprintf.h supports several new modifiers which format numbers in a way that also makes them incompatible atof/atoi.
|
// - stb_sprintf.h supports several new modifiers which format numbers in a way that also makes them incompatible atof/atoi.
|
||||||
@ -2134,9 +2121,10 @@ static void SanitizeFormatString(const char* fmt, char* fmt_out, size_t fmt_out_
|
|||||||
*fmt_out = 0; // Zero-terminate
|
*fmt_out = 0; // Zero-terminate
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename TYPE, typename SIGNEDTYPE>
|
template<typename TYPE>
|
||||||
TYPE ImGui::RoundScalarWithFormatT(const char* format, ImGuiDataType data_type, TYPE v)
|
TYPE ImGui::RoundScalarWithFormatT(const char* format, ImGuiDataType data_type, TYPE v)
|
||||||
{
|
{
|
||||||
|
IM_ASSERT(data_type == ImGuiDataType_Float || data_type == ImGuiDataType_Double);
|
||||||
const char* fmt_start = ImParseFormatFindStart(format);
|
const char* fmt_start = ImParseFormatFindStart(format);
|
||||||
if (fmt_start[0] != '%' || fmt_start[1] == '%') // Don't apply if the value is not visible in the format string
|
if (fmt_start[0] != '%' || fmt_start[1] == '%') // Don't apply if the value is not visible in the format string
|
||||||
return v;
|
return v;
|
||||||
@ -2152,10 +2140,8 @@ TYPE ImGui::RoundScalarWithFormatT(const char* format, ImGuiDataType data_type,
|
|||||||
const char* p = v_str;
|
const char* p = v_str;
|
||||||
while (*p == ' ')
|
while (*p == ' ')
|
||||||
p++;
|
p++;
|
||||||
if (data_type == ImGuiDataType_Float || data_type == ImGuiDataType_Double)
|
|
||||||
v = (TYPE)ImAtof(p);
|
v = (TYPE)ImAtof(p);
|
||||||
else
|
|
||||||
ImAtoi(p, (SIGNEDTYPE*)&v);
|
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2259,8 +2245,8 @@ bool ImGui::DragBehaviorT(ImGuiDataType data_type, TYPE* v, float v_speed, const
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Round to user desired precision based on format string
|
// Round to user desired precision based on format string
|
||||||
if (!(flags & ImGuiSliderFlags_NoRoundToFormat))
|
if (is_floating_point && !(flags & ImGuiSliderFlags_NoRoundToFormat))
|
||||||
v_cur = RoundScalarWithFormatT<TYPE, SIGNEDTYPE>(format, data_type, v_cur);
|
v_cur = RoundScalarWithFormatT<TYPE>(format, data_type, v_cur);
|
||||||
|
|
||||||
// Preserve remainder after rounding has been applied. This also allow slow tweaking of values.
|
// Preserve remainder after rounding has been applied. This also allow slow tweaking of values.
|
||||||
g.DragCurrentAccumDirty = false;
|
g.DragCurrentAccumDirty = false;
|
||||||
@ -2856,8 +2842,8 @@ bool ImGui::SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_typ
|
|||||||
|
|
||||||
// Calculate what our "new" clicked_t will be, and thus how far we actually moved the slider, and subtract this from the accumulator
|
// Calculate what our "new" clicked_t will be, and thus how far we actually moved the slider, and subtract this from the accumulator
|
||||||
TYPE v_new = ScaleValueFromRatioT<TYPE, SIGNEDTYPE, FLOATTYPE>(data_type, clicked_t, v_min, v_max, is_logarithmic, logarithmic_zero_epsilon, zero_deadzone_halfsize);
|
TYPE v_new = ScaleValueFromRatioT<TYPE, SIGNEDTYPE, FLOATTYPE>(data_type, clicked_t, v_min, v_max, is_logarithmic, logarithmic_zero_epsilon, zero_deadzone_halfsize);
|
||||||
if (!(flags & ImGuiSliderFlags_NoRoundToFormat))
|
if (is_floating_point && !(flags & ImGuiSliderFlags_NoRoundToFormat))
|
||||||
v_new = RoundScalarWithFormatT<TYPE, SIGNEDTYPE>(format, data_type, v_new);
|
v_new = RoundScalarWithFormatT<TYPE>(format, data_type, v_new);
|
||||||
float new_clicked_t = ScaleRatioFromValueT<TYPE, SIGNEDTYPE, FLOATTYPE>(data_type, v_new, v_min, v_max, is_logarithmic, logarithmic_zero_epsilon, zero_deadzone_halfsize);
|
float new_clicked_t = ScaleRatioFromValueT<TYPE, SIGNEDTYPE, FLOATTYPE>(data_type, v_new, v_min, v_max, is_logarithmic, logarithmic_zero_epsilon, zero_deadzone_halfsize);
|
||||||
|
|
||||||
if (delta > 0)
|
if (delta > 0)
|
||||||
@ -2875,8 +2861,8 @@ bool ImGui::SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_typ
|
|||||||
TYPE v_new = ScaleValueFromRatioT<TYPE, SIGNEDTYPE, FLOATTYPE>(data_type, clicked_t, v_min, v_max, is_logarithmic, logarithmic_zero_epsilon, zero_deadzone_halfsize);
|
TYPE v_new = ScaleValueFromRatioT<TYPE, SIGNEDTYPE, FLOATTYPE>(data_type, clicked_t, v_min, v_max, is_logarithmic, logarithmic_zero_epsilon, zero_deadzone_halfsize);
|
||||||
|
|
||||||
// Round to user desired precision based on format string
|
// Round to user desired precision based on format string
|
||||||
if (!(flags & ImGuiSliderFlags_NoRoundToFormat))
|
if (is_floating_point && !(flags & ImGuiSliderFlags_NoRoundToFormat))
|
||||||
v_new = RoundScalarWithFormatT<TYPE, SIGNEDTYPE>(format, data_type, v_new);
|
v_new = RoundScalarWithFormatT<TYPE>(format, data_type, v_new);
|
||||||
|
|
||||||
// Apply result
|
// Apply result
|
||||||
if (*v != v_new)
|
if (*v != v_new)
|
||||||
@ -3282,6 +3268,19 @@ const char* ImParseFormatTrimDecorations(const char* fmt, char* buf, size_t buf_
|
|||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename TYPE>
|
||||||
|
static const char* ImAtoi(const char* src, TYPE* output)
|
||||||
|
{
|
||||||
|
int negative = 0;
|
||||||
|
if (*src == '-') { negative = 1; src++; }
|
||||||
|
if (*src == '+') { src++; }
|
||||||
|
TYPE v = 0;
|
||||||
|
while (*src >= '0' && *src <= '9')
|
||||||
|
v = (v * 10) + (*src++ - '0');
|
||||||
|
*output = negative ? -v : v;
|
||||||
|
return src;
|
||||||
|
}
|
||||||
|
|
||||||
// Parse display precision back from the display format string
|
// Parse display precision back from the display format string
|
||||||
// FIXME: This is still used by some navigation code path to infer a minimum tweak step, but we should aim to rework widgets so it isn't needed.
|
// FIXME: This is still used by some navigation code path to infer a minimum tweak step, but we should aim to rework widgets so it isn't needed.
|
||||||
int ImParseFormatPrecision(const char* fmt, int default_precision)
|
int ImParseFormatPrecision(const char* fmt, int default_precision)
|
||||||
|
Loading…
Reference in New Issue
Block a user