|
@@ -2141,18 +2141,25 @@ void ImGui::DataTypeApplyOp(ImGuiDataType data_type, int op, void* output, const
|
|
|
|
|
|
|
|
// User can input math operators (e.g. +100) to edit a numerical values.
|
|
// User can input math operators (e.g. +100) to edit a numerical values.
|
|
|
// NB: This is _not_ a full expression evaluator. We should probably add one and replace this dumb mess..
|
|
// NB: This is _not_ a full expression evaluator. We should probably add one and replace this dumb mess..
|
|
|
-bool ImGui::DataTypeApplyFromText(const char* buf, ImGuiDataType data_type, void* p_data, const char* format)
|
|
|
|
|
|
|
+bool ImGui::DataTypeApplyFromText(const char* buf, ImGuiDataType data_type, void* p_data, const char* format, void* p_data_when_empty)
|
|
|
{
|
|
{
|
|
|
- while (ImCharIsBlankA(*buf))
|
|
|
|
|
- buf++;
|
|
|
|
|
- if (!buf[0])
|
|
|
|
|
- return false;
|
|
|
|
|
-
|
|
|
|
|
// Copy the value in an opaque buffer so we can compare at the end of the function if it changed at all.
|
|
// Copy the value in an opaque buffer so we can compare at the end of the function if it changed at all.
|
|
|
const ImGuiDataTypeInfo* type_info = DataTypeGetInfo(data_type);
|
|
const ImGuiDataTypeInfo* type_info = DataTypeGetInfo(data_type);
|
|
|
ImGuiDataTypeStorage data_backup;
|
|
ImGuiDataTypeStorage data_backup;
|
|
|
memcpy(&data_backup, p_data, type_info->Size);
|
|
memcpy(&data_backup, p_data, type_info->Size);
|
|
|
|
|
|
|
|
|
|
+ while (ImCharIsBlankA(*buf))
|
|
|
|
|
+ buf++;
|
|
|
|
|
+ if (!buf[0])
|
|
|
|
|
+ {
|
|
|
|
|
+ if (p_data_when_empty != NULL)
|
|
|
|
|
+ {
|
|
|
|
|
+ memcpy(p_data, p_data_when_empty, type_info->Size);
|
|
|
|
|
+ return memcmp(&data_backup, p_data, type_info->Size) != 0;
|
|
|
|
|
+ }
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
// Sanitize format
|
|
// Sanitize format
|
|
|
// - For float/double we have to ignore format with precision (e.g. "%.2f") because sscanf doesn't take them in, so force them into %f and %lf
|
|
// - For float/double we have to ignore format with precision (e.g. "%.2f") because sscanf doesn't take them in, so force them into %f and %lf
|
|
|
// - In theory could treat empty format as using default, but this would only cover rare/bizarre case of using InputScalar() + integer + format string without %.
|
|
// - In theory could treat empty format as using default, but this would only cover rare/bizarre case of using InputScalar() + integer + format string without %.
|
|
@@ -3475,7 +3482,7 @@ bool ImGui::TempInputScalar(const ImRect& bb, ImGuiID id, const char* label, ImG
|
|
|
memcpy(&data_backup, p_data, data_type_size);
|
|
memcpy(&data_backup, p_data, data_type_size);
|
|
|
|
|
|
|
|
// Apply new value (or operations) then clamp
|
|
// Apply new value (or operations) then clamp
|
|
|
- DataTypeApplyFromText(data_buf, data_type, p_data, format);
|
|
|
|
|
|
|
+ DataTypeApplyFromText(data_buf, data_type, p_data, format, NULL);
|
|
|
if (p_clamp_min || p_clamp_max)
|
|
if (p_clamp_min || p_clamp_max)
|
|
|
{
|
|
{
|
|
|
if (p_clamp_min && p_clamp_max && DataTypeCompare(data_type, p_clamp_min, p_clamp_max) > 0)
|
|
if (p_clamp_min && p_clamp_max && DataTypeCompare(data_type, p_clamp_min, p_clamp_max) > 0)
|
|
@@ -3505,8 +3512,13 @@ bool ImGui::InputScalar(const char* label, ImGuiDataType data_type, void* p_data
|
|
|
if (format == NULL)
|
|
if (format == NULL)
|
|
|
format = DataTypeGetInfo(data_type)->PrintFmt;
|
|
format = DataTypeGetInfo(data_type)->PrintFmt;
|
|
|
|
|
|
|
|
|
|
+ void* p_data_default = (g.NextItemData.Flags & ImGuiNextItemDataFlags_HasRefVal) ? &g.NextItemData.RefVal : &g.DataTypeZeroValue;
|
|
|
|
|
+
|
|
|
char buf[64];
|
|
char buf[64];
|
|
|
- DataTypeFormatString(buf, IM_ARRAYSIZE(buf), data_type, p_data, format);
|
|
|
|
|
|
|
+ if ((flags & ImGuiInputTextFlags_DisplayEmptyRefVal) && DataTypeCompare(data_type, p_data, p_data_default) == 0)
|
|
|
|
|
+ buf[0] = 0;
|
|
|
|
|
+ else
|
|
|
|
|
+ DataTypeFormatString(buf, IM_ARRAYSIZE(buf), data_type, p_data, format);
|
|
|
|
|
|
|
|
flags |= ImGuiInputTextFlags_AutoSelectAll | (ImGuiInputTextFlags)ImGuiInputTextFlags_NoMarkEdited; // We call MarkItemEdited() ourselves by comparing the actual data rather than the string.
|
|
flags |= ImGuiInputTextFlags_AutoSelectAll | (ImGuiInputTextFlags)ImGuiInputTextFlags_NoMarkEdited; // We call MarkItemEdited() ourselves by comparing the actual data rather than the string.
|
|
|
flags |= (ImGuiInputTextFlags)ImGuiInputTextFlags_LocalizeDecimalPoint;
|
|
flags |= (ImGuiInputTextFlags)ImGuiInputTextFlags_LocalizeDecimalPoint;
|
|
@@ -3515,7 +3527,7 @@ bool ImGui::InputScalar(const char* label, ImGuiDataType data_type, void* p_data
|
|
|
if (p_step == NULL)
|
|
if (p_step == NULL)
|
|
|
{
|
|
{
|
|
|
if (InputText(label, buf, IM_ARRAYSIZE(buf), flags))
|
|
if (InputText(label, buf, IM_ARRAYSIZE(buf), flags))
|
|
|
- value_changed = DataTypeApplyFromText(buf, data_type, p_data, format);
|
|
|
|
|
|
|
+ value_changed = DataTypeApplyFromText(buf, data_type, p_data, format, (flags & ImGuiInputTextFlags_ParseEmptyRefVal) ? p_data_default : NULL);
|
|
|
}
|
|
}
|
|
|
else
|
|
else
|
|
|
{
|
|
{
|
|
@@ -3525,7 +3537,7 @@ bool ImGui::InputScalar(const char* label, ImGuiDataType data_type, void* p_data
|
|
|
PushID(label);
|
|
PushID(label);
|
|
|
SetNextItemWidth(ImMax(1.0f, CalcItemWidth() - (button_size + style.ItemInnerSpacing.x) * 2));
|
|
SetNextItemWidth(ImMax(1.0f, CalcItemWidth() - (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
|
|
if (InputText("", buf, IM_ARRAYSIZE(buf), flags)) // PushId(label) + "" gives us the expected ID from outside point of view
|
|
|
- value_changed = DataTypeApplyFromText(buf, data_type, p_data, format);
|
|
|
|
|
|
|
+ value_changed = DataTypeApplyFromText(buf, data_type, p_data, format, (flags & ImGuiInputTextFlags_ParseEmptyRefVal) ? p_data_default : NULL);
|
|
|
IMGUI_TEST_ENGINE_ITEM_INFO(g.LastItemData.ID, label, g.LastItemData.StatusFlags | ImGuiItemStatusFlags_Inputable);
|
|
IMGUI_TEST_ENGINE_ITEM_INFO(g.LastItemData.ID, label, g.LastItemData.StatusFlags | ImGuiItemStatusFlags_Inputable);
|
|
|
|
|
|
|
|
// Step buttons
|
|
// Step buttons
|