void BarLine::read(XmlReader& e) { // if bar line belongs to a staff, span values default to staff values if (staff()) { _span = staff()->barLineSpan(); _spanFrom = staff()->barLineFrom(); _spanTo = staff()->barLineTo(); } while (e.readNextStartElement()) { const QStringRef& tag(e.name()); if (tag == "subtype") { bool ok; const QString& val(e.readElementText()); int i = val.toInt(&ok); if (!ok) setBarLineType(val); else { BarLineType ct = NORMAL_BAR; switch (i) { default: case 0: ct = NORMAL_BAR; break; case 1: ct = DOUBLE_BAR; break; case 2: ct = START_REPEAT; break; case 3: ct = END_REPEAT; break; case 4: ct = BROKEN_BAR; break; case 5: ct = END_BAR; break; case 6: ct = END_START_REPEAT; break; case 7: ct = DOTTED_BAR; break; } setBarLineType(ct); } if (parent() && parent()->type() == SEGMENT) { Measure* m = static_cast<Segment*>(parent())->measure(); if (barLineType() != m->endBarLineType()) _customSubtype = true; } } else if (tag == "customSubtype") _customSubtype = e.readInt(); else if (tag == "span") { _span = e.readInt(); _spanFrom = e.intAttribute("from", _spanFrom); _spanTo = e.intAttribute("to", _spanTo); // WARNING: following statements assume staff and staff bar line spans are correctly set if (staff() && (_span != staff()->barLineSpan() || _spanFrom != staff()->barLineFrom() || _spanTo != staff()->barLineTo())) _customSpan = true; } else if (tag == "Articulation") { Articulation* a = new Articulation(score()); a->read(e); add(a); } else if (!Element::readProperties(e)) e.unknown(); } }
void BarLine::read(const QDomElement& de) { // if bar line belongs to a staff, span values default to staff values if(staff()) { _span = staff()->barLineSpan(); _spanFrom = staff()->barLineFrom(); _spanTo = staff()->barLineTo(); } for (QDomElement e = de.firstChildElement(); !e.isNull(); e = e.nextSiblingElement()) { const QString& tag(e.tagName()); const QString& val(e.text()); if (tag == "subtype") { bool ok; int i = val.toInt(&ok); if (!ok) setSubtype(val); else { BarLineType ct = NORMAL_BAR; switch (i) { default: case 0: ct = NORMAL_BAR; break; case 1: ct = DOUBLE_BAR; break; case 2: ct = START_REPEAT; break; case 3: ct = END_REPEAT; break; case 4: ct = BROKEN_BAR; break; case 5: ct = END_BAR; break; case 6: ct = END_START_REPEAT; break; case 7: ct = DOTTED_BAR; break; } setSubtype(ct); } if(parent() && parent()->type() == SEGMENT) { Measure* m = static_cast<Segment*>(parent())->measure(); if(subtype() != m->endBarLineType()) setCustomSubtype(true); } } else if (tag == "customSubtype") setCustomSubtype(val.toInt() != 0); else if (tag == "span") { _span = val.toInt(); _spanFrom = e.attribute("from", QString::number(_spanFrom)).toInt(); _spanTo = e.attribute("to", QString::number(_spanTo)).toInt(); // WARNING: following statements assume staff and staff bar line spans are correctly set if(staff() && (_span != staff()->barLineSpan() || _spanFrom != staff()->barLineFrom() || _spanTo != staff()->barLineTo())) _customSpan = true; } else if (tag == "Articulation") { Articulation* a = new Articulation(score()); a->read(e); add(a); } else if (!Element::readProperties(e)) domError(e); } }
void BarLine::read(const QDomElement& de) { for (QDomElement e = de.firstChildElement(); !e.isNull(); e = e.nextSiblingElement()) { const QString& tag(e.tagName()); const QString& val(e.text()); if (tag == "subtype") { bool ok; int i = val.toInt(&ok); if (!ok) setSubtype(val); else { BarLineType ct = NORMAL_BAR; switch (i) { default: case 0: ct = NORMAL_BAR; break; case 1: ct = DOUBLE_BAR; break; case 2: ct = START_REPEAT; break; case 3: ct = END_REPEAT; break; case 4: ct = BROKEN_BAR; break; case 5: ct = END_BAR; break; case 6: ct = END_START_REPEAT; break; } setSubtype(ct); } } else if (tag == "span") _span = val.toInt(); else if (tag == "Articulation") { Articulation* a = new Articulation(score()); a->read(e); add(a); } else if (!Element::readProperties(e)) domError(e); } }
bool ChordRest::readProperties(XmlReader& e) { const QStringRef& tag(e.name()); if (tag == "durationType") { setDurationType(e.readElementText()); if (actualDurationType().type() != TDuration::DurationType::V_MEASURE) { if ((type() == Element::Type::REST) && // for backward compatibility, convert V_WHOLE rests to V_MEASURE // if long enough to fill a measure. // OTOH, freshly created (un-initialized) rests have numerator == 0 (< 4/4) // (see Fraction() constructor in fraction.h; this happens for instance // when pasting selection from clipboard): they should not be converted duration().numerator() != 0 && // rest durations are initialized to full measure duration when // created upon reading the <Rest> tag (see Measure::read() ) // so a V_WHOLE rest in a measure of 4/4 or less => V_MEASURE (actualDurationType()==TDuration::DurationType::V_WHOLE && duration() <= Fraction(4, 4)) ) { // old pre 2.0 scores: convert setDurationType(TDuration::DurationType::V_MEASURE); } else // not from old score: set duration fraction from duration type setDuration(actualDurationType().fraction()); } else { if (score()->mscVersion() < 115) { SigEvent event = score()->sigmap()->timesig(e.tick()); setDuration(event.timesig()); } } } else if (tag == "BeamMode") { QString val(e.readElementText()); Beam::Mode bm = Beam::Mode::AUTO; if (val == "auto") bm = Beam::Mode::AUTO; else if (val == "begin") bm = Beam::Mode::BEGIN; else if (val == "mid") bm = Beam::Mode::MID; else if (val == "end") bm = Beam::Mode::END; else if (val == "no") bm = Beam::Mode::NONE; else if (val == "begin32") bm = Beam::Mode::BEGIN32; else if (val == "begin64") bm = Beam::Mode::BEGIN64; else bm = Beam::Mode(val.toInt()); _beamMode = Beam::Mode(bm); } else if (tag == "Attribute" || tag == "Articulation") { // obsolete: "Attribute" Articulation* atr = new Articulation(score()); atr->read(e); add(atr); } else if (tag == "leadingSpace") { qDebug("ChordRest: leadingSpace obsolete"); // _extraLeadingSpace = Spatium(val.toDouble()); e.skipCurrentElement(); } else if (tag == "trailingSpace") { qDebug("ChordRest: trailingSpace obsolete"); // _extraTrailingSpace = Spatium(val.toDouble()); e.skipCurrentElement(); } else if (tag == "Beam") { int id = e.readInt(); Beam* beam = e.findBeam(id); if (beam) beam->add(this); // also calls this->setBeam(beam) else qDebug("Beam id %d not found", id); } else if (tag == "small") _small = e.readInt(); else if (tag == "duration") setDuration(e.readFraction()); else if (tag == "ticklen") { // obsolete (version < 1.12) int mticks = score()->sigmap()->timesig(e.tick()).timesig().ticks(); int i = e.readInt(); if (i == 0) i = mticks; if ((type() == Element::Type::REST) && (mticks == i)) { setDurationType(TDuration::DurationType::V_MEASURE); setDuration(Fraction::fromTicks(i)); } else { Fraction f = Fraction::fromTicks(i); setDuration(f); setDurationType(TDuration(f)); } } else if (tag == "dots") setDots(e.readInt()); else if (tag == "move") _staffMove = e.readInt(); else if (tag == "Slur") { int id = e.intAttribute("id"); if (id == 0) id = e.intAttribute("number"); // obsolete Spanner* spanner = e.findSpanner(id); if (!spanner) qDebug("ChordRest::read(): Slur id %d not found", id); else { QString atype(e.attribute("type")); if (atype == "start") { spanner->setTick(e.tick()); if (spanner->ticks() > 0) // stop has been read first, ticks is tick2 - (-1) spanner->setTick2(spanner->ticks() - 1); spanner->setTrack(track()); if (spanner->type() == Element::Type::SLUR) spanner->setStartElement(this); if (e.pasteMode()) { for (Element* e : spanner->linkList()) { if (e == spanner) continue; Spanner* ls = static_cast<Spanner*>(e); ls->setTick(spanner->tick()); for (Element* ee : linkList()) { ChordRest* cr = static_cast<ChordRest*>(ee); if (cr->score() == ee->score() && cr->staffIdx() == ls->staffIdx()) { ls->setTrack(cr->track()); if (ls->type() == Element::Type::SLUR) ls->setStartElement(cr); break; } } } } } else if (atype == "stop") { spanner->setTick2(e.tick()); spanner->setTrack2(track()); if (spanner->type() == Element::Type::SLUR) spanner->setEndElement(this); Chord* start = static_cast<Chord*>(spanner->startElement()); if (start) spanner->setTrack(start->track()); if (e.pasteMode()) { for (Element* e : spanner->linkList()) { if (e == spanner) continue; Spanner* ls = static_cast<Spanner*>(e); ls->setTick2(spanner->tick2()); for (Element* ee : linkList()) { ChordRest* cr = static_cast<ChordRest*>(ee); if (cr->score() == ee->score() && cr->staffIdx() == ls->staffIdx()) { ls->setTrack2(cr->track()); if (ls->type() == Element::Type::SLUR) ls->setEndElement(cr); break; } } } } } else qDebug("ChordRest::read(): unknown Slur type <%s>", qPrintable(atype)); } e.readNext(); } else if (tag == "Lyrics" /*|| tag == "FiguredBass"*/) { Element* element = Element::name2Element(tag, score()); element->setTrack(e.track()); element->read(e); add(element); } else if (tag == "pos") { QPointF pt = e.readPoint(); if (score()->mscVersion() > 114) setUserOff(pt * spatium()); } else if (tag == "offset") { if (score()->mscVersion() > 114) // || voice() >= 2) { DurationElement::readProperties(e); else if (type() == Element::Type::REST) { DurationElement::readProperties(e); setUserXoffset(0.0); // honor Y offset but not X for rests in older scores } else e.skipCurrentElement(); // ignore manual layout otherwise } else if (DurationElement::readProperties(e)) return true; else return false; return true; }