diff --git a/libmscore/measure.cpp b/libmscore/measure.cpp index bf4140bd44a55..b26cbe90a1966 100644 --- a/libmscore/measure.cpp +++ b/libmscore/measure.cpp @@ -1561,11 +1561,11 @@ void Measure::adjustToLen(Fraction nf) } } } - Score* s = score()->rootScore(); - Measure* m = this; - int staves = s->nstaves(); + Score* s = score()->rootScore(); + Measure* m = this; + QList sl = s->uniqueStaves(); - for (int staffIdx = 0; staffIdx < staves; ++staffIdx) { + for (int staffIdx : sl) { int rests = 0; int chords = 0; Rest* rest = 0; diff --git a/libmscore/score.cpp b/libmscore/score.cpp index e90f4fcf98769..78bfff62a9576 100644 --- a/libmscore/score.cpp +++ b/libmscore/score.cpp @@ -3511,5 +3511,31 @@ void Score::setPos(POS pos, int tick) } } +//--------------------------------------------------------- +// uniqueStaves +//--------------------------------------------------------- + +QList Score::uniqueStaves() const + { + QList sl; + + for (int staffIdx = 0; staffIdx < nstaves(); ++staffIdx) { + Staff* s = staff(staffIdx); + if (s->linkedStaves()) { + bool alreadyInList = false; + for (int idx : sl) { + if (s->linkedStaves()->staves().contains(staff(idx))) { + alreadyInList = true; + break; + } + } + if (alreadyInList) + continue; + } + sl.append(staffIdx); + } + return sl; + } + } diff --git a/libmscore/score.h b/libmscore/score.h index 190c4e3d64095..d3d847200a6d1 100644 --- a/libmscore/score.h +++ b/libmscore/score.h @@ -951,6 +951,8 @@ class Score : public QObject { qreal noteHeadWidth() const { return _noteHeadWidth; } void setNoteHeadWidth( qreal n) { _noteHeadWidth = n; } + QList uniqueStaves() const; + friend class ChangeSynthesizerState; friend class Chord; }; diff --git a/libmscore/staff.cpp b/libmscore/staff.cpp index a4b8b3e9c58be..28cc6e0b16614 100644 --- a/libmscore/staff.cpp +++ b/libmscore/staff.cpp @@ -605,6 +605,8 @@ void Staff::linkTo(Staff* staff) } else { _linkedStaves->add(staff); + if (!staff->linkedStaves()) + staff->_linkedStaves = _linkedStaves; } } diff --git a/mscore/file.cpp b/mscore/file.cpp index ebfa772a79a74..c772081e71be8 100644 --- a/mscore/file.cpp +++ b/mscore/file.cpp @@ -582,6 +582,9 @@ void MuseScore::newFile() continue; Measure* measure = static_cast(mb); int ticks = measure->ticks(); + + QList sl = score->uniqueStaves(); + for (int staffIdx = 0; staffIdx < score->nstaves(); ++staffIdx) { Staff* staff = score->staff(staffIdx); if (tick == 0) { @@ -610,36 +613,49 @@ void MuseScore::newFile() } if (staff->primaryStaff()) { if (measure->timesig() != measure->len()) { - int tick = measure->tick(); QList dList = toDurationList(measure->len(), false); if (!dList.isEmpty()) { - foreach(TDuration d, dList) { - Rest* rest = new Rest(score, d); - rest->setDuration(d.fraction()); - rest->setTrack(staffIdx * VOICES); - Segment* s = measure->getSegment(rest, tick); - s->add(rest); + int tick = measure->tick(); + foreach (TDuration d, dList) { + Rest* rest = 0; + for (Staff* s : staff->staffList()) { + if (rest) + rest = static_cast(rest->linkedClone()); + else + rest = new Rest(score, d); + rest->setDuration(d.fraction()); + rest->setTrack(s->idx() * VOICES); + Segment* seg = measure->getSegment(rest, tick); + seg->add(rest); + } tick += rest->actualTicks(); } } } else { - Rest* rest = new Rest(score, TDuration(TDuration::V_MEASURE)); - rest->setDuration(measure->len()); - rest->setTrack(staffIdx * VOICES); - Segment* s = measure->getSegment(rest, tick); - s->add(rest); + Rest* rest = 0; + for (Staff* s : staff->staffList()) { + if (rest) + rest = static_cast(rest->linkedClone()); + else + rest = new Rest(score, TDuration(TDuration::V_MEASURE)); + rest->setDuration(measure->len()); + rest->setTrack(s->idx() * VOICES); + Segment* seg = measure->getSegment(rest, tick); + seg->add(rest); + } } } } tick += ticks; } score->fixTicks(); +#if 0 // // ceate linked staves // QMap> scoremap; - foreach(Staff* staff, score->staves()) { + foreach (Staff* staff, score->staves()) { if (!staff->linkedStaves()) continue; foreach(Staff* lstaff, staff->linkedStaves()->staves()) { @@ -661,6 +677,7 @@ void MuseScore::newFile() cloneStaves(score, it.key(), it.value()); ++it; } +#endif // // select first rest diff --git a/mscore/newwizard.cpp b/mscore/newwizard.cpp index 364c2c05d93f2..fa50671b7ebeb 100644 --- a/mscore/newwizard.cpp +++ b/mscore/newwizard.cpp @@ -468,7 +468,7 @@ void InstrumentWizard::createInstruments(Score* cs) if (sli->linked() && !part->staves()->isEmpty()) { Staff* linkedStaff = part->staves()->back(); - linkedStaff->linkTo(staff); + staff->linkTo(linkedStaff); } part->staves()->push_back(staff); cs->staves().insert(staffIdx + rstaff, staff); diff --git a/mtest/libmscore/parts/tst_parts.cpp b/mtest/libmscore/parts/tst_parts.cpp index 416bd1dab13f4..d4f84d0dcbc44 100644 --- a/mtest/libmscore/parts/tst_parts.cpp +++ b/mtest/libmscore/parts/tst_parts.cpp @@ -109,6 +109,8 @@ class TestParts : public QObject, public MTest // void stylePartDefault(); // void styleScoreDefault(); // void staffStyles(); + + void measureProperties(); }; //--------------------------------------------------------- @@ -186,7 +188,6 @@ void TestParts::appendMeasure() score->undo()->undo(); score->endUndoRedo(); - score->doLayout(); QVERIFY(saveCompareScore(score, "part-all-uappendmeasures.mscx", DIR + "part-all-uappendmeasures.mscx")); delete score; @@ -212,7 +213,6 @@ void TestParts::insertMeasure() score->undo()->undo(); score->endUndoRedo(); - score->doLayout(); QVERIFY(saveCompareScore(score, "part-all-uinsertmeasures.mscx", DIR + "part-all-uinsertmeasures.mscx")); delete score; @@ -370,7 +370,6 @@ void TestParts::undoAddBreath() score->undo()->undo(); score->endUndoRedo(); - score->doLayout(); QVERIFY(saveCompareScore(score, "part-breath-uadd.mscx", DIR + "part-breath-uadd.mscx")); delete score; @@ -390,7 +389,6 @@ void TestParts::undoRedoAddBreath() score->undo()->redo(); score->endUndoRedo(); - score->doLayout(); QVERIFY(saveCompareScore(score, "part-breath-uradd.mscx", DIR + "part-breath-uradd.mscx")); delete score; @@ -439,7 +437,6 @@ void TestParts::undoRemoveBreath() Score* score = doRemoveBreath(); score->undo()->undo(); score->endUndoRedo(); - score->doLayout(); QVERIFY(saveCompareScore(score, "part-breath-udel.mscx", DIR + "part-breath-udel.mscx")); delete score; } @@ -457,7 +454,6 @@ void TestParts::undoRedoRemoveBreath() score->undo()->redo(); score->endUndoRedo(); - score->doLayout(); QVERIFY(saveCompareScore(score, "part-breath-urdel.mscx", DIR + "part-breath-urdel.mscx")); delete score; @@ -510,7 +506,6 @@ void TestParts::undoAddFingering() Score* score = doAddFingering(); score->undo()->undo(); score->endUndoRedo(); - score->doLayout(); QVERIFY(saveCompareScore(score, "part-fingering-uadd.mscx", DIR + "part-fingering-uadd.mscx")); delete score; } @@ -526,7 +521,6 @@ void TestParts::undoRedoAddFingering() score->endUndoRedo(); score->undo()->redo(); score->endUndoRedo(); - score->doLayout(); QVERIFY(saveCompareScore(score, "part-fingering-uradd.mscx", DIR + "part-fingering-uradd.mscx")); delete score; } @@ -582,7 +576,6 @@ void TestParts::undoRemoveFingering() Score* score = doRemoveFingering(); score->undo()->undo(); score->endUndoRedo(); - score->doLayout(); QVERIFY(saveCompareScore(score, "part-fingering-udel.mscx", DIR + "part-fingering-udel.mscx")); delete score; } @@ -598,7 +591,6 @@ void TestParts::undoRedoRemoveFingering() score->endUndoRedo(); score->undo()->redo(); score->endUndoRedo(); - score->doLayout(); QVERIFY(saveCompareScore(score, "part-fingering-urdel.mscx", DIR + "part-fingering-urdel.mscx")); delete score; } @@ -650,7 +642,6 @@ void TestParts::undoAddSymbol() Score* score = doAddSymbol(); score->undo()->undo(); score->endUndoRedo(); - score->doLayout(); QVERIFY(saveCompareScore(score, "part-symbol-uadd.mscx", DIR + "part-symbol-uadd.mscx")); delete score; } @@ -666,7 +657,6 @@ void TestParts::undoRedoAddSymbol() score->endUndoRedo(); score->undo()->redo(); score->endUndoRedo(); - score->doLayout(); QVERIFY(saveCompareScore(score, "part-symbol-uradd.mscx", DIR + "part-symbol-uradd.mscx")); delete score; } @@ -722,7 +712,6 @@ void TestParts::undoRemoveSymbol() Score* score = doRemoveSymbol(); score->undo()->undo(); score->endUndoRedo(); - score->doLayout(); QVERIFY(saveCompareScore(score, "part-symbol-udel.mscx", DIR + "part-symbol-udel.mscx")); delete score; } @@ -738,7 +727,6 @@ void TestParts::undoRedoRemoveSymbol() score->endUndoRedo(); score->undo()->redo(); score->endUndoRedo(); - score->doLayout(); QVERIFY(saveCompareScore(score, "part-symbol-urdel.mscx", DIR + "part-symbol-urdel.mscx")); delete score; } @@ -790,7 +778,6 @@ void TestParts::undoAddChordline() Score* score = doAddChordline(); score->undo()->undo(); score->endUndoRedo(); - score->doLayout(); QVERIFY(saveCompareScore(score, "part-chordline-uadd.mscx", DIR + "part-chordline-uadd.mscx")); delete score; } @@ -806,7 +793,6 @@ void TestParts::undoRedoAddChordline() score->endUndoRedo(); score->undo()->redo(); score->endUndoRedo(); - score->doLayout(); QVERIFY(saveCompareScore(score, "part-chordline-uradd.mscx", DIR + "part-chordline-uradd.mscx")); delete score; } @@ -863,7 +849,7 @@ void TestParts::undoRemoveChordline() Score* score = doRemoveChordline(); score->undo()->undo(); score->endUndoRedo(); - score->doLayout(); +// score->doLayout(); QVERIFY(saveCompareScore(score, "part-chordline-udel.mscx", DIR + "part-chordline-udel.mscx")); delete score; } @@ -879,7 +865,6 @@ void TestParts::undoRedoRemoveChordline() score->endUndoRedo(); score->undo()->redo(); score->endUndoRedo(); - score->doLayout(); QVERIFY(saveCompareScore(score, "part-chordline-urdel.mscx", DIR + "part-chordline-urdel.mscx")); delete score; } @@ -931,7 +916,6 @@ void TestParts::undoAddImage() Score* score = doAddImage(); score->undo()->undo(); score->endUndoRedo(); - score->doLayout(); QVERIFY(saveCompareScore(score, "part26.mscx", DIR + "part26o.mscx")); delete score; } @@ -947,7 +931,6 @@ void TestParts::undoRedoAddImage() score->endUndoRedo(); score->undo()->redo(); score->endUndoRedo(); - score->doLayout(); QVERIFY(saveCompareScore(score, "part27.mscx", DIR + "part27o.mscx")); delete score; } @@ -1003,7 +986,6 @@ void TestParts::undoRemoveImage() Score* score = doRemoveImage(); score->undo()->undo(); score->endUndoRedo(); - score->doLayout(); QVERIFY(saveCompareScore(score, "part29.mscx", DIR + "part29o.mscx")); delete score; } @@ -1019,7 +1001,6 @@ void TestParts::undoRedoRemoveImage() score->endUndoRedo(); score->undo()->redo(); score->endUndoRedo(); - score->doLayout(); QVERIFY(saveCompareScore(score, "part30.mscx", DIR + "part30o.mscx")); delete score; } @@ -1055,6 +1036,15 @@ void TestParts::staffStyles() #endif +//--------------------------------------------------------- +// measureProperties +//--------------------------------------------------------- + +void TestParts::measureProperties() + { + } + + QTEST_MAIN(TestParts) #include "tst_parts.moc"