From 37d7601ab64e0dd22ca3e579c3b8332d32c41b9a Mon Sep 17 00:00:00 2001 From: skal Date: Wed, 18 Feb 2026 17:28:38 +0100 Subject: feat(mq_editor): add new partial, undo/redo - '+ Partial' button (N key): insert 440Hz/max-amp partial at front - Undo/Redo buttons (Ctrl+Z/Y): JSON snapshot stack, 50 levels - Hooks in delete, mute, curve edits, amp drag, freq drag handoff(Gemini): undo/redo + new-partial added to mq_editor Co-Authored-By: Claude Sonnet 4.6 --- tools/mq_editor/viewer.js | 2 ++ 1 file changed, 2 insertions(+) (limited to 'tools/mq_editor/viewer.js') diff --git a/tools/mq_editor/viewer.js b/tools/mq_editor/viewer.js index 723a585..46876c1 100644 --- a/tools/mq_editor/viewer.js +++ b/tools/mq_editor/viewer.js @@ -53,6 +53,7 @@ class SpectrogramViewer { this.dragState = null; // {pointIndex: 0-3} this.onPartialSelect = null; // callback(index) this.onRender = null; // callback() called after each render (for synced panels) + this.onBeforeChange = null; // callback() called before any mutation (for undo/redo) // Setup event handlers this.setupMouseHandlers(); @@ -569,6 +570,7 @@ class SpectrogramViewer { companionOff = { dt: curve.t1 - curve.t0, dv: curve.v1 - curve.v0 }; else if (ptIdx === 3) companionOff = { dt: curve.t2 - curve.t3, dv: curve.v2 - curve.v3 }; + if (this.onBeforeChange) this.onBeforeChange(); this.dragState = { pointIndex: ptIdx, companionOff }; canvas.style.cursor = 'grabbing'; e.preventDefault(); -- cgit v1.2.3