From e5e2c268b8ac1ea15b436884538624b1b02111ec Mon Sep 17 00:00:00 2001 From: AJ Isaacs Date: Mon, 26 Oct 2026 07:49:54 -0400 Subject: [PATCH] feat(ui): redesign the Nest Defaults dialog The flat ten-row list squeezed the quadrant picker to 120x28 and gave no hint of units or where the defaults are saved. Group the fields (General, Plate Size, Quadrant, Spacing), lay the edge spacings out around a plate, show in/mm suffixes, and convert the values when the units switch so a 48 in plate does not silently become 48 mm. The footer says whether Save writes to this PC or the shared nest server, and Save is disabled while the shared copy is read-only instead of failing after the click. Co-Authored-By: Claude Opus 5.5 --- .../Forms/NestDefaultsFormTests.cs | 61 ++ OpenNest/Forms/MainForm.Tools.cs | 4 +- OpenNest/Forms/NestDefaultsForm.Designer.cs | 584 +++++++++--------- OpenNest/Forms/NestDefaultsForm.cs | 56 +- OpenNest/Forms/SharedSettings.cs | 13 + docs/shared-settings.md | 3 +- 6 files changed, 427 insertions(+), 294 deletions(-) create mode 100644 OpenNest.WinForms.Tests/Forms/NestDefaultsFormTests.cs diff --git a/OpenNest.WinForms.Tests/Forms/NestDefaultsFormTests.cs b/OpenNest.WinForms.Tests/Forms/NestDefaultsFormTests.cs new file mode 100644 index 00000000..f350fdf2 --- /dev/null +++ b/OpenNest.WinForms.Tests/Forms/NestDefaultsFormTests.cs @@ -0,0 +1,61 @@ +using System.Windows.Forms; +using OpenNest.Data; +using OpenNest.Forms; +using OpenNest.Geometry; + +namespace OpenNest.WinForms.Tests.Forms; + +public class NestDefaultsFormTests +{ + [Fact] + public void SwitchingUnitsConvertsTheShownValues() + { + RunSta(() => + { + var machine = new MachineConfig { Name = "Laser" }; + var defaults = new NestDefaults + { + Units = Units.Inches, + Size = new Size(48, 96), + Quadrant = 3, + PartSpacing = 0.25, + EdgeSpacing = new Spacing(0.5, 1, 1.5, 2), + MachineId = machine.Id, + }; + using var form = new NestDefaultsForm(defaults, new[] { machine }, ("Saved on this PC.", false)); + Assert.Equal("in", Control(form, "widthBox").Suffix); + + Control(form, "millimetersRadio").Checked = true; + + var converted = form.GetDefaults(); + Assert.Equal(Units.Millimeters, converted.Units); + Assert.Equal(new Size(1219.2, 2438.4), converted.Size); + Assert.Equal(6.35, converted.PartSpacing); + Assert.Equal(new Spacing(12.7, 25.4, 38.1, 50.8), converted.EdgeSpacing); + Assert.Equal(3, converted.Quadrant); + Assert.Equal(machine.Id, converted.MachineId); + Assert.Equal("mm", Control(form, "edgeTopBox").Suffix); + + Control(form, "inchesRadio").Checked = true; + Assert.Equal(new Size(48, 96), form.GetDefaults().Size); + }); + } + + [Fact] + public void ReadOnlySourceDisablesSave() + { + RunSta(() => + { + using var form = new NestDefaultsForm(new NestDefaults(), Array.Empty(), + ("Shared, read-only: the server cannot be reached.", true)); + Assert.False(Control