From f2092fa93122f07bc12f1488cf8669e95ef1f438 Mon Sep 17 00:00:00 2001 From: Matt McClinch Date: Sun, 11 Apr 2021 12:19:24 +0200 Subject: [PATCH] Fix #301016: Copying a partial measure leaves rest(s) missing in voices 2-4 Resolves: https://musescore.org/en/node/301016. Rebased version of #5702 --- src/libmscore/check.cpp | 8 ++++---- src/libmscore/measure.h | 4 ++-- src/libmscore/paste.cpp | 2 +- src/libmscore/tests/copypaste_data/copypaste14-ref.mscx | 3 +++ src/libmscore/tests/copypaste_data/copypaste15-ref.mscx | 3 +++ src/libmscore/tests/copypaste_data/copypaste16-ref.mscx | 3 +++ src/libmscore/tests/copypaste_data/copypaste21-ref.mscx | 3 +++ .../tests/copypaste_data/copypaste_tremolo-ref.mscx | 6 ++++++ 8 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/libmscore/check.cpp b/src/libmscore/check.cpp index ccee0f7c3d0a..b71dc5c486a0 100644 --- a/src/libmscore/check.cpp +++ b/src/libmscore/check.cpp @@ -334,7 +334,7 @@ bool Score::checkClefs() // fillGap //--------------------------------------------------------- -void Measure::fillGap(const Fraction& pos, const Fraction& len, int track, const Fraction& stretch) +void Measure::fillGap(const Fraction& pos, const Fraction& len, int track, const Fraction& stretch, bool useGapRests) { qDebug("measure %6d pos %d, len %d/%d, stretch %d/%d track %d", tick().ticks(), @@ -349,7 +349,7 @@ void Measure::fillGap(const Fraction& pos, const Fraction& len, int track, const rest->setTicks(len); rest->setDurationType(d); rest->setTrack(track); - rest->setGap(true); + rest->setGap(useGapRests); score()->undoAddCR(rest, this, (pos / stretch) + tick()); } } @@ -361,7 +361,7 @@ void Measure::fillGap(const Fraction& pos, const Fraction& len, int track, const // with invisible rests //--------------------------------------------------------- -void Measure::checkMeasure(int staffIdx) +void Measure::checkMeasure(int staffIdx, bool useGapRests) { if (isMMRest()) { return; @@ -392,7 +392,7 @@ void Measure::checkMeasure(int staffIdx) } else if (currentPos > expectedPos) { qDebug("in measure underrun %6d at %d-%d track %d", tick().ticks(), (currentPos / stretch).ticks(), (expectedPos / stretch).ticks(), track); - fillGap(expectedPos, currentPos - expectedPos, track, stretch); + fillGap(expectedPos, currentPos - expectedPos, track, stretch, useGapRests); } DurationElement* de = cr; diff --git a/src/libmscore/measure.h b/src/libmscore/measure.h index de64a2319655..c6bb60edb73a 100644 --- a/src/libmscore/measure.h +++ b/src/libmscore/measure.h @@ -147,7 +147,7 @@ class Measure final : public MeasureBase void writeBox(XmlWriter&) const; void readBox(XmlReader&); bool isEditable() const override { return false; } - void checkMeasure(int idx); + void checkMeasure(int idx, bool useGapRests = true); void add(Element*) override; void remove(Element*) override; @@ -334,7 +334,7 @@ class Measure final : public MeasureBase void push_back(Segment* e); void push_front(Segment* e); - void fillGap(const Fraction& pos, const Fraction& len, int track, const Fraction& stretch); + void fillGap(const Fraction& pos, const Fraction& len, int track, const Fraction& stretch, bool useGapRests = true); void computeMinWidth(Segment* s, qreal x, bool isSystemHeader); void readVoice(XmlReader& e, int staffIdx, bool irregular); diff --git a/src/libmscore/paste.cpp b/src/libmscore/paste.cpp index 67cacb0da53c..7c201ee46b9d 100644 --- a/src/libmscore/paste.cpp +++ b/src/libmscore/paste.cpp @@ -499,7 +499,7 @@ bool Score::pasteStaff(XmlReader& e, Segment* dst, int dstStaff, Fraction scale) Measure* endM = tick2measure(dstTick + tickLen); for (int i = dstStaff; i < endStaff; i++) { for (Measure* m = dstM; m && m != endM->nextMeasure(); m = m->nextMeasure()) { - m->checkMeasure(i); + m->checkMeasure(i, false); } } _selection.setRangeTicks(dstTick, dstTick + tickLen, dstStaff, endStaff); diff --git a/src/libmscore/tests/copypaste_data/copypaste14-ref.mscx b/src/libmscore/tests/copypaste_data/copypaste14-ref.mscx index 183dd968e2c6..9978b92037a4 100644 --- a/src/libmscore/tests/copypaste_data/copypaste14-ref.mscx +++ b/src/libmscore/tests/copypaste_data/copypaste14-ref.mscx @@ -180,6 +180,9 @@ 14 + + half + diff --git a/src/libmscore/tests/copypaste_data/copypaste15-ref.mscx b/src/libmscore/tests/copypaste_data/copypaste15-ref.mscx index 84e4cef21ff9..61ebea5e5a0e 100644 --- a/src/libmscore/tests/copypaste_data/copypaste15-ref.mscx +++ b/src/libmscore/tests/copypaste_data/copypaste15-ref.mscx @@ -180,6 +180,9 @@ 18 + + half + diff --git a/src/libmscore/tests/copypaste_data/copypaste16-ref.mscx b/src/libmscore/tests/copypaste_data/copypaste16-ref.mscx index d3ef5d90deb3..a0daf5af97d2 100644 --- a/src/libmscore/tests/copypaste_data/copypaste16-ref.mscx +++ b/src/libmscore/tests/copypaste_data/copypaste16-ref.mscx @@ -163,6 +163,9 @@ 18 + + half + diff --git a/src/libmscore/tests/copypaste_data/copypaste21-ref.mscx b/src/libmscore/tests/copypaste_data/copypaste21-ref.mscx index bc72817aacd6..580b348094e6 100644 --- a/src/libmscore/tests/copypaste_data/copypaste21-ref.mscx +++ b/src/libmscore/tests/copypaste_data/copypaste21-ref.mscx @@ -178,6 +178,9 @@ 18 + + half + diff --git a/src/libmscore/tests/copypaste_data/copypaste_tremolo-ref.mscx b/src/libmscore/tests/copypaste_data/copypaste_tremolo-ref.mscx index ed5e97f821ad..4f198127e6c2 100644 --- a/src/libmscore/tests/copypaste_data/copypaste_tremolo-ref.mscx +++ b/src/libmscore/tests/copypaste_data/copypaste_tremolo-ref.mscx @@ -178,6 +178,9 @@ 18 + + half + @@ -229,6 +232,9 @@ 13 + + quarter +