mirror of
https://github.com/Drezil/imgui.git
synced 2025-01-11 16:26:35 +00:00
DragFloat/SliderFloat internal InputScalar trip trailing decoration off the format string when presenting an edit box to the user. (#648)
This commit is contained in:
parent
d7e24416dd
commit
6881d065b8
@ -60,7 +60,7 @@ Other Changes:
|
|||||||
- InputFloat,InputFloat2,InputFloat3,InputFloat4: Added variations taking a more flexible and consistent optional "const char* format" parameter instead of "int decimal_precision".
|
- InputFloat,InputFloat2,InputFloat3,InputFloat4: Added variations taking a more flexible and consistent optional "const char* format" parameter instead of "int decimal_precision".
|
||||||
This allow using custom formats to display values in scientific notation, and is generally more consistent with other API. Obsoleted functions using the optional "int decimal_precision" parameter. (#648)
|
This allow using custom formats to display values in scientific notation, and is generally more consistent with other API. Obsoleted functions using the optional "int decimal_precision" parameter. (#648)
|
||||||
- DragFloat, DragInt: Cancel mouse tweak when current value is initially past the min/max boundaries and mouse is pushing in the same direction (keyboard/gamepad version already did this).
|
- DragFloat, DragInt: Cancel mouse tweak when current value is initially past the min/max boundaries and mouse is pushing in the same direction (keyboard/gamepad version already did this).
|
||||||
- DragFloat, SliderFloat: Fix to allow input of scientific notation numbers when using CTRL+Click to input the value. (~#648, #1011)
|
- DragFloat, SliderFloat: Fixes to allow input of scientific notation numbers when using CTRL+Click to input the value. (~#648, #1011)
|
||||||
- Style: Changed default style.DisplaySafeAreaPadding values from (4,4) to (3,3) so it is smaller than FramePadding and has no effect on main menu bar on a computer. (#1439)
|
- Style: Changed default style.DisplaySafeAreaPadding values from (4,4) to (3,3) so it is smaller than FramePadding and has no effect on main menu bar on a computer. (#1439)
|
||||||
- Misc: Added IMGUI_CHECKVERSION() macro to compare version string and data structure sizes in order to catch issues with mismatching compilation unit settings. (#1695, #1769)
|
- Misc: Added IMGUI_CHECKVERSION() macro to compare version string and data structure sizes in order to catch issues with mismatching compilation unit settings. (#1695, #1769)
|
||||||
- Demo: Fixed Overlay: Added a context menu item to enable freely moving the window.
|
- Demo: Fixed Overlay: Added a context menu item to enable freely moving the window.
|
||||||
|
47
imgui.cpp
47
imgui.cpp
@ -8569,33 +8569,50 @@ bool ImGui::InputScalarAsWidgetReplacement(const ImRect& bb, ImGuiID id, const c
|
|||||||
SetHoveredID(0);
|
SetHoveredID(0);
|
||||||
FocusableItemUnregister(window);
|
FocusableItemUnregister(window);
|
||||||
|
|
||||||
char buf[32];
|
char fmt_buf[32];
|
||||||
format = ParseFormatSkipLeadingText(format);
|
char data_buf[32];
|
||||||
DataTypeFormatString(buf, IM_ARRAYSIZE(buf), data_type, data_ptr, format);
|
format = ParseFormatTrimDecorations(format, fmt_buf, IM_ARRAYSIZE(fmt_buf));
|
||||||
|
DataTypeFormatString(data_buf, IM_ARRAYSIZE(data_buf), data_type, data_ptr, format);
|
||||||
ImGuiInputTextFlags flags = ImGuiInputTextFlags_AutoSelectAll | ((data_type == ImGuiDataType_Float || data_type == ImGuiDataType_Double) ? ImGuiInputTextFlags_CharsScientific : ImGuiInputTextFlags_CharsDecimal);
|
ImGuiInputTextFlags flags = ImGuiInputTextFlags_AutoSelectAll | ((data_type == ImGuiDataType_Float || data_type == ImGuiDataType_Double) ? ImGuiInputTextFlags_CharsScientific : ImGuiInputTextFlags_CharsDecimal);
|
||||||
bool text_value_changed = InputTextEx(label, buf, IM_ARRAYSIZE(buf), bb.GetSize(), flags);
|
bool value_changed = InputTextEx(label, data_buf, IM_ARRAYSIZE(data_buf), bb.GetSize(), flags);
|
||||||
if (g.ScalarAsInputTextId == 0) // First frame we started displaying the InputText widget
|
if (g.ScalarAsInputTextId == 0) // First frame we started displaying the InputText widget
|
||||||
{
|
{
|
||||||
IM_ASSERT(g.ActiveId == id); // InputText ID expected to match the Slider ID (else we'd need to store them both, which is also possible)
|
IM_ASSERT(g.ActiveId == id); // InputText ID expected to match the Slider ID
|
||||||
g.ScalarAsInputTextId = g.ActiveId;
|
g.ScalarAsInputTextId = g.ActiveId;
|
||||||
SetHoveredID(id);
|
SetHoveredID(id);
|
||||||
}
|
}
|
||||||
if (text_value_changed)
|
if (value_changed)
|
||||||
return DataTypeApplyOpFromText(buf, GImGui->InputTextState.InitialText.begin(), data_type, data_ptr, NULL);
|
return DataTypeApplyOpFromText(data_buf, g.InputTextState.InitialText.begin(), data_type, data_ptr, NULL);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* ImGui::ParseFormatSkipLeadingText(const char* fmt)
|
// Extract the format out of a format string with leading or trailing decorations
|
||||||
|
// fmt = "blah blah" -> return fmt
|
||||||
|
// fmt = "%.3f" -> return fmt
|
||||||
|
// fmt = "hello %.3f" -> return fmt + 6
|
||||||
|
// fmt = "%.3f hello" -> return buf written with "%.3f"
|
||||||
|
const char* ImGui::ParseFormatTrimDecorations(const char* fmt, char* buf, int buf_size)
|
||||||
{
|
{
|
||||||
if (fmt[0] == '%')
|
// We don't use strchr() because our strings are usually very short and often start with '%'
|
||||||
return fmt;
|
const char* fmt_start = fmt;
|
||||||
while (char c = fmt[0])
|
while (char c = *fmt++)
|
||||||
{
|
{
|
||||||
if (c == '%' && fmt[1] != '%')
|
if (c != '%') continue; // Looking for %
|
||||||
return fmt;
|
if (fmt[0] == '%') { fmt++; continue; } // Ignore "%%"
|
||||||
fmt++;
|
fmt_start = fmt - 1;
|
||||||
|
while ((c = *fmt++) != 0)
|
||||||
|
{
|
||||||
|
if (c >= 'A' && c <= 'Z' && (c != 'L')) // L is a type modifier, other letters qualify as types aka end of the format
|
||||||
|
break;
|
||||||
|
if (c >= 'a' && c <= 'z' && (c != 'h' && c != 'j' && c != 'l' && c != 't' && c != 'w' && c != 'z')) // h/j/l/t/w/z are type modifiers, other letters qualify as types aka end of the format
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (fmt[0] == 0) // If we only have leading decoration, we don't need to copy the data.
|
||||||
|
return fmt_start;
|
||||||
|
ImStrncpy(buf, fmt_start, ImMin((int)(fmt + 1 - fmt_start), buf_size));
|
||||||
|
return buf;
|
||||||
}
|
}
|
||||||
return fmt;
|
return fmt_start;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse display precision back from the display format string
|
// Parse display precision back from the display format string
|
||||||
|
@ -1119,7 +1119,7 @@ namespace ImGui
|
|||||||
|
|
||||||
IMGUI_API void PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 graph_size);
|
IMGUI_API void PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 graph_size);
|
||||||
|
|
||||||
IMGUI_API const char* ParseFormatSkipLeadingText(const char* format);
|
IMGUI_API const char* ParseFormatTrimDecorations(const char* format, char* buf, int buf_size);
|
||||||
IMGUI_API int ParseFormatPrecision(const char* format, int default_value);
|
IMGUI_API int ParseFormatPrecision(const char* format, int default_value);
|
||||||
IMGUI_API float RoundScalar(float value, int decimal_precision);
|
IMGUI_API float RoundScalar(float value, int decimal_precision);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user