From ea540253bb5e452ba74c3048943ee227184a7779 Mon Sep 17 00:00:00 2001 From: AJ Isaacs Date: Sat, 7 Nov 2026 20:22:07 -0500 Subject: [PATCH] feat(ui): delete plates from the Plates list's right-click menu Add Delete Plate to the plate row menu beside Duplicate Plate, enabled when Remove Selected Plate is. Drop the Plates tab's add-plate button and the Plate menu's Add and Remove items: the list's trailing empty plate already provides new plates, and removal stays on the tab. Co-Authored-By: Claude Opus 5.5 --- .../Forms/PlateReorderTests.cs | 16 ++++++++++ OpenNest/Forms/EditNestForm.Designer.cs | 21 +------------- OpenNest/Forms/EditNestForm.PlateOrder.cs | 7 ++++- OpenNest/Forms/EditNestForm.cs | 10 ------- OpenNest/Forms/MainForm.Designer.cs | 29 +------------------ OpenNest/Forms/MainForm.File.cs | 1 - OpenNest/Forms/MainForm.Plate.cs | 10 ------- 7 files changed, 24 insertions(+), 70 deletions(-) diff --git a/OpenNest.WinForms.Tests/Forms/PlateReorderTests.cs b/OpenNest.WinForms.Tests/Forms/PlateReorderTests.cs index 96893ffe..b53f2801 100644 --- a/OpenNest.WinForms.Tests/Forms/PlateReorderTests.cs +++ b/OpenNest.WinForms.Tests/Forms/PlateReorderTests.cs @@ -68,6 +68,22 @@ public class PlateReorderTests Assert.NotNull(list.ContextMenuStrip); }); + [Fact] + public void DeletePlateOnTheRowMenuRemovesTheCurrentPlate() => UndoTestEnv.Run(env => + { + env.Editor.PlateManager.LoadAt(0); + var plate = env.Nest.Plates[0]; + var count = env.Nest.Plates.Count; + var list = (ListView)Assert.Single(env.Editor.Controls.Find("platesListView", true)); + var item = Assert.IsType(list.ContextMenuStrip!.Items["deletePlateMenuItem"]); + Assert.Equal("Delete Plate", item.Text); + + item.PerformClick(); + + Assert.Equal(count - 1, env.Nest.Plates.Count); + Assert.DoesNotContain(plate, env.Nest.Plates); + }); + [Fact] public void TheEmptySentinelCannotBeDuplicated() => UndoTestEnv.Run(env => { diff --git a/OpenNest/Forms/EditNestForm.Designer.cs b/OpenNest/Forms/EditNestForm.Designer.cs index a5e91441..24269a59 100644 --- a/OpenNest/Forms/EditNestForm.Designer.cs +++ b/OpenNest/Forms/EditNestForm.Designer.cs @@ -48,8 +48,6 @@ partsColumn = new System.Windows.Forms.ColumnHeader(); utilColumn = new System.Windows.Forms.ColumnHeader(); toolStrip1 = new System.Windows.Forms.ToolStrip(); - toolStripLabel1 = new System.Windows.Forms.ToolStripButton(); - toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); toolStripLabel2 = new System.Windows.Forms.ToolStripButton(); tabPage2 = new System.Windows.Forms.TabPage(); drawingListBox1 = new OpenNest.Controls.DrawingListBox(); @@ -159,28 +157,13 @@ // toolStrip1.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; toolStrip1.ImageScalingSize = new System.Drawing.Size(20, 20); - toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { toolStripLabel1, toolStripSeparator3, toolStripLabel2 }); + toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { toolStripLabel2 }); toolStrip1.Location = new System.Drawing.Point(4, 3); toolStrip1.Name = "toolStrip1"; toolStrip1.Size = new System.Drawing.Size(265, 27); toolStrip1.TabIndex = 2; toolStrip1.Text = "toolStrip1"; // - // toolStripLabel1 - // - toolStripLabel1.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - toolStripLabel1.Image = Properties.Resources.plus; - toolStripLabel1.Name = "toolStripLabel1"; - toolStripLabel1.Padding = new System.Windows.Forms.Padding(5, 0, 5, 0); - toolStripLabel1.Size = new System.Drawing.Size(34, 24); - toolStripLabel1.Text = "Remove Selected Plate"; - toolStripLabel1.Click += toolStripLabel1_Click; - // - // toolStripSeparator3 - // - toolStripSeparator3.Name = "toolStripSeparator3"; - toolStripSeparator3.Size = new System.Drawing.Size(6, 27); - // // toolStripLabel2 // toolStripLabel2.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; @@ -346,8 +329,6 @@ private System.Windows.Forms.ToolStripButton editDrawingsButton; private System.Windows.Forms.ToolStripButton toolStripButton3; private System.Windows.Forms.ToolStripButton hideNestedButton; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; - private System.Windows.Forms.ToolStripButton toolStripLabel1; private System.Windows.Forms.ToolStripButton toolStripLabel2; } } diff --git a/OpenNest/Forms/EditNestForm.PlateOrder.cs b/OpenNest/Forms/EditNestForm.PlateOrder.cs index 2b7bc955..c4fd8388 100644 --- a/OpenNest/Forms/EditNestForm.PlateOrder.cs +++ b/OpenNest/Forms/EditNestForm.PlateOrder.cs @@ -5,7 +5,8 @@ using System.Windows.Forms; namespace OpenNest.Forms { // Reordering plates in the Plates list: drag a row to a new position, or Alt+Up/Alt+Down. - // Ctrl+drag drops a copy of the plate instead, as does Duplicate Plate on the row's menu. + // Ctrl+drag drops a copy of the plate instead, as does Duplicate Plate on the row's menu; + // Delete Plate on the same menu removes it. // The trailing empty new-plate sentinel stays last and cannot be dragged. public partial class EditNestForm { @@ -46,12 +47,16 @@ namespace OpenNest.Forms platesListView.Controls.Add(plateDropIndicator); var duplicateItem = new ToolStripMenuItem("Duplicate Plate", null, (sender, e) => DuplicateCurrentPlate()); + var deleteItem = new ToolStripMenuItem("Delete Plate", null, (sender, e) => RemoveCurrentPlate()); + deleteItem.Name = "deletePlateMenuItem"; var menu = new ContextMenuStrip(); menu.Items.Add(duplicateItem); + menu.Items.Add(deleteItem); menu.Opening += (sender, e) => { var index = PlateManager.CurrentIndex; duplicateItem.Enabled = !IsInspecting && PlateManager.CanDuplicatePlate(index, index + 1); + deleteItem.Enabled = !IsInspecting && PlateManager.CanRemoveCurrent; }; platesListView.ContextMenuStrip = menu; } diff --git a/OpenNest/Forms/EditNestForm.cs b/OpenNest/Forms/EditNestForm.cs index d20b2f72..564e7519 100644 --- a/OpenNest/Forms/EditNestForm.cs +++ b/OpenNest/Forms/EditNestForm.cs @@ -1396,11 +1396,6 @@ namespace OpenNest.Forms #region Plates/Drawings Panel Events - private void AddPlate_Click(object sender, EventArgs e) - { - AddPlate(); - } - private void EditSelectedPlate_Click(object sender, EventArgs e) { if (platesListView.SelectedIndices.Count != 0) @@ -1973,10 +1968,5 @@ namespace OpenNest.Forms { RemoveSelectedPlate_Click(sender, e); } - - private void toolStripLabel1_Click(object sender, EventArgs e) - { - AddPlate_Click(sender, e); - } } } diff --git a/OpenNest/Forms/MainForm.Designer.cs b/OpenNest/Forms/MainForm.Designer.cs index f66db614..66a99d40 100644 --- a/OpenNest/Forms/MainForm.Designer.cs +++ b/OpenNest/Forms/MainForm.Designer.cs @@ -129,9 +129,6 @@ namespace OpenNest.Forms mnuPlateEdit = new System.Windows.Forms.ToolStripMenuItem(); mnuPlateSetAsDefault = new System.Windows.Forms.ToolStripMenuItem(); toolStripMenuItem18 = new System.Windows.Forms.ToolStripSeparator(); - mnuPlateAdd = new System.Windows.Forms.ToolStripMenuItem(); - mnuPlateRemove = new System.Windows.Forms.ToolStripMenuItem(); - toolStripMenuItem16 = new System.Windows.Forms.ToolStripSeparator(); mnuPlateRotate = new System.Windows.Forms.ToolStripMenuItem(); mnuPlateRotateCw = new System.Windows.Forms.ToolStripMenuItem(); mnuPlateRotateCcw = new System.Windows.Forms.ToolStripMenuItem(); @@ -850,7 +847,7 @@ namespace OpenNest.Forms // // mnuPlate // - mnuPlate.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { mnuPlateEdit, mnuPlateSetAsDefault, toolStripMenuItem18, mnuPlateAdd, mnuPlateRemove, toolStripMenuItem16, mnuPlateCutOff, mnuPlateTrimExtendCutOff, mnuPlateAutomaticCutOff, mnuPlateEditClamps, mnuPlateRotate, mnuResizeToFitParts, toolStripMenuItem13, mnuPlateArrange, mnuSequenceParts, calculateCutTimeToolStripMenuItem1, mnuPlateSimulateCutting, toolStripMenuItem21, mnuPlatePlanCutting, mnuPlatePlaceLeadIn, mnuPlateRemoveLeadIns, toolStripMenuItem20, mnuPlateViewInCad }); + mnuPlate.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { mnuPlateEdit, mnuPlateSetAsDefault, toolStripMenuItem18, mnuPlateCutOff, mnuPlateTrimExtendCutOff, mnuPlateAutomaticCutOff, mnuPlateEditClamps, mnuPlateRotate, mnuResizeToFitParts, toolStripMenuItem13, mnuPlateArrange, mnuSequenceParts, calculateCutTimeToolStripMenuItem1, mnuPlateSimulateCutting, toolStripMenuItem21, mnuPlatePlanCutting, mnuPlatePlaceLeadIn, mnuPlateRemoveLeadIns, toolStripMenuItem20, mnuPlateViewInCad }); mnuPlate.Name = "mnuPlate"; mnuPlate.Size = new System.Drawing.Size(45, 20); mnuPlate.Text = "&Plate"; @@ -873,27 +870,6 @@ namespace OpenNest.Forms // toolStripMenuItem18.Name = "toolStripMenuItem18"; toolStripMenuItem18.Size = new System.Drawing.Size(174, 6); - // - // mnuPlateAdd - // - mnuPlateAdd.Image = Properties.Resources.add; - mnuPlateAdd.Name = "mnuPlateAdd"; - mnuPlateAdd.Size = new System.Drawing.Size(177, 22); - mnuPlateAdd.Text = "Add"; - mnuPlateAdd.Click += AddPlate_Click; - // - // mnuPlateRemove - // - mnuPlateRemove.Image = Properties.Resources.remove; - mnuPlateRemove.Name = "mnuPlateRemove"; - mnuPlateRemove.Size = new System.Drawing.Size(177, 22); - mnuPlateRemove.Text = "Remove"; - mnuPlateRemove.Click += RemovePlate_Click; - // - // toolStripMenuItem16 - // - toolStripMenuItem16.Name = "toolStripMenuItem16"; - toolStripMenuItem16.Size = new System.Drawing.Size(174, 6); // // mnuPlateCutOff // @@ -1572,7 +1548,6 @@ namespace OpenNest.Forms private System.Windows.Forms.ToolStripSeparator toolStripMenuItem13; private System.Windows.Forms.ToolStripMenuItem mnuPlateViewInCad; private System.Windows.Forms.ToolStripButton btnNew; - private System.Windows.Forms.ToolStripMenuItem mnuPlateAdd; private System.Windows.Forms.ToolStripMenuItem mnuNestRemoveEmptyPlates; private System.Windows.Forms.ToolStripMenuItem mnuNestClear; private System.Windows.Forms.ToolStripMenuItem mnuViewZoomIn; @@ -1582,11 +1557,9 @@ namespace OpenNest.Forms private System.Windows.Forms.ToolStripMenuItem mnuSetRotationIncrement; private System.Windows.Forms.ToolStripSeparator toolStripMenuItem15; private System.Windows.Forms.ToolStripMenuItem mnuPlateSetAsDefault; - private System.Windows.Forms.ToolStripSeparator toolStripMenuItem16; private System.Windows.Forms.ToolStripStatusLabel statusLabel1; private System.Windows.Forms.ToolStripStatusLabel spacerLabel; private System.Windows.Forms.ToolStripSeparator toolStripMenuItem18; - private System.Windows.Forms.ToolStripMenuItem mnuPlateRemove; private System.Windows.Forms.ToolStripButton btnSave; private System.Windows.Forms.ToolStripSeparator toolStripMenuItem19; private System.Windows.Forms.ToolStripMenuItem calculateCutTimeToolStripMenuItem; diff --git a/OpenNest/Forms/MainForm.File.cs b/OpenNest/Forms/MainForm.File.cs index e7aaeb2c..aaf9e889 100644 --- a/OpenNest/Forms/MainForm.File.cs +++ b/OpenNest/Forms/MainForm.File.cs @@ -30,7 +30,6 @@ namespace OpenNest.Forms { NavigationEnableCheck(); statusBar.UpdatePlate(); - mnuPlateRemove.Enabled = activeForm?.PlateManager.CanRemoveCurrent ?? false; mnuNestClear.Enabled = activeForm?.PlateManager.CanClearAll ?? false; }; editForm.WindowState = windowState; diff --git a/OpenNest/Forms/MainForm.Plate.cs b/OpenNest/Forms/MainForm.Plate.cs index 7bd13992..cf47cf8e 100644 --- a/OpenNest/Forms/MainForm.Plate.cs +++ b/OpenNest/Forms/MainForm.Plate.cs @@ -16,18 +16,8 @@ namespace OpenNest.Forms SaveCurrentAsDefaults_Click(sender, e); } - private void AddPlate_Click(object sender, EventArgs e) - { - if (activeForm == null) - return; - activeForm.AddPlate(); - NavigationEnableCheck(); - } - private void EditPlate_Click(object sender, EventArgs e) => WithActive(f => f.EditPlate()); - private void RemovePlate_Click(object sender, EventArgs e) => WithActive(f => f.RemoveCurrentPlate()); - private void ResizeToFitParts_Click(object sender, EventArgs e) { if (activeForm == null)