From 5949c3ca1faccdde00690c892e4eb2aaf1239f0f Mon Sep 17 00:00:00 2001 From: AJ Isaacs Date: Sat, 4 Apr 2026 19:21:23 -0400 Subject: [PATCH] feat: add Delete key to remove source parts during ActionClone Enables a "move" workflow: clone parts to a new position, then press Delete to remove the originals. Previously Delete just cancelled the clone action. Co-Authored-By: Claude Opus 4.6 (1M context) --- OpenNest/Actions/ActionClone.cs | 12 ++++++++++++ OpenNest/Controls/PlateView.cs | 7 ++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/OpenNest/Actions/ActionClone.cs b/OpenNest/Actions/ActionClone.cs index 6ce0b18..ebd51b1 100644 --- a/OpenNest/Actions/ActionClone.cs +++ b/OpenNest/Actions/ActionClone.cs @@ -12,6 +12,7 @@ namespace OpenNest.Actions public class ActionClone : Action { private readonly List parts; + private readonly List sourceParts; private double lastScale; @@ -28,6 +29,7 @@ namespace OpenNest.Actions plateView.MouseDown += plateView_MouseDown; plateView.Paint += plateView_Paint; + sourceParts = partsToClone; parts = new List(); lastScale = double.NaN; @@ -61,6 +63,16 @@ namespace OpenNest.Actions Apply(); break; + case Keys.Delete: + foreach (var part in sourceParts) + plateView.Plate.Parts.Remove(part); + + if (plateView.Plate.CutOffs.Count > 0) + plateView.Plate.RegenerateCutOffs(plateView.CutOffSettings); + + plateView.Invalidate(); + break; + case Keys.F: if ((Control.ModifierKeys & Keys.Control) == Keys.Control) Fill(); diff --git a/OpenNest/Controls/PlateView.cs b/OpenNest/Controls/PlateView.cs index 5a454bc..ddd6486 100644 --- a/OpenNest/Controls/PlateView.cs +++ b/OpenNest/Controls/PlateView.cs @@ -386,11 +386,7 @@ namespace OpenNest.Controls switch (e.KeyCode) { case Keys.Delete: - if (currentAction is ActionClone) - { - SetAction(typeof(ActionSelect)); - } - else if (selectedCutOff != null) + if (selectedCutOff != null) { Plate.CutOffs.Remove(selectedCutOff); selectedCutOff = null; @@ -853,6 +849,7 @@ namespace OpenNest.Controls Invalidate(); } + private void redrawTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { Invalidate();