Element* BarLine::drop(const DropData& data) { Element* e = data.element; int type = e->type(); if (type == BAR_LINE) { BarLine* bl = static_cast<BarLine*>(e); BarLineType st = bl->subtype(); if (st == subtype()) { delete e; return 0; } Measure* m = segment()->measure(); if (st == START_REPEAT) { m = m->nextMeasure(); if (m == 0) { delete e; return 0; } } m->drop(data); } else if (type == ARTICULATION) { Articulation* atr = static_cast<Articulation*>(e); atr->setParent(this); atr->setTrack(track()); score()->select(atr, SELECT_SINGLE, 0); score()->undoAddElement(atr); } return 0; }
ChordRest::ChordRest(const ChordRest& cr, bool link) : DurationElement(cr) { _durationType = cr._durationType; _staffMove = cr._staffMove; _beam = 0; _tabDur = 0; // tab sur. symb. depends upon context: can't be // simply copied from another CR for (Articulation* a : cr._articulations) { // make deep copy Articulation* na = new Articulation(*a); if (link) na->linkTo(a); na->setParent(this); na->setTrack(track()); _articulations.append(na); } _beamMode = cr._beamMode; _up = cr._up; _small = cr._small; _crossMeasure = cr._crossMeasure; _space = cr._space; for (Lyrics* l : cr._lyricsList) { // make deep copy if (l == 0) continue; Lyrics* nl = new Lyrics(*l); if (link) nl->linkTo(l); nl->setParent(this); nl->setTrack(track()); _lyricsList.append(nl); } }
void TestNote::grace() { Score* score = readScore(DIR + "grace.mscx"); score->doLayout(); Chord* chord = score->firstMeasure()->findChord(0, 0); Note* note = chord->upNote(); // create score->setGraceNote(chord, note->pitch(), NoteType::APPOGGIATURA, MScore::division/2); Chord* gc = chord->graceNotes().first(); Note* gn = gc->notes().first(); // Note* n = static_cast<Note*>(writeReadElement(gn)); // QCOMPARE(n->noteType(), NoteType::APPOGGIATURA); // delete n; // tie score->startCmd(); score->select(gn); score->cmdAddTie(); score->endCmd(); // n = static_cast<Note*>(writeReadElement(gn)); // QVERIFY(n->tieFor() != 0); // delete n; // tremolo score->startCmd(); Tremolo* tr = new Tremolo(score); tr->setTremoloType(TremoloType::R16); tr->setParent(gc); tr->setTrack(gc->track()); score->undoAddElement(tr); score->endCmd(); // Chord* c = static_cast<Chord*>(writeReadElement(gc)); // QVERIFY(c->tremolo() != 0); // delete c; // articulation score->startCmd(); Articulation* ar = new Articulation(score); ar->setArticulationType(ArticulationType::Sforzatoaccent); ar->setParent(gc); ar->setTrack(gc->track()); score->undoAddElement(ar); score->endCmd(); // c = static_cast<Chord*>(writeReadElement(gc)); // QVERIFY(c->articulations().size() == 1); // delete c; QVERIFY(saveCompareScore(score, "grace-test.mscx", DIR + "grace-ref.mscx")); }
Element* BarLine::drop(const DropData& data) { Element* e = data.element; int type = e->type(); if (type == BAR_LINE) { BarLine* bl = static_cast<BarLine*>(e); BarLineType st = bl->barLineType(); // if no change in subtype or no change in span, do nothing if (st == barLineType() && bl->spanFrom() == 0 && bl->spanTo() == DEFAULT_BARLINE_TO) { delete e; return 0; } // system left-side bar line if (parent()->type() == SYSTEM) { BarLine* b = static_cast<System*>(parent())->barLine(); score()->undoChangeProperty(b, P_SUBTYPE, int(bl->barLineType())); delete e; return 0; } // check if the new property can apply to this single bar line bool oldRepeat = (barLineType() == START_REPEAT || barLineType() == END_REPEAT || barLineType() == END_START_REPEAT); bool newRepeat = (bl->barLineType() == START_REPEAT || bl->barLineType() == END_REPEAT || bl->barLineType() == END_START_REPEAT); // if repeats are not involved or drop refers to span rather than subtype => // single bar line drop if( (!oldRepeat && !newRepeat) || (bl->spanFrom() != 0 || bl->spanTo() != DEFAULT_BARLINE_TO) ) { // if drop refers to span, update this bar line span if(bl->spanFrom() != 0 || bl->spanTo() != DEFAULT_BARLINE_TO) { // if dropped spanFrom or spanTo are below the middle of standard staff (5 lines) // adjust to the number of syaff lines int bottomSpan = (staff()->lines()-1) * 2; int spanFrom = bl->spanFrom() > 4 ? bottomSpan - (8 - bl->spanFrom()) : bl->spanFrom(); int spanTo = bl->spanTo() > 4 ? bottomSpan - (8 - bl->spanTo()) : bl->spanTo(); score()->undoChangeSingleBarLineSpan(this, 1, spanFrom, spanTo); } // if drop refer to subtype, update this bar line subtype else { score()->undoChangeProperty(this, P_SUBTYPE, int(bl->barLineType())); // setCustomSubtype(true); } delete e; return 0; } // drop applies to all bar lines of the measure Measure* m = static_cast<Segment*>(parent())->measure(); if (st == START_REPEAT) { m = m->nextMeasure(); if (m == 0) { delete e; return 0; } } m->drop(data); } else if (type == ARTICULATION) { Articulation* atr = static_cast<Articulation*>(e); atr->setParent(this); atr->setTrack(track()); score()->undoAddElement(atr); return atr; } return 0; }