From 763e2a1d4aa14246cf1f8d191176f3cea7337bbd Mon Sep 17 00:00:00 2001 From: AJ Isaacs Date: Sun, 1 Nov 2026 23:29:46 -0500 Subject: [PATCH] fix(ui): scale the fill time in the status bar Long fills read as thousands of milliseconds. Keep milliseconds under a second, then show seconds and minutes so the time stays readable. Co-Authored-By: Claude Opus 5.5 --- .../Controls/PlateViewFillTimeTests.cs | 18 ++++++++++++++++++ OpenNest/Controls/PlateView.cs | 14 +++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 OpenNest.WinForms.Tests/Controls/PlateViewFillTimeTests.cs diff --git a/OpenNest.WinForms.Tests/Controls/PlateViewFillTimeTests.cs b/OpenNest.WinForms.Tests/Controls/PlateViewFillTimeTests.cs new file mode 100644 index 00000000..39581ad5 --- /dev/null +++ b/OpenNest.WinForms.Tests/Controls/PlateViewFillTimeTests.cs @@ -0,0 +1,18 @@ +using OpenNest.Controls; + +namespace OpenNest.WinForms.Tests.Controls; + +public class PlateViewFillTimeTests +{ + [Theory] + [InlineData(0, "0 ms")] + [InlineData(850, "850 ms")] + [InlineData(999, "999 ms")] + [InlineData(1000, "1.0 s")] + [InlineData(2400, "2.4 s")] + [InlineData(59960, "59.9 s")] + [InlineData(60000, "1m 00s")] + [InlineData(125000, "2m 05s")] + public void FillTimeIsShownInTheLargestUnitThatFits(int milliseconds, string expected) => + Assert.Equal(expected, PlateView.FormatFillTime(TimeSpan.FromMilliseconds(milliseconds))); +} diff --git a/OpenNest/Controls/PlateView.cs b/OpenNest/Controls/PlateView.cs index 0073079b..ad3ef539 100644 --- a/OpenNest/Controls/PlateView.cs +++ b/OpenNest/Controls/PlateView.cs @@ -995,7 +995,7 @@ namespace OpenNest.Controls change.Complete(); sw.Stop(); - Status = $"Fill: {parts.Count} parts in {sw.ElapsedMilliseconds} ms"; + Status = $"Fill: {parts.Count} parts in {FormatFillTime(sw.Elapsed)}"; } else { @@ -1023,6 +1023,18 @@ namespace OpenNest.Controls } } + // Truncates so a time just under a unit boundary never reads as "60.0 s". + internal static string FormatFillTime(TimeSpan elapsed) + { + if (elapsed.TotalSeconds < 1) + return $"{(int)elapsed.TotalMilliseconds} ms"; + + if (elapsed.TotalMinutes < 1) + return $"{(int)(elapsed.TotalSeconds * 10) / 10.0:0.0} s"; + + return $"{(int)elapsed.TotalMinutes}m {elapsed.Seconds:00}s"; + } + public void RemoveSelectedParts() => selection.RemoveSelectedParts(); private void redrawTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)