Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Keysigs on section break #25260

Draft
wants to merge 3 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 51 additions & 0 deletions src/engraving/dom/edit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6151,6 +6151,19 @@ void Score::undoAddElement(EngravingItem* element, bool addToLinkedStaves, bool
if (lb->layoutBreakType() == LayoutBreakType::SECTION) {
doUndoAddElement(lb);
MeasureBase* m = lb->measure();

// add Key Signature on Section Break
Fraction tick = m->endTick();
int ticks = tick.ticks();
for (Staff* staff : score()->staves()) {
KeyList* kl = staff->keyList();
KeySigEvent ks = kl->key(ticks);
if (kl->currentKeyTick(ticks) != ticks || ks.forInstrumentChange()) {
ks.setForInstrumentChange(false);
ks.setForSectionBreak(true);
undoChangeKeySig(staff, tick, ks);
}
}
if (m->isBox()) {
// for frames, use linked frames
LinkedObjects* links = m->links();
Expand Down Expand Up @@ -6973,6 +6986,44 @@ void Score::undoRemoveElement(EngravingItem* element, bool removeLinked)
}
}

// remove section break key signatures
if (element->isLayoutBreak() && toLayoutBreak(element)->isSectionBreak()) {
MeasureBase* mb = element->findMeasureBase();
Measure* nextMeasure = mb ? mb->nextMeasure() : nullptr;
if (nextMeasure && nextMeasure->isMMRest()) {
nextMeasure = nextMeasure->mmRestFirst();
}
Segment* keySeg = nextMeasure ? nextMeasure->findFirstR(SegmentType::KeySig, Fraction(0, 1)) : nullptr;
if (keySeg) {
for (staff_idx_t i = 0; i <= nstaves(); i++) {
KeySig* ks = toKeySig(keySeg->element(i * VOICES));
if (ks && ks->forSectionBreak()) {
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
bool isFirst = ks->tick().isZero(); // this should never happen, but to be sure

// 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);
}
}
}
}
}

for (Segment* s : segments) {
if (s->empty()) {
if (s->header() || s->trailer()) { // probably more segment types (system header)
Expand Down
3 changes: 3 additions & 0 deletions src/engraving/dom/key.h
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,8 @@ class KeySigEvent
bool isAtonal() const { return m_mode == KeyMode::NONE; }
void setForInstrumentChange(bool forInstrumentChange) { m_forInstrumentChange = forInstrumentChange; }
bool forInstrumentChange() const { return m_forInstrumentChange; }
void setForSectionBreak(bool forSectionBreak) { m_forSectionBreak = forSectionBreak; }
bool forSectionBreak() const { return m_forSectionBreak; }
void initFromSubtype(int); // for backward compatibility
int degInKey(int degree) const; // return "absolute degree"
SymId symInKey(SymId sym, int degree) const;
Expand All @@ -97,6 +99,7 @@ class KeySigEvent
KeyMode m_mode = KeyMode::UNKNOWN;
bool m_custom = false;
bool m_forInstrumentChange = false;
bool m_forSectionBreak = false;
std::vector<CustDef> m_customKeyDefs;
};

Expand Down
3 changes: 3 additions & 0 deletions src/engraving/dom/keysig.h
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,9 @@ class KeySig final : public EngravingItem
void setForInstrumentChange(bool forInstrumentChange) { m_sig.setForInstrumentChange(forInstrumentChange); }
bool forInstrumentChange() const { return m_sig.forInstrumentChange(); }

void setForSectionBreak(bool forSectionBreak) { m_sig.setForSectionBreak(forSectionBreak); }
bool forSectionBreak() const { return m_sig.forSectionBreak(); }

PropertyValue getProperty(Pid propertyId) const override;
bool setProperty(Pid propertyId, const PropertyValue&) override;
PropertyValue propertyDefault(Pid id) const override;
Expand Down