Branch: m6-move-copy-swap → main
Pads can be moved, copied and swapped, across banks:
Recorded-notes warning (build plan M6, format doc section 3). Notes point at a slot, not a sample, so they stay where they are. Before any move, swap or copy that changes what a pad with notes will play, a dialog lists each such pad and what its notes will play afterwards. Pads without notes get no dialog. Copying onto a filled pad also asks first. Pads with notes show a notes badge in the grid and a note in the settings panel.
Load (brought forward from M8). M6's done-when needs a project with notes, and only the device makes those, so the app needs Load now. Load opens a .xpj (the name comes from the file, samples from its _[ProjectData] folder) and reports firmware or version warnings. New and Load ask before discarding unsaved changes. M8 keeps missing-file badges, the window-close prompt and the other guard rails.
Go service: MovePad, CopyPad, SwapPads, Load (dialog) and LoadPath. The Dialogs interface gains OpenProject.
On the server: go vet and go test ./... pass. New service tests cover move/copy/swap across banks (tuning carried, sample shared, move onto a filled pad, out-of-range slot), and Load: cancelled dialog, DemoFile (name, 6 samples, notes on A01–A04 only, preview URL, 2 sequences), and a bad file keeping the current project.
The frontend is untested here (no Node). On the laptop (create C:\temp\m6 first):
npm run check in frontend: 0 errors, 0 warnings.wails3 dev, Load testdata\device\DemoFile.xpj. A01–A04 show notes; B01 and B02 don't. Pads play when clicked.Rename to UiMoves, Export to folder C:\temp\m6. Then:
go run ./cmd/mpckit-cli -load testdata\device\DemoFile.xpj -name CliMoves -out C:\temp\m6 -move "A1:C1" -copy "B1:D5" -swap "A2:B2"
go run ./tools/xpjdiff C:\temp\m6\UiMoves.xpj C:\temp\m6\CliMoves.xpj
prints identical. (M6 done-when: all three across banks.)
Buttons: select C01, Copy to pad → bank A, pad A03 (shows the hat): the button reads "Copy and replace". The warning lists A03's notes. Move to pad onto an empty pad moves it.
Unsaved changes: after any edit, New asks to discard; Cancel keeps the project.