|
@@ -8625,26 +8625,27 @@ const char* ImGui::ParseFormatTrimDecorations(const char* fmt, char* buf, int bu
|
|
|
}
|
|
|
|
|
|
// 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.
|
|
|
int ImGui::ParseFormatPrecision(const char* fmt, int default_precision)
|
|
|
{
|
|
|
- int precision = default_precision;
|
|
|
- while ((fmt = strchr(fmt, '%')) != NULL)
|
|
|
- {
|
|
|
+ fmt = ParseFormatTrimDecorationsLeading(fmt);
|
|
|
+ if (fmt[0] != '%')
|
|
|
+ return default_precision;
|
|
|
+ fmt++;
|
|
|
+ while (*fmt >= '0' && *fmt <= '9')
|
|
|
fmt++;
|
|
|
- if (fmt[0] == '%') { fmt++; continue; } // Ignore "%%"
|
|
|
- while (*fmt >= '0' && *fmt <= '9')
|
|
|
- fmt++;
|
|
|
- if (*fmt == '.')
|
|
|
- {
|
|
|
- fmt = ImAtoi(fmt + 1, &precision);
|
|
|
- if (precision < 0 || precision > 10)
|
|
|
- precision = default_precision;
|
|
|
- }
|
|
|
- if (*fmt == 'e' || *fmt == 'E') // Maximum precision with scientific notation
|
|
|
- precision = -1;
|
|
|
- break;
|
|
|
- }
|
|
|
- return precision;
|
|
|
+ int precision = INT_MAX;
|
|
|
+ if (*fmt == '.')
|
|
|
+ {
|
|
|
+ fmt = ImAtoi(fmt + 1, &precision);
|
|
|
+ if (precision < 0 || precision > 99)
|
|
|
+ precision = default_precision;
|
|
|
+ }
|
|
|
+ if (*fmt == 'e' || *fmt == 'E') // Maximum precision with scientific notation
|
|
|
+ precision = -1;
|
|
|
+ if ((*fmt == 'g' || *fmt == 'G') && precision == INT_MAX)
|
|
|
+ precision = -1;
|
|
|
+ return (precision == INT_MAX) ? default_precision : precision;
|
|
|
}
|
|
|
|
|
|
static float GetMinimumStepAtDecimalPrecision(int decimal_precision)
|