|
@@ -748,7 +748,6 @@ static int InputTextCalcTextLenAndLineCount(const char* text_begin,
|
|
static ImVec2 InputTextCalcTextSizeW(const ImWchar* text_begin, const ImWchar* text_end, const ImWchar** remaining = NULL, ImVec2* out_offset = NULL, bool stop_on_new_line = false);
|
|
static ImVec2 InputTextCalcTextSizeW(const ImWchar* text_begin, const ImWchar* text_end, const ImWchar** remaining = NULL, ImVec2* out_offset = NULL, bool stop_on_new_line = false);
|
|
|
|
|
|
static inline int DataTypeFormatString(char* buf, int buf_size, ImGuiDataType data_type, const void* data_ptr, const char* format);
|
|
static inline int DataTypeFormatString(char* buf, int buf_size, ImGuiDataType data_type, const void* data_ptr, const char* format);
|
|
-static inline int DataTypeFormatString(char* buf, int buf_size, ImGuiDataType data_type, const void* data_ptr, int decimal_precision);
|
|
|
|
static void DataTypeApplyOp(ImGuiDataType data_type, int op, void* output, void* arg_1, const void* arg_2);
|
|
static void DataTypeApplyOp(ImGuiDataType data_type, int op, void* output, void* arg_1, const void* arg_2);
|
|
static bool DataTypeApplyOpFromText(const char* buf, const char* initial_value_buf, ImGuiDataType data_type, void* data_ptr, const char* format);
|
|
static bool DataTypeApplyOpFromText(const char* buf, const char* initial_value_buf, ImGuiDataType data_type, void* data_ptr, const char* format);
|
|
|
|
|
|
@@ -8454,30 +8453,6 @@ static inline int DataTypeFormatString(char* buf, int buf_size, ImGuiDataType da
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
-static inline int DataTypeFormatString(char* buf, int buf_size, ImGuiDataType data_type, const void* data_ptr, int decimal_precision)
|
|
|
|
-{
|
|
|
|
- if (decimal_precision < 0)
|
|
|
|
- {
|
|
|
|
- if (data_type == ImGuiDataType_Int)
|
|
|
|
- return ImFormatString(buf, buf_size, "%d", *(const int*)data_ptr);
|
|
|
|
- if (data_type == ImGuiDataType_Float)
|
|
|
|
- return ImFormatString(buf, buf_size, "%f", *(const float*)data_ptr); // Ideally we'd have a minimum decimal precision of 1 to visually denote that it is a float, while hiding non-significant digits?
|
|
|
|
- if (data_type == ImGuiDataType_Double)
|
|
|
|
- return ImFormatString(buf, buf_size, "%f", *(const double*)data_ptr);
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
- {
|
|
|
|
- if (data_type == ImGuiDataType_Int)
|
|
|
|
- return ImFormatString(buf, buf_size, "%.*d", decimal_precision, *(const int*)data_ptr);
|
|
|
|
- if (data_type == ImGuiDataType_Float)
|
|
|
|
- return ImFormatString(buf, buf_size, "%.*f", decimal_precision, *(const float*)data_ptr);
|
|
|
|
- if (data_type == ImGuiDataType_Double)
|
|
|
|
- return ImFormatString(buf, buf_size, "%.*g", decimal_precision, *(const double*)data_ptr);
|
|
|
|
- }
|
|
|
|
- IM_ASSERT(0);
|
|
|
|
- return 0;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
static void DataTypeApplyOp(ImGuiDataType data_type, int op, void* output, void* arg1, const void* arg2)
|
|
static void DataTypeApplyOp(ImGuiDataType data_type, int op, void* output, void* arg1, const void* arg2)
|
|
{
|
|
{
|
|
IM_ASSERT(op == '+' || op == '-');
|
|
IM_ASSERT(op == '+' || op == '-');
|
|
@@ -8582,7 +8557,7 @@ static bool DataTypeApplyOpFromText(const char* buf, const char* initial_value_b
|
|
|
|
|
|
// Create text input in place of a slider (when CTRL+Clicking on slider)
|
|
// Create text input in place of a slider (when CTRL+Clicking on slider)
|
|
// FIXME: Logic is messy and confusing.
|
|
// FIXME: Logic is messy and confusing.
|
|
-bool ImGui::InputScalarAsWidgetReplacement(const ImRect& aabb, const char* label, ImGuiDataType data_type, void* data_ptr, ImGuiID id, int decimal_precision)
|
|
|
|
|
|
+bool ImGui::InputScalarAsWidgetReplacement(const ImRect& bb, ImGuiID id, const char* label, ImGuiDataType data_type, void* data_ptr, const char* format)
|
|
{
|
|
{
|
|
ImGuiContext& g = *GImGui;
|
|
ImGuiContext& g = *GImGui;
|
|
ImGuiWindow* window = GetCurrentWindow();
|
|
ImGuiWindow* window = GetCurrentWindow();
|
|
@@ -8595,9 +8570,10 @@ bool ImGui::InputScalarAsWidgetReplacement(const ImRect& aabb, const char* label
|
|
FocusableItemUnregister(window);
|
|
FocusableItemUnregister(window);
|
|
|
|
|
|
char buf[32];
|
|
char buf[32];
|
|
- DataTypeFormatString(buf, IM_ARRAYSIZE(buf), data_type, data_ptr, decimal_precision);
|
|
|
|
|
|
+ format = ParseFormatSkipLeadingText(format);
|
|
|
|
+ DataTypeFormatString(buf, IM_ARRAYSIZE(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), aabb.GetSize(), flags);
|
|
|
|
|
|
+ bool text_value_changed = InputTextEx(label, buf, IM_ARRAYSIZE(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 (else we'd need to store them both, which is also possible)
|
|
@@ -8609,6 +8585,19 @@ bool ImGui::InputScalarAsWidgetReplacement(const ImRect& aabb, const char* label
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+const char* ImGui::ParseFormatSkipLeadingText(const char* fmt)
|
|
|
|
+{
|
|
|
|
+ if (fmt[0] == '%')
|
|
|
|
+ return fmt;
|
|
|
|
+ while (char c = fmt[0])
|
|
|
|
+ {
|
|
|
|
+ if (c == '%' && fmt[1] != '%')
|
|
|
|
+ return fmt;
|
|
|
|
+ fmt++;
|
|
|
|
+ }
|
|
|
|
+ return fmt;
|
|
|
|
+}
|
|
|
|
+
|
|
// Parse display precision back from the display format string
|
|
// Parse display precision back from the display format string
|
|
int ImGui::ParseFormatPrecision(const char* fmt, int default_precision)
|
|
int ImGui::ParseFormatPrecision(const char* fmt, int default_precision)
|
|
{
|
|
{
|
|
@@ -8880,7 +8869,7 @@ bool ImGui::SliderFloat(const char* label, float* v, float v_min, float v_max, c
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (start_text_input || (g.ActiveId == id && g.ScalarAsInputTextId == id))
|
|
if (start_text_input || (g.ActiveId == id && g.ScalarAsInputTextId == id))
|
|
- return InputScalarAsWidgetReplacement(frame_bb, label, ImGuiDataType_Float, v, id, decimal_precision);
|
|
|
|
|
|
+ return InputScalarAsWidgetReplacement(frame_bb, id, label, ImGuiDataType_Float, v, format);
|
|
|
|
|
|
// Actual slider behavior + render grab
|
|
// Actual slider behavior + render grab
|
|
ItemSize(total_bb, style.FramePadding.y);
|
|
ItemSize(total_bb, style.FramePadding.y);
|
|
@@ -9189,7 +9178,7 @@ bool ImGui::DragFloat(const char* label, float* v, float v_speed, float v_min, f
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (start_text_input || (g.ActiveId == id && g.ScalarAsInputTextId == id))
|
|
if (start_text_input || (g.ActiveId == id && g.ScalarAsInputTextId == id))
|
|
- return InputScalarAsWidgetReplacement(frame_bb, label, ImGuiDataType_Float, v, id, decimal_precision);
|
|
|
|
|
|
+ return InputScalarAsWidgetReplacement(frame_bb, id, label, ImGuiDataType_Float, v, format);
|
|
|
|
|
|
// Actual drag behavior
|
|
// Actual drag behavior
|
|
ItemSize(total_bb, style.FramePadding.y);
|
|
ItemSize(total_bb, style.FramePadding.y);
|