Skip to content

Commit

Permalink
Merge pull request #4669 from MarcSabatella/280390-keysig-transpose
Browse files Browse the repository at this point in the history
fix #280390: spurious keychange on each system on transpose
  • Loading branch information
anatoly-os committed Mar 9, 2019
1 parent 72641f6 commit c5c83a5
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 2 deletions.
12 changes: 12 additions & 0 deletions libmscore/keysig.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -516,6 +516,18 @@ bool KeySig::operator==(const KeySig& k) const
return _sig == k._sig;
}

//---------------------------------------------------------
// isChange
//---------------------------------------------------------

bool KeySig::isChange() const
{
if (!staff())
return false;
int keyTick = tick();
return staff()->currentKeyTick(keyTick) == keyTick;
}

//---------------------------------------------------------
// changeKeySigEvent
//---------------------------------------------------------
Expand Down
1 change: 1 addition & 0 deletions libmscore/keysig.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ class KeySig final : public Element {
Q_INVOKABLE Key key() const { return _sig.key(); }
bool isCustom() const { return _sig.custom(); }
bool isAtonal() const { return _sig.isAtonal(); }
bool isChange() const;
KeySigEvent keySigEvent() const { return _sig; }
bool operator==(const KeySig&) const;
void changeKeySigEvent(const KeySigEvent&);
Expand Down
3 changes: 2 additions & 1 deletion libmscore/layout.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1964,7 +1964,8 @@ void Score::createMMRest(Measure* m, Measure* lm, const Fraction& len)
}
else {
if (!(nts->keySigEvent() == ts->keySigEvent())) {
undo(new ChangeKeySig(nts, ts->keySigEvent(), nts->showCourtesy()));
bool addKey = ts->isChange();
undo(new ChangeKeySig(nts, ts->keySigEvent(), nts->showCourtesy(), addKey));
}
}
}
Expand Down
4 changes: 3 additions & 1 deletion libmscore/transpose.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -422,14 +422,16 @@ bool Score::transpose(TransposeMode mode, TransposeDirection direction, Key trKe
}
}
else if (e->isKeySig() && trKeys && mode != TransposeMode::DIATONICALLY) {
bool startKey = segment->tick() == s1->tick();
QList<ScoreElement*> ll = e->linkList();
for (ScoreElement* scoreElement : ll) {
KeySig* ks = toKeySig(scoreElement);
bool addKey = ks->isChange();
if (!ks->isCustom() && !ks->isAtonal()) {
Key nKey = transposeKey(ks->key(), interval);
KeySigEvent ke = ks->keySigEvent();
ke.setKey(nKey);
undo(new ChangeKeySig(ks, ke, ks->showCourtesy()));
undo(new ChangeKeySig(ks, ke, ks->showCourtesy(), startKey || addKey));
}
}
}
Expand Down

0 comments on commit c5c83a5

Please sign in to comment.