diff --git a/libmscore/layout.cpp b/libmscore/layout.cpp index 106e489e3ad5..1c9366df1ad7 100644 --- a/libmscore/layout.cpp +++ b/libmscore/layout.cpp @@ -565,25 +565,21 @@ void Score::doLayout() createPlayEvents(); int measureNo = 0; - for (MeasureBase* m = first(); m; m = m->next()) { - if (m->type() == Element::MEASURE) { - Measure* measure = static_cast(m); - measureNo += measure->noOffset(); - measure->setNo(measureNo); - if (measure->sectionBreak() && measure->sectionBreak()->startWithMeasureOne()) - measureNo = 0; - else if (measure->irregular()) // dont count measure - ; - else - ++measureNo; - } + for (Measure* m = firstMeasure(); m; m = m->nextMeasure()) { + Measure* measure = static_cast(m); + measureNo += measure->noOffset(); + measure->setNo(measureNo); + if (measure->sectionBreak() && measure->sectionBreak()->startWithMeasureOne()) + measureNo = 0; + else if (measure->irregular()) // dont count measure + ; + else + ++measureNo; + measure->setBreakMMRest(false); } - for (MeasureBase* m = first(); m; m = m->next()) { + for (MeasureBase* m = first(); m; m = m->next()) m->layout0(); - if (m->type() == Element::MEASURE) - static_cast(m)->setBreakMMRest(false); - } layoutFlags = 0; @@ -928,6 +924,7 @@ void Score::createMMRests() // create a multi measure rest from m to lm (inclusive) // attach the measure to m // + printf("create mm rest %d %d\n", n, _showVBox); Measure* mmr = m->mmRest() ? m->mmRest() : new Measure(this); mmr->setMMRestCount(n); mmr->setTick(m->tick()); @@ -1417,7 +1414,7 @@ bool Score::layoutSystem1(qreal& minWidth, bool isFirstSystem, bool longName) void Score::removeGeneratedElements(Measure* sm, Measure* em) { - for (Measure* m = sm; m; m = m->nextMeasure()) { + for (Measure* m = sm; m; m = m->nextMeasureMM()) { // // remove generated elements from all measures in [sm;em] // assume: generated elements are only living in voice 0 @@ -2033,12 +2030,7 @@ QList Score::layoutSystemRow(qreal rowWidth, bool isFirstSystem, bool u void Score::layoutSystems() { - curMeasure = _showVBox ? first() : firstMeasure(); - if (curMeasure->type() == Element::MEASURE - && styleB(ST_createMultiMeasureRests) - && static_cast(curMeasure)->hasMMRest()) { - curMeasure = static_cast(curMeasure)->mmRest(); - } + curMeasure = _showVBox ? firstMM() : firstMeasureMM(); curSystem = 0; bool firstSystem = true; bool startWithLongNames = true; @@ -2061,7 +2053,7 @@ void Score::layoutSystems() system->rxpos() = 0.0; system->setPageBreak(vbox->pageBreak()); system->measures().push_back(vbox); - curMeasure = curMeasure->next(); + curMeasure = curMeasure->nextMM(); ++curSystem; } else { diff --git a/libmscore/measure.cpp b/libmscore/measure.cpp index dd2a4693ac99..cd7507dc245e 100644 --- a/libmscore/measure.cpp +++ b/libmscore/measure.cpp @@ -544,12 +544,14 @@ void Measure::layout2() if (parent() == 0) return; + Q_ASSERT(score()->nstaves() == staves.size()); + + int tracks = score()->nstaves() * VOICES; qreal _spatium = spatium(); - int tracks = staves.size() * VOICES; static const Segment::SegmentTypes st = Segment::SegChordRest; for (int track = 0; track < tracks; ++track) { for (Segment* s = first(st); s; s = s->next(st)) { - ChordRest* cr = static_cast(s->element(track)); + ChordRest* cr = s->cr(track); if (!cr) continue; int n = cr->lyricsList().size(); @@ -575,10 +577,8 @@ void Measure::layout2() } } } - int n = staves.size(); - for (int i = 0; i < n; ++i) - staves.at(i)->lines->setWidth(width()); - + for (MStaff* ms : staves) + ms->lines->setWidth(width()); MeasureBase::layout(); // layout LAYOUT_BREAK elements @@ -610,7 +610,7 @@ void Measure::layout2() int nn = 1; if (!score()->styleB(ST_measureNumberAllStaffs)) { //find first non invisible staff - for (int staffIdx = 0; staffIdx < n; ++staffIdx) { + for (int staffIdx = 0; staffIdx < staves.size(); ++staffIdx) { MStaff* ms = staves.at(staffIdx); SysStaff* s = system()->staff(staffIdx); Staff* staff = score()->staff(staffIdx); @@ -620,7 +620,7 @@ void Measure::layout2() } } } - for (int staffIdx = 0; staffIdx < n; ++staffIdx) { + for (int staffIdx = 0; staffIdx < staves.size(); ++staffIdx) { MStaff* ms = staves.at(staffIdx); Text* t = ms->noText(); if (smn) { @@ -1001,7 +1001,7 @@ void Measure::removeStaves(int sStaff, int eStaff) s->removeStaff(staff); } } - foreach(Element* e, _el) { + foreach (Element* e, _el) { if (e->track() == -1) continue; int voice = e->voice(); @@ -1011,8 +1011,6 @@ void Measure::removeStaves(int sStaff, int eStaff) e->setTrack(staffIdx * VOICES + voice); } } - for (int i = 0; i < staves.size(); ++i) - staves[i]->setTrack(i * VOICES); } //--------------------------------------------------------- @@ -1021,7 +1019,7 @@ void Measure::removeStaves(int sStaff, int eStaff) void Measure::insertStaves(int sStaff, int eStaff) { - foreach(Element* e, _el) { + foreach (Element* e, _el) { if (e->track() == -1) continue; int staffIdx = e->staffIdx(); @@ -1036,8 +1034,6 @@ void Measure::insertStaves(int sStaff, int eStaff) s->insertStaff(staff); } } - for (int i = 0; i < staves.size(); ++i) - staves[i]->setTrack(i * VOICES); } //--------------------------------------------------------- @@ -1080,9 +1076,6 @@ qDebug("cmdRemoveStaves %d-%d", sStaff, eStaff); for (int i = eStaff - 1; i >= sStaff; --i) _score->undo(new RemoveMStaff(this, *(staves.begin()+i), i)); - for (int i = 0; i < staves.size(); ++i) - staves[i]->lines->setTrack(i * VOICES); - // barLine // TODO } @@ -1156,11 +1149,10 @@ void MStaff::setTrack(int track) void Measure::insertMStaff(MStaff* staff, int idx) { +printf("insertMStaff %d\n", idx); staves.insert(idx, staff); for (int staffIdx = 0; staffIdx < staves.size(); ++staffIdx) staves[staffIdx]->setTrack(staffIdx * VOICES); - if (MScore::debugMode) - qDebug(" Measure::insertMStaff %d -> n:%d", idx, staves.size()); } //--------------------------------------------------------- @@ -1169,9 +1161,7 @@ void Measure::insertMStaff(MStaff* staff, int idx) void Measure::removeMStaff(MStaff* /*staff*/, int idx) { - if (MScore::debugMode) - qDebug(" Measure::removeMStaff %d", idx); - +printf("removeMStaff %d\n", idx); staves.removeAt(idx); for (int staffIdx = 0; staffIdx < staves.size(); ++staffIdx) staves[staffIdx]->setTrack(staffIdx * VOICES); @@ -2518,7 +2508,7 @@ void Measure::setEndBarLineType(BarLineType val, bool g, bool visible, QColor co void Measure::sortStaves(QList& dst) { QList ms; - foreach(int idx, dst) + foreach (int idx, dst) ms.push_back(staves[idx]); staves = ms; diff --git a/libmscore/measurebase.cpp b/libmscore/measurebase.cpp index f73643ed7cf4..357a100516e4 100644 --- a/libmscore/measurebase.cpp +++ b/libmscore/measurebase.cpp @@ -195,13 +195,9 @@ Measure* MeasureBase::nextMeasureMM() const m = m->_next; } Measure* mm = static_cast(m); - if (mm - && mm->type() == MEASURE - && score()->styleB(ST_createMultiMeasureRests) - && static_cast(mm)->hasMMRest()) { - return static_cast(mm)->mmRest(); - } - return static_cast(mm); + if (mm && score()->styleB(ST_createMultiMeasureRests) && mm->hasMMRest()) + return mm->mmRest(); + return mm; } //--------------------------------------------------------- diff --git a/libmscore/score.cpp b/libmscore/score.cpp index 67d724350913..b78c7d1d162f 100644 --- a/libmscore/score.cpp +++ b/libmscore/score.cpp @@ -1596,13 +1596,10 @@ Measure* Score::firstMeasureMM() const MeasureBase* mb = _measures.first(); while (mb && mb->type() != Element::MEASURE) mb = mb->next(); - if (mb - && mb->type() == Element::MEASURE - && styleB(ST_createMultiMeasureRests) - && static_cast(mb)->hasMMRest()) { - return static_cast(mb)->mmRest(); - } - return static_cast(mb); + Measure* m = static_cast(mb); + if (m && styleB(ST_createMultiMeasureRests) && m->hasMMRest()) + return m->mmRest(); + return m; } //--------------------------------------------------------- @@ -2038,7 +2035,7 @@ void Score::removeExcerpt(Score* score) void Score::updateNotes() { - for (Measure* m = firstMeasure(); m; m = m->nextMeasure()) { + for (Measure* m = firstMeasureMM(); m; m = m->nextMeasureMM()) { for (int staffIdx = 0; staffIdx < nstaves(); ++staffIdx) { AccidentalState tversatz; // state of already set accidentals for this measure tversatz.init(staff(staffIdx)->keymap()->key(m->tick())); @@ -2059,7 +2056,7 @@ void Score::updateNotes() void Score::cmdUpdateNotes() { - for (Measure* m = firstMeasure(); m; m = m->nextMeasure()) { + for (Measure* m = firstMeasureMM(); m; m = m->nextMeasureMM()) { for (int staffIdx = 0; staffIdx < nstaves(); ++staffIdx) updateAccidentals(m, staffIdx); } @@ -2075,7 +2072,7 @@ void Score::cmdUpdateAccidentals(Measure* beginMeasure, int staffIdx) // qDebug("cmdUpdateAccidentals m=%d for staff=%d", // beginMeasure->no(), staffIdx); Staff* st = staff(staffIdx); - for (Measure* m = beginMeasure; m; m = m->nextMeasure()) { + for (Measure* m = beginMeasure; m; m = m->nextMeasureMM()) { AccidentalState as; as.init(st->keymap()->key(m->tick())); @@ -2257,8 +2254,11 @@ void Score::splitStaff(int staffIdx, int splitPoint) undoInsertStaff(ns, staffIdx+1); - for (Measure* m = firstMeasure(); m; m = m->nextMeasure()) + for (Measure* m = firstMeasure(); m; m = m->nextMeasure()) { m->cmdAddStaves(staffIdx+1, staffIdx+2, false); + if (m->hasMMRest()) + m->mmRest()->cmdAddStaves(staffIdx+1, staffIdx+2, false); + } Clef* clef = new Clef(this); clef->setClefType(ClefType::F); @@ -2269,16 +2269,6 @@ void Score::splitStaff(int staffIdx, int splitPoint) undoChangeKeySig(ns, 0, s->key(0)); -#if 0 // created on layout - Bracket* b = new Bracket(this); - b->setSubtype(BRACKET_AKKOLADE); - b->setTrack(staffIdx * VOICES); - b->setParent(firstMeasure()->system()); - b->setLevel(-1); // add bracket - b->setSpan(2); - undoAddElement(b); -#endif - rebuildMidiMapping(); _instrumentsChanged = true; doLayout(); @@ -2392,8 +2382,12 @@ void Score::cmdInsertPart(Part* part, int staffIdx) int sidx = this->staffIdx(part); int eidx = sidx + part->nstaves(); - for (Measure* m = firstMeasure(); m; m = m->nextMeasure()) + for (Measure* m = firstMeasure(); m; m = m->nextMeasure()) { m->cmdAddStaves(sidx, eidx, true); + if (m->hasMMRest()) + m->mmRest()->cmdAddStaves(sidx, eidx, true); + } + adjustBracketsIns(sidx, eidx); } @@ -2407,16 +2401,18 @@ void Score::cmdRemovePart(Part* part) int n = part->nstaves(); int eidx = sidx + n; -// qDebug("cmdRemovePart %d-%d", sidx, eidx); - // // adjust measures // - for (Measure* m = firstMeasure(); m; m = m->nextMeasure()) + for (Measure* m = firstMeasure(); m; m = m->nextMeasure()) { m->cmdRemoveStaves(sidx, eidx); + if (m->hasMMRest()) + m->mmRest()->cmdRemoveStaves(sidx, eidx); + } for (int i = 0; i < n; ++i) cmdRemoveStaff(sidx); + undoRemovePart(part, sidx); } @@ -2559,8 +2555,11 @@ void Score::cmdRemoveStaff(int staffIdx) int lstaffIdx = lscore->staffIdx(staff); int pIndex = lscore->staffIdx(staff->part()); //adjustBracketsDel(lstaffIdx, lstaffIdx+1); - for (Measure* m = lscore->firstMeasure(); m; m = m->nextMeasure()) + for (Measure* m = lscore->firstMeasure(); m; m = m->nextMeasure()) { m->cmdRemoveStaves(lstaffIdx, lstaffIdx + 1); + if (m->hasMMRest()) + m->mmRest()->cmdRemoveStaves(lstaffIdx, lstaffIdx + 1); + } undoRemoveStaff(staff, lstaffIdx); if (staff->part()->nstaves() == 0) undoRemovePart(staff->part(), pIndex); @@ -2589,7 +2588,7 @@ void Score::sortStaves(QList& dst) _parts.clear(); Part* curPart = 0; QList dl; - foreach(int idx, dst) { + foreach (int idx, dst) { Staff* staff = _staves[idx]; if (staff->part() != curPart) { curPart = staff->part(); @@ -2601,11 +2600,10 @@ void Score::sortStaves(QList& dst) } _staves = dl; - for (MeasureBase* mb = _measures.first(); mb; mb = mb->next()) { - if (mb->type() != Element::MEASURE) - continue; - Measure* m = static_cast(mb); + for (Measure* m = firstMeasure(); m; m = m->nextMeasure()) { m->sortStaves(dst); + if (m->hasMMRest()) + m->mmRest()->sortStaves(dst); } } diff --git a/libmscore/segment.h b/libmscore/segment.h index c2b787c73850..51484991268c 100644 --- a/libmscore/segment.h +++ b/libmscore/segment.h @@ -119,7 +119,11 @@ class Segment : public Element { ChordRest* nextChordRest(int track, bool backwards = false) const; - Q_INVOKABLE Ms::Element* element(int track) const { return _elist.value(track); } + Q_INVOKABLE Ms::Element* element(int track) const { return _elist.value(track); } + ChordRest* cr(int track) const { + Q_ASSERT(_segmentType == SegChordRest); + return (ChordRest*)(_elist.value(track)); + }; const QList& elist() const { return _elist; } void removeElement(int track); diff --git a/vtest/gen b/vtest/gen index 2aff6ab0b04c..3b55e1d17100 100755 --- a/vtest/gen +++ b/vtest/gen @@ -3,7 +3,7 @@ # # "compare" - image magick compare program # -SRC="mmrest-1 mmrest-2 mmrest-4\ +SRC="mmrest-1 mmrest-2 mmrest-4 mmrest-5 mmrest-6\ fmrest-1 fmrest-2 fmrest-3 fmrest-4 fmrest-5 measure-repeat-1" MSCORE=../build.debug/mscore/mscore diff --git a/vtest/mmrest-1-ref.png b/vtest/mmrest-1-ref.png index ea98bc413fda..3585e829e796 100644 Binary files a/vtest/mmrest-1-ref.png and b/vtest/mmrest-1-ref.png differ diff --git a/vtest/mmrest-2-ref.png b/vtest/mmrest-2-ref.png index e570eda8e52e..8275847b7a12 100644 Binary files a/vtest/mmrest-2-ref.png and b/vtest/mmrest-2-ref.png differ diff --git a/vtest/mmrest-5-ref.png b/vtest/mmrest-5-ref.png new file mode 100644 index 000000000000..09c7c7ddd271 Binary files /dev/null and b/vtest/mmrest-5-ref.png differ diff --git a/vtest/mmrest-5.mscz b/vtest/mmrest-5.mscz new file mode 100644 index 000000000000..f379964a4673 Binary files /dev/null and b/vtest/mmrest-5.mscz differ diff --git a/vtest/mmrest-6-ref.png b/vtest/mmrest-6-ref.png new file mode 100644 index 000000000000..0ce7f236a4f5 Binary files /dev/null and b/vtest/mmrest-6-ref.png differ diff --git a/vtest/mmrest-6.mscz b/vtest/mmrest-6.mscz new file mode 100644 index 000000000000..eb3cb8b921cf Binary files /dev/null and b/vtest/mmrest-6.mscz differ