|
@@ -9271,19 +9271,21 @@ bool ImGui::DragBehavior(ImGuiID id, ImGuiDataType data_type, void* v, float v_s
|
|
}
|
|
}
|
|
|
|
|
|
// FIXME-LEGACY: Prior to 1.61 our DragInt() function internally used floats and because of this the compile-time default value for format was "%.0f".
|
|
// FIXME-LEGACY: Prior to 1.61 our DragInt() function internally used floats and because of this the compile-time default value for format was "%.0f".
|
|
-// Even though we changed the compile-time default, we expect users to have carried %f around, which would break DragInt() calls.
|
|
|
|
-// To honor backward compatibility we are rewriting the format string, unless IMGUI_DISABLE_OBSOLETE_FUNCTIONS is enabled. Note that calling code has a fast-path that return "%d" if the string is "%.0f".
|
|
|
|
|
|
+// Even though we changed the compile-time default, we expect users to have carried %f around, which would break the display of DragInt() calls.
|
|
|
|
+// To honor backward compatibility we are rewriting the format string, unless IMGUI_DISABLE_OBSOLETE_FUNCTIONS is enabled. What could possibly go wrong?!
|
|
static const char* PatchFormatStringFloatToInt(const char* fmt)
|
|
static const char* PatchFormatStringFloatToInt(const char* fmt)
|
|
{
|
|
{
|
|
- const char* fmt_start = ImParseFormatFindStart(fmt);
|
|
|
|
- const char* fmt_end = ImParseFormatFindEnd(fmt_start);
|
|
|
|
|
|
+ if (fmt[0] == '%' && fmt[1] == '.' && fmt[2] == '0' && fmt[3] == 'f' && fmt[4] == 0) // Fast legacy path for "%.0f" which is expected to be the most common case.
|
|
|
|
+ return "%d";
|
|
|
|
+ const char* fmt_start = ImParseFormatFindStart(fmt); // Find % (if any, and ignore %%)
|
|
|
|
+ const char* fmt_end = ImParseFormatFindEnd(fmt_start); // Find end of format specifier, which itself is an exercise of confidence/recklessness (because snprintf is dependent on libc or user).
|
|
if (fmt_end > fmt_start && fmt_end[-1] == 'f')
|
|
if (fmt_end > fmt_start && fmt_end[-1] == 'f')
|
|
{
|
|
{
|
|
#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
|
|
#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
|
|
if (fmt_start == fmt && fmt_end[0] == 0)
|
|
if (fmt_start == fmt && fmt_end[0] == 0)
|
|
return "%d";
|
|
return "%d";
|
|
ImGuiContext& g = *GImGui;
|
|
ImGuiContext& g = *GImGui;
|
|
- ImFormatString(g.TempBuffer, IM_ARRAYSIZE(g.TempBuffer), "%.*s%%d%s", (int)(fmt_start - fmt), fmt, fmt_end); // Honor leading and trailing decorations
|
|
|
|
|
|
+ ImFormatString(g.TempBuffer, IM_ARRAYSIZE(g.TempBuffer), "%.*s%%d%s", (int)(fmt_start - fmt), fmt, fmt_end); // Honor leading and trailing decorations, but lose alignment/precision.
|
|
return g.TempBuffer;
|
|
return g.TempBuffer;
|
|
#else
|
|
#else
|
|
IM_ASSERT(0 && "DragInt(): Invalid format string!"); // Old versions used a default parameter of "%.0f", please replace with e.g. "%d"
|
|
IM_ASSERT(0 && "DragInt(): Invalid format string!"); // Old versions used a default parameter of "%.0f", please replace with e.g. "%d"
|
|
@@ -9321,7 +9323,7 @@ bool ImGui::DragScalar(const char* label, ImGuiDataType data_type, void* v, floa
|
|
|
|
|
|
// Patch old "%.0f" format string to use "%d", read function comments for more details.
|
|
// Patch old "%.0f" format string to use "%d", read function comments for more details.
|
|
if (data_type == ImGuiDataType_S32 && strcmp(format, "%d") != 0)
|
|
if (data_type == ImGuiDataType_S32 && strcmp(format, "%d") != 0)
|
|
- format = (strcmp(format, "%.0f") == 0) ? "%d" : PatchFormatStringFloatToInt(format);
|
|
|
|
|
|
+ format = PatchFormatStringFloatToInt(format);
|
|
|
|
|
|
// Tabbing or CTRL-clicking on Drag turns it into an input box
|
|
// Tabbing or CTRL-clicking on Drag turns it into an input box
|
|
bool start_text_input = false;
|
|
bool start_text_input = false;
|
|
@@ -10675,7 +10677,7 @@ bool ImGui::InputTextMultiline(const char* label, char* buf, size_t buf_size, co
|
|
}
|
|
}
|
|
|
|
|
|
// NB: format here must be a simple "%xx" format string with no prefix/suffix (unlike the Drag/Slider functions "format" argument)
|
|
// NB: format here must be a simple "%xx" format string with no prefix/suffix (unlike the Drag/Slider functions "format" argument)
|
|
-bool ImGui::InputScalar(const char* label, ImGuiDataType data_type, void* data_ptr, void* step_ptr, void* step_fast_ptr, const char* format, ImGuiInputTextFlags extra_flags)
|
|
|
|
|
|
+bool ImGui::InputScalar(const char* label, ImGuiDataType data_type, void* data_ptr, const void* step, const void* step_fast, const char* format, ImGuiInputTextFlags extra_flags)
|
|
{
|
|
{
|
|
ImGuiWindow* window = GetCurrentWindow();
|
|
ImGuiWindow* window = GetCurrentWindow();
|
|
if (window->SkipItems)
|
|
if (window->SkipItems)
|
|
@@ -10692,7 +10694,7 @@ bool ImGui::InputScalar(const char* label, ImGuiDataType data_type, void* data_p
|
|
extra_flags |= ImGuiInputTextFlags_CharsDecimal;
|
|
extra_flags |= ImGuiInputTextFlags_CharsDecimal;
|
|
extra_flags |= ImGuiInputTextFlags_AutoSelectAll;
|
|
extra_flags |= ImGuiInputTextFlags_AutoSelectAll;
|
|
|
|
|
|
- if (step_ptr)
|
|
|
|
|
|
+ if (step != NULL)
|
|
{
|
|
{
|
|
const float button_size = GetFrameHeight();
|
|
const float button_size = GetFrameHeight();
|
|
|
|
|
|
@@ -10707,13 +10709,13 @@ bool ImGui::InputScalar(const char* label, ImGuiDataType data_type, void* data_p
|
|
SameLine(0, style.ItemInnerSpacing.x);
|
|
SameLine(0, style.ItemInnerSpacing.x);
|
|
if (ButtonEx("-", ImVec2(button_size, button_size), ImGuiButtonFlags_Repeat | ImGuiButtonFlags_DontClosePopups))
|
|
if (ButtonEx("-", ImVec2(button_size, button_size), ImGuiButtonFlags_Repeat | ImGuiButtonFlags_DontClosePopups))
|
|
{
|
|
{
|
|
- DataTypeApplyOp(data_type, '-', data_ptr, data_ptr, g.IO.KeyCtrl && step_fast_ptr ? step_fast_ptr : step_ptr);
|
|
|
|
|
|
+ DataTypeApplyOp(data_type, '-', data_ptr, data_ptr, g.IO.KeyCtrl && step_fast ? step_fast : step);
|
|
value_changed = true;
|
|
value_changed = true;
|
|
}
|
|
}
|
|
SameLine(0, style.ItemInnerSpacing.x);
|
|
SameLine(0, style.ItemInnerSpacing.x);
|
|
if (ButtonEx("+", ImVec2(button_size, button_size), ImGuiButtonFlags_Repeat | ImGuiButtonFlags_DontClosePopups))
|
|
if (ButtonEx("+", ImVec2(button_size, button_size), ImGuiButtonFlags_Repeat | ImGuiButtonFlags_DontClosePopups))
|
|
{
|
|
{
|
|
- DataTypeApplyOp(data_type, '+', data_ptr, data_ptr, g.IO.KeyCtrl && step_fast_ptr ? step_fast_ptr : step_ptr);
|
|
|
|
|
|
+ DataTypeApplyOp(data_type, '+', data_ptr, data_ptr, g.IO.KeyCtrl && step_fast ? step_fast : step);
|
|
value_changed = true;
|
|
value_changed = true;
|
|
}
|
|
}
|
|
SameLine(0, style.ItemInnerSpacing.x);
|
|
SameLine(0, style.ItemInnerSpacing.x);
|
|
@@ -10750,7 +10752,7 @@ bool ImGui::InputInt(const char* label, int* v, int step, int step_fast, ImGuiIn
|
|
return InputScalar(label, ImGuiDataType_S32, (void*)v, (void*)(step>0 ? &step : NULL), (void*)(step_fast>0 ? &step_fast : NULL), format, extra_flags);
|
|
return InputScalar(label, ImGuiDataType_S32, (void*)v, (void*)(step>0 ? &step : NULL), (void*)(step_fast>0 ? &step_fast : NULL), format, extra_flags);
|
|
}
|
|
}
|
|
|
|
|
|
-bool ImGui::InputScalarN(const char* label, ImGuiDataType data_type, void* v, int components, void* step_ptr, void* step_fast_ptr, const char* format, ImGuiInputTextFlags extra_flags)
|
|
|
|
|
|
+bool ImGui::InputScalarN(const char* label, ImGuiDataType data_type, void* v, int components, const void* step, const void* step_fast, const char* format, ImGuiInputTextFlags extra_flags)
|
|
{
|
|
{
|
|
ImGuiWindow* window = GetCurrentWindow();
|
|
ImGuiWindow* window = GetCurrentWindow();
|
|
if (window->SkipItems)
|
|
if (window->SkipItems)
|
|
@@ -10765,7 +10767,7 @@ bool ImGui::InputScalarN(const char* label, ImGuiDataType data_type, void* v, in
|
|
for (int i = 0; i < components; i++)
|
|
for (int i = 0; i < components; i++)
|
|
{
|
|
{
|
|
PushID(i);
|
|
PushID(i);
|
|
- value_changed |= InputScalar("##v", data_type, v, step_ptr, step_fast_ptr, format, extra_flags);
|
|
|
|
|
|
+ value_changed |= InputScalar("##v", data_type, v, step, step_fast, format, extra_flags);
|
|
SameLine(0, g.Style.ItemInnerSpacing.x);
|
|
SameLine(0, g.Style.ItemInnerSpacing.x);
|
|
PopID();
|
|
PopID();
|
|
PopItemWidth();
|
|
PopItemWidth();
|