From 02df82ca31b055452c2d1e6c5101f98eda1d8d70 Mon Sep 17 00:00:00 2001 From: sammik Date: Mon, 21 Oct 2024 02:33:04 +0200 Subject: [PATCH] Handle instrument changes --- src/engraving/dom/edit.cpp | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/engraving/dom/edit.cpp b/src/engraving/dom/edit.cpp index 21d84aefe8d5c..0461199602780 100644 --- a/src/engraving/dom/edit.cpp +++ b/src/engraving/dom/edit.cpp @@ -2789,7 +2789,22 @@ void Score::deleteItem(EngravingItem* el) // remove section break key signatures bool isFirst = mb && mb->tick().isZero(); for (KeySig* ks : lb->keySigs()) { - if (isFirst) { + Staff* staff = ks->staff(); + Fraction tick = ks->tick(); + KeySigEvent actualKey = ks->keySigEvent(); + KeySigEvent prevKey = staff->prevKey(tick); + + // do not remove keysig on first measure, or if signatures differ + + // if previous signature is "forInstrumentChange", + // comparation returns false, even if they are otherwise identical + // (because one is forInstrumentChange and second not) + // so we need to remove "forInstrumentChange" flag first + if (prevKey.forInstrumentChange()) { + prevKey.setForInstrumentChange(false); + } + + if (isFirst || actualKey != prevKey) { ks->setForSectionBreak(false); } else { deleteItem(ks); @@ -6037,13 +6052,13 @@ void Score::undoAddElement(EngravingItem* element, bool addToLinkedStaves, bool MeasureBase* m = lb->measure(); // add Key Signature on Section Break - // TODO: special case for instrument change Fraction tick = m->endTick(); int ticks = tick.ticks(); for (Staff* staff : score()->staves()) { KeyList* kl = staff->keyList(); - if (kl->currentKeyTick(ticks) != ticks) { - KeySigEvent ks = kl->key(ticks); + KeySigEvent ks = kl->key(ticks); + if (kl->currentKeyTick(ticks) != ticks || ks.forInstrumentChange()) { + ks.setForInstrumentChange(false); ks.setForSectionBreak(true); undoChangeKeySig(staff, tick, ks); }