Restructure project layout to flatten directory structure

Move all projects from Source/ to repository root for simpler navigation.
- Remove External/ dependency DLLs (will use NuGet packages)
- Remove Installer/ NSIS script
- Replace PartCollection/PlateCollection with ObservableList
- Add packages.config for NuGet dependencies

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-27 20:29:12 -05:00
parent 8367d9f400
commit 2d956fd3f7
189 changed files with 374 additions and 621 deletions
+120
View File
@@ -0,0 +1,120 @@
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;
using OpenNest.Controls;
namespace OpenNest.Actions
{
[DisplayName("Clone Parts")]
public class ActionClone : Action
{
private readonly List<LayoutPart> parts;
private double lastScale;
public ActionClone(PlateView plateView, List<Part> partsToClone)
: base(plateView)
{
plateView.KeyDown += plateView_KeyDown;
plateView.MouseMove += plateView_MouseMove;
plateView.MouseDown += plateView_MouseDown;
plateView.Paint += plateView_Paint;
parts = new List<LayoutPart>();
lastScale = double.NaN;
for (int i = 0; i < partsToClone.Count; i++)
{
var part = LayoutPart.Create(partsToClone[i].Clone() as Part, plateView);
part.IsSelected = true;
parts.Add(part);
}
plateView.SelectedParts.Clear();
plateView.SelectedParts.AddRange(parts);
}
private void plateView_MouseDown(object sender, MouseEventArgs e)
{
switch (e.Button)
{
case MouseButtons.Left:
Apply();
break;
}
}
private void plateView_KeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyCode)
{
case Keys.F1:
case Keys.Enter:
Apply();
break;
}
}
private void plateView_Paint(object sender, PaintEventArgs e)
{
if (plateView.ViewScale != lastScale)
{
parts.ForEach(p =>
{
p.Update(plateView);
p.Draw(e.Graphics);
});
}
else
{
parts.ForEach(p =>
{
if (p.IsDirty)
p.Update(plateView);
p.Draw(e.Graphics);
});
}
lastScale = plateView.ViewScale;
}
private void plateView_MouseMove(object sender, MouseEventArgs e)
{
var offset = plateView.CurrentPoint - parts.GetBoundingBox().Location;
parts.ForEach(p => p.Offset(offset));
plateView.Invalidate();
}
public override void DisconnectEvents()
{
plateView.KeyDown -= plateView_KeyDown;
plateView.MouseMove -= plateView_MouseMove;
plateView.MouseDown -= plateView_MouseDown;
plateView.Paint -= plateView_Paint;
plateView.SelectedParts.Clear();
plateView.Invalidate();
}
public override void CancelAction()
{
}
public override bool IsBusy()
{
return false;
}
public void Apply()
{
if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift)
{
plateView.PushSelected(PushDirection.Left);
plateView.PushSelected(PushDirection.Down);
}
parts.ForEach(p => plateView.Plate.Parts.Add(p.BasePart.Clone() as Part));
}
}
}