diff --git a/src/bank_panel.cpp b/src/bank_panel.cpp index c7327c8..37219d0 100644 --- a/src/bank_panel.cpp +++ b/src/bank_panel.cpp @@ -1180,14 +1180,11 @@ bool regionAt(int x, int y, Region& out) { // --- Bank management ops (id-keyed; drive the B1 model + persist) -------------- // -// Each op mutates g_session.book() then persists via saveToActiveProject(). After a +// Each op mutates g_session.book() then persists via persistBankOp(). After a // STRUCTURAL mutation (create/delete/evacuate) any Bank*/BankIndex& is invalid — we -// resolve fresh, pass ids, and let the next refreshFingerprint repaint. persistBook -// no-ops on an unsaved project (matches the capture/B3 quiet-persist idiom). - -void persistBook() { - if (g_panel.session) g_panel.session->saveToActiveProject(); -} +// resolve fresh, pass ids, and let the next refreshFingerprint repaint. On an +// unsaved project the empty-close discard in persistBankOp ensures no stale state +// survives (matches the capture/B3 quiet-persist idiom). // REAPER's stock single-line input (comma-safe via the \x1f return separator, as B3). bool promptText(const char* title, const char* caption, const std::string& initial, @@ -1319,9 +1316,11 @@ void transferSamples(const std::vector& sampleIds, : book()->moveSample(sid, srcBankId, destBankId); switch (r) { case TransferResult::Moved: - case TransferResult::Copied: ++ok; break; - case TransferResult::Collapsed: ++collapsed; break; - default: break; + case TransferResult::Copied: ++ok; break; + case TransferResult::Collapsed: ++collapsed; break; + case TransferResult::RejectedUnknownBank: + case TransferResult::RejectedSampleAbsent: + case TransferResult::RejectedSameBank: break; } } const bool mutated = copy ? (ok > 0) : (ok > 0 || collapsed > 0);