diff --git a/OpenNest.Avalonia/Controls/PlateCanvas.cs b/OpenNest.Avalonia/Controls/PlateCanvas.cs index 5b71da4c..2ddf1b45 100644 --- a/OpenNest.Avalonia/Controls/PlateCanvas.cs +++ b/OpenNest.Avalonia/Controls/PlateCanvas.cs @@ -98,11 +98,15 @@ namespace OpenNest.Avalonia.Controls if (plate == null) { paths.Clear(); + labelPoints.Clear(); return; } var shown = new HashSet(plate.Parts); foreach (var stale in paths.Keys.Where(part => !shown.Contains(part)).ToList()) paths.Remove(stale); + var drawings = new HashSet(plate.Parts.Select(part => part.BaseDrawing)); + foreach (var stale in labelPoints.Keys.Where(drawing => !drawings.Contains(drawing)).ToList()) + labelPoints.Remove(stale); } public void ZoomToFit() @@ -263,7 +267,11 @@ namespace OpenNest.Avalonia.Controls foreach (var path in CommonLineGeometry.Paths(cached.Check.Spans, group.Kerf)) scene.CommonLines.Add(path.Points); foreach (var problem in cached.Check.Problems) - scene.CommonLineProblems.Add(problem.Part.BoundingBox); + { + // A copy: moving the part changes its box in place while the render thread draws. + var box = problem.Part.BoundingBox; + scene.CommonLineProblems.Add(new Box(box.X, box.Y, box.Length, box.Width)); + } } } diff --git a/OpenNest.Desktop.Tests/Rendering/PlateSceneTests.cs b/OpenNest.Desktop.Tests/Rendering/PlateSceneTests.cs index 4790ebcb..eeaf9788 100644 --- a/OpenNest.Desktop.Tests/Rendering/PlateSceneTests.cs +++ b/OpenNest.Desktop.Tests/Rendering/PlateSceneTests.cs @@ -255,6 +255,25 @@ public class PlateViewOptionsTests Assert.False(read.DrawSupport); } + [Fact] + public void Untouched_defaults_stay_out_of_the_settings() + { + var settings = new Dictionary { ["Other"] = "kept" }; + new PlateViewOptions().WriteTo(settings); + + Assert.Single(settings); + } + + [Fact] + public void A_saved_toggle_set_back_to_its_default_is_written() + { + var settings = new Dictionary { ["PlateViewDrawRapid"] = "True" }; + new PlateViewOptions().WriteTo(settings); + + Assert.Equal("False", settings["PlateViewDrawRapid"]); + Assert.False(settings.ContainsKey("PlateViewDrawBounds")); + } + [Fact] public void Unreadable_values_are_defaults() { diff --git a/OpenNest.Desktop/Rendering/PlateViewOptions.cs b/OpenNest.Desktop/Rendering/PlateViewOptions.cs index 4d1212f7..a96957d8 100644 --- a/OpenNest.Desktop/Rendering/PlateViewOptions.cs +++ b/OpenNest.Desktop/Rendering/PlateViewOptions.cs @@ -45,11 +45,22 @@ public sealed class PlateViewOptions return options; } - /// Stores the rapids and bounds toggles in the WinForms format. + /// + /// Stores the rapids and bounds toggles in the WinForms format. As the WinForms settings + /// provider does, a toggle still at its default is left out unless the file already holds it, + /// so a later default change still applies. + /// public void WriteTo(IDictionary settings) { ArgumentNullException.ThrowIfNull(settings); - settings[DrawRapidName] = UserSettingText.Format(DrawRapid); - settings[DrawBoundsName] = UserSettingText.Format(DrawBounds); + var defaults = new PlateViewOptions(); + Write(settings, DrawRapidName, DrawRapid, defaults.DrawRapid); + Write(settings, DrawBoundsName, DrawBounds, defaults.DrawBounds); + } + + private static void Write(IDictionary settings, string name, bool value, bool fallback) + { + if (value != fallback || settings.ContainsKey(name)) + settings[name] = UserSettingText.Format(value); } }