From 8aa402bcb9b7ec22cb68d98011c6832d85b1c381 Mon Sep 17 00:00:00 2001 From: nothingTVatYT <34131388+nothingTVatYT@users.noreply.github.com> Date: Wed, 31 Jan 2024 23:21:57 +0100 Subject: [PATCH] add space option and avoid duplicated code --- Source/Editor/Options/InterfaceOptions.cs | 15 ++++ Source/Editor/Utilities/Units.cs | 23 ++++-- Source/Editor/Utilities/Utils.cs | 87 ++++++++++------------- 3 files changed, 72 insertions(+), 53 deletions(-) diff --git a/Source/Editor/Options/InterfaceOptions.cs b/Source/Editor/Options/InterfaceOptions.cs index 5c4a88b1e..3e32b0933 100644 --- a/Source/Editor/Options/InterfaceOptions.cs +++ b/Source/Editor/Options/InterfaceOptions.cs @@ -185,6 +185,21 @@ namespace FlaxEditor.Options } } + private bool _spaceNumberAndUnits = false; + + /// + /// Gets or sets the option to put a space between numbers and units for unit formatting + /// + [DefaultValue(false)] + [EditorDisplay("Interface"), EditorOrder(310), Tooltip("Put a space between numbers and units.")] + public bool SpaceNumberAndUnits { get => _spaceNumberAndUnits; + set + { + _spaceNumberAndUnits = value; + Units.SpaceNumberAndUnits = _spaceNumberAndUnits; + } + } + /// /// Gets or sets the timestamps prefix mode for output log messages. /// diff --git a/Source/Editor/Utilities/Units.cs b/Source/Editor/Utilities/Units.cs index 1256ccd63..cd4e67882 100644 --- a/Source/Editor/Utilities/Units.cs +++ b/Source/Editor/Utilities/Units.cs @@ -7,15 +7,30 @@ public class Units /// public static readonly float Meters2Units = 100f; - // the next two bools could be cached values in the user preferences - /// - /// Set it to false to always show game units without any postfix + /// Set it to false to always show game units without any postfix. /// public static bool UseUnitsFormatting = true; /// - /// If set to true, the distance unit is chosen on the magnitude, otherwise it's meters + /// Add a space between numbers and units for readability. + /// + public static bool SpaceNumberAndUnits = true; + + /// + /// If set to true, the distance unit is chosen on the magnitude, otherwise it's meters. /// public static bool AutomaticUnitsFormatting = true; + + /// + /// Return the unit according to user settings. + /// + /// + /// + public static string Unit(string unit) + { + if (SpaceNumberAndUnits) + return $" {unit}"; + return unit; + } } diff --git a/Source/Editor/Utilities/Utils.cs b/Source/Editor/Utilities/Utils.cs index 445520f76..17456babf 100644 --- a/Source/Editor/Utilities/Utils.cs +++ b/Source/Editor/Utilities/Utils.cs @@ -1171,6 +1171,36 @@ namespace FlaxEditor.Utilities return StringUtils.GetPathWithoutExtension(path); } + private static string InternalFormat(double value, string format, FlaxEngine.Utils.ValueCategory category) + { + switch (category) + { + case FlaxEngine.Utils.ValueCategory.Distance: + if (!Units.AutomaticUnitsFormatting) + return (value / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + Units.Unit("m"); + var absValue = Mathf.Abs(value); + // in case a unit != cm this would be (value / Meters2Units * 100) + if (absValue < Units.Meters2Units) + return value.ToString(format, CultureInfo.InvariantCulture) + Units.Unit("cm"); + if (absValue < Units.Meters2Units * 1000) + return (value / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + Units.Unit("m"); + return (value / 1000 / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + Units.Unit("km"); + case FlaxEngine.Utils.ValueCategory.Angle: return value.ToString(format, CultureInfo.InvariantCulture) + "°"; + case FlaxEngine.Utils.ValueCategory.Time: return value.ToString(format, CultureInfo.InvariantCulture) + Units.Unit("s"); + // some fonts have a symbol for that: "\u33A7" + case FlaxEngine.Utils.ValueCategory.Speed: return (value / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + Units.Unit("m/s"); + case FlaxEngine.Utils.ValueCategory.Acceleration: return (value / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + Units.Unit("m/s²"); + case FlaxEngine.Utils.ValueCategory.Area: return (value / Units.Meters2Units / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + Units.Unit("m²"); + case FlaxEngine.Utils.ValueCategory.Volume: return (value / Units.Meters2Units / Units.Meters2Units / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + Units.Unit("m³"); + case FlaxEngine.Utils.ValueCategory.Mass: return value.ToString(format, CultureInfo.InvariantCulture) + Units.Unit("kg"); + case FlaxEngine.Utils.ValueCategory.Force: return (value / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + Units.Unit("N"); + case FlaxEngine.Utils.ValueCategory.Torque: return (value / Units.Meters2Units / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + Units.Unit("Nm"); + case FlaxEngine.Utils.ValueCategory.None: + default: + return FormatFloat(value); + } + } + /// /// Format a float value either as-is, with a distance unit or with a degree sign /// @@ -1183,35 +1213,10 @@ namespace FlaxEditor.Utilities return "Infinity"; if (float.IsNegativeInfinity(value) || value == float.MinValue) return "-Infinity"; - const string format = "g7"; - if (!Units.UseUnitsFormatting) + if (!Units.UseUnitsFormatting || category == FlaxEngine.Utils.ValueCategory.None) return FormatFloat(value); - switch (category) - { - case FlaxEngine.Utils.ValueCategory.Distance: - if (!Units.AutomaticUnitsFormatting) - return (value / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "m"; - var absValue = Mathf.Abs(value); - // in case a unit != cm this would be (value / Meters2Units * 100) - if (absValue < Units.Meters2Units) - return value.ToString(format, CultureInfo.InvariantCulture) + "cm"; - if (absValue < Units.Meters2Units * 1000) - return (value / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "m"; - return (value / 1000 / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "km"; - case FlaxEngine.Utils.ValueCategory.Angle: return value.ToString(format, CultureInfo.InvariantCulture) + "°"; - case FlaxEngine.Utils.ValueCategory.Time: return value.ToString(format, CultureInfo.InvariantCulture) + "s"; - // some fonts have a symbol for that: "\u33A7" - case FlaxEngine.Utils.ValueCategory.Speed: return (value / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "m/s"; - case FlaxEngine.Utils.ValueCategory.Acceleration: return (value / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "m/s²"; - case FlaxEngine.Utils.ValueCategory.Area: return (value / Units.Meters2Units / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "m²"; - case FlaxEngine.Utils.ValueCategory.Volume: return (value / Units.Meters2Units / Units.Meters2Units / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "m³"; - case FlaxEngine.Utils.ValueCategory.Mass: return value.ToString(format, CultureInfo.InvariantCulture) + "kg"; - case FlaxEngine.Utils.ValueCategory.Force: return (value / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "N"; - case FlaxEngine.Utils.ValueCategory.Torque: return (value / Units.Meters2Units / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "Nm"; - case FlaxEngine.Utils.ValueCategory.None: - default: - return FormatFloat(value); - } + const string format = "G7"; + return InternalFormat(value, format, category); } /// @@ -1226,26 +1231,10 @@ namespace FlaxEditor.Utilities return "Infinity"; if (double.IsNegativeInfinity(value) || value == double.MinValue) return "-Infinity"; - const string format = "g15"; - if (!Units.UseUnitsFormatting) + if (!Units.UseUnitsFormatting || category == FlaxEngine.Utils.ValueCategory.None) return FormatFloat(value); - switch (category) - { - case FlaxEngine.Utils.ValueCategory.Distance: - if (!Units.AutomaticUnitsFormatting) - return (value / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "m"; - var absValue = Mathf.Abs(value); - // in case a unit != cm this would be (value / Maters2Units * 100) - if (absValue < Units.Meters2Units) - return value.ToString(format, CultureInfo.InvariantCulture) + "cm"; - if (absValue < Units.Meters2Units * 1000) - return (value / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "m"; - return (value / 1000 / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "km"; - case FlaxEngine.Utils.ValueCategory.Angle: return value.ToString(format, CultureInfo.InvariantCulture) + "°"; - case FlaxEngine.Utils.ValueCategory.None: - default: - return FormatFloat(value); - } + const string format = "G15"; + return InternalFormat(value, format, category); } /// @@ -1259,7 +1248,7 @@ namespace FlaxEditor.Utilities return "Infinity"; if (float.IsNegativeInfinity(value) || value == float.MinValue) return "-Infinity"; - string str = value.ToString("g7", CultureInfo.InvariantCulture); + string str = value.ToString("R", CultureInfo.InvariantCulture); return FormatFloat(str, value < 0); } @@ -1274,7 +1263,7 @@ namespace FlaxEditor.Utilities return "Infinity"; if (double.IsNegativeInfinity(value) || value == double.MinValue) return "-Infinity"; - string str = value.ToString("g15", CultureInfo.InvariantCulture); + string str = value.ToString("R", CultureInfo.InvariantCulture); return FormatFloat(str, value < 0); }