Skip to content

Commit

Permalink
Merge pull request #3630 from mattmcclinch/271299-multiple-clefs
Browse files Browse the repository at this point in the history
fix #271299: Errors with multiple clefs
  • Loading branch information
anatoly-os committed Jun 2, 2018
2 parents 2efda40 + 97b967f commit 59570e3
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 7 deletions.
14 changes: 9 additions & 5 deletions libmscore/staff.cpp
Expand Up @@ -265,8 +265,10 @@ void Staff::setClef(Clef* clef)
if (clef->generated())
return;
int tick = clef->segment()->tick();
for (Segment* s = clef->segment()->next(); s && s->tick() == tick; s = s->next()) {
if (s->segmentType() == Segment::Type::Clef && s->element(clef->track())) {
for (Segment* s = clef->segment()->next1(); s && s->tick() == tick; s = s->next1()) {
if (s->segmentType() == Segment::Type::Clef
&& s->element(clef->track())
&& !s->element(clef->track())->generated()) {
// adding this clef has no effect on the clefs list
return;
}
Expand All @@ -284,14 +286,16 @@ void Staff::removeClef(Clef* clef)
if (clef->generated())
return;
int tick = clef->segment()->tick();
for (Segment* s = clef->segment()->next(); s && s->tick() == tick; s = s->next()) {
if (s->segmentType() == Segment::Type::Clef && s->element(clef->track())) {
for (Segment* s = clef->segment()->next1(); s && s->tick() == tick; s = s->next1()) {
if (s->segmentType() == Segment::Type::Clef
&& s->element(clef->track())
&& !s->element(clef->track())->generated()) {
// removal of this clef has no effect on the clefs list
return;
}
}
clefs.erase(clef->segment()->tick());
for (Segment* s = clef->segment()->prev(); s && s->tick() == tick; s = s->prev()) {
for (Segment* s = clef->segment()->prev1(); s && s->tick() == tick; s = s->prev1()) {
if (s->segmentType() == Segment::Type::Clef
&& s->element(clef->track())
&& !s->element(clef->track())->generated()) {
Expand Down
5 changes: 3 additions & 2 deletions libmscore/undo.cpp
Expand Up @@ -538,8 +538,9 @@ void Score::undoChangeClef(Staff* ostaff, Segment* seg, ClefType st)

// move measure-initial clef to last segment of prev measure

if (firstSeg // if at start of measure
&& measure->prevMeasure() // and there is a previous measure
if ((firstSeg // if at start of measure
&& measure->prevMeasure()) // and there is a previous measure
|| tick == seg->measure()->endTick()
) {
measure = measure->prevMeasure();
destSeg = measure->findSegment(Segment::Type::Clef, tick);
Expand Down

0 comments on commit 59570e3

Please sign in to comment.