diff --git a/libmscore/chordlist.cpp b/libmscore/chordlist.cpp index 98f41ccfd491..0897c68e506e 100644 --- a/libmscore/chordlist.cpp +++ b/libmscore/chordlist.cpp @@ -1721,7 +1721,7 @@ bool ChordList::read(const QString& name) qDebug("ChordList::read failed: <%s>", qPrintable(path)); return false; } - XmlReader e(&f); + XmlReader e(0, &f); docName = f.fileName(); while (e.readNextStartElement()) { @@ -1757,7 +1757,7 @@ bool ChordList::write(const QString& name) const return false; } - Xml xml(&f); + Xml xml(0, &f); xml.header(); xml.stag("museScore version=\"" MSC_VERSION "\""); diff --git a/libmscore/chordrest.cpp b/libmscore/chordrest.cpp index 1fc07854be60..5d00a2bb2c2f 100644 --- a/libmscore/chordrest.cpp +++ b/libmscore/chordrest.cpp @@ -214,8 +214,8 @@ void ChordRest::writeProperties(Xml& xml) const if (!isGrace()) { Fraction t(globalDuration()); if (staff()) - t /= staff()->timeStretch(xml.curTick); - xml.curTick += t.ticks(); + t /= staff()->timeStretch(xml.curTick()); + xml.incCurTick(t.ticks()); } for (auto i : score()->spanner()) { // TODO: dont search whole list Spanner* s = i.second; @@ -1248,7 +1248,7 @@ void ChordRest::writeBeam(Xml& xml) { Beam* b = beam(); if (b && b->elements().front() == this && (MScore::testMode || !b->generated())) { - b->setId(xml.beamId++); + b->setId(xml.nextBeamId()); b->write(xml); } } diff --git a/libmscore/cmd.cpp b/libmscore/cmd.cpp index ab850ce7072c..0860348779d3 100644 --- a/libmscore/cmd.cpp +++ b/libmscore/cmd.cpp @@ -2713,7 +2713,7 @@ void Score::cmdExplode() int track = (srcStaff + i) * VOICES; ChordRest* cr = toChordRest(firstCRSegment->element(track)); if (cr) { - XmlReader e(srcSelection.mimeData()); + XmlReader e(this, srcSelection.mimeData()); e.setPasteMode(true); if (pasteStaff(e, cr->segment(), cr->staffIdx()) != PasteState::PS_NO_ERROR) qDebug("explode: paste failed"); diff --git a/libmscore/duration.cpp b/libmscore/duration.cpp index f01cf4392877..54a02e3c78fe 100644 --- a/libmscore/duration.cpp +++ b/libmscore/duration.cpp @@ -127,7 +127,7 @@ void DurationElement::writeTuplet(Xml& xml) { if (tuplet() && tuplet()->elements().front() == this) { tuplet()->writeTuplet(xml); // recursion - tuplet()->setId(xml.tupletId++); + tuplet()->setId(xml.nextTupletId()); tuplet()->write(xml); } } diff --git a/libmscore/element.cpp b/libmscore/element.cpp index 593da278e36b..5b65c4126c55 100644 --- a/libmscore/element.cpp +++ b/libmscore/element.cpp @@ -652,7 +652,7 @@ bool Element::intersects(const QRectF& rr) const void Element::writeProperties(Xml& xml) const { // copy paste should not keep links - if (_links && (_links->size() > 1) && !xml.clipboardmode) + if (_links && (_links->size() > 1) && !xml.clipboardmode()) xml.tag("lid", _links->lid()); if (!autoplace() && !userOff().isNull()) { if (isVoltaSegment() @@ -661,14 +661,14 @@ void Element::writeProperties(Xml& xml) const || isRehearsalMark() || isDynamic() || isSystemDivider() - || (xml.clipboardmode && isSLineSegment())) + || (xml.clipboardmode() && isSLineSegment())) xml.tag("offset", userOff() / spatium()); else xml.tag("pos", pos() / score()->spatium()); } - if (((track() != xml.curTrack) || (type() == Element::Type::SLUR)) && (track() != -1)) { + if (((track() != xml.curTrack()) || (type() == Element::Type::SLUR)) && (track() != -1)) { int t; - t = track() + xml.trackDiff; + t = track() + xml.trackDiff(); xml.tag("track", t); } if (_tag != 0x1) { @@ -1151,8 +1151,8 @@ QByteArray Element::mimeData(const QPointF& dragOffset) const { QBuffer buffer; buffer.open(QIODevice::WriteOnly); - Xml xml(&buffer); - xml.clipboardmode = true; + Xml xml(score(), &buffer); + xml.setClipboardmode(true); xml.stag("Element"); if (isNote()) xml.tag("duration", toNote(this)->chord()->duration()); diff --git a/libmscore/figuredbass.cpp b/libmscore/figuredbass.cpp index 401b7262ba0b..4351e36e3833 100644 --- a/libmscore/figuredbass.cpp +++ b/libmscore/figuredbass.cpp @@ -1582,7 +1582,7 @@ bool FiguredBass::readConfigFile(const QString& fileName) qDebug("FiguredBass::read failed: <%s>", qPrintable(path)); return false; } - XmlReader e(&f); + XmlReader e(0, &f); while (e.readNextStartElement()) { if (e.name() == "museScore") { // QString version = e.attribute(QString("version")); diff --git a/libmscore/harmony.cpp b/libmscore/harmony.cpp index cb5e40f034a2..e63ba95d664c 100644 --- a/libmscore/harmony.cpp +++ b/libmscore/harmony.cpp @@ -203,7 +203,7 @@ void Harmony::write(Xml& xml) const Segment* segment = static_cast(parent()); int tick = segment ? segment->tick() : -1; const Interval& interval = part()->instrument(tick)->transpose(); - if (xml.clipboardmode && !score()->styleB(StyleIdx::concertPitch) && interval.chromatic) { + if (xml.clipboardmode() && !score()->styleB(StyleIdx::concertPitch) && interval.chromatic) { rRootTpc = transposeTpc(_rootTpc, interval, true); rBaseTpc = transposeTpc(_baseTpc, interval, true); } diff --git a/libmscore/instrtemplate.cpp b/libmscore/instrtemplate.cpp index eed464b508e3..04f117ca57d5 100644 --- a/libmscore/instrtemplate.cpp +++ b/libmscore/instrtemplate.cpp @@ -545,7 +545,7 @@ bool saveInstrumentTemplates(const QString& instrTemplates) qDebug("cannot save instrument templates at <%s>", qPrintable(instrTemplates)); return false; } - Xml xml(&qf); + Xml xml(0, &qf); xml << "\n"; xml.stag("museScore"); foreach(const InstrumentGenre* genre, instrumentGenres) @@ -582,7 +582,7 @@ bool saveInstrumentTemplates1(const QString& instrTemplates) qDebug("cannot save instrument templates at <%s>", qPrintable(instrTemplates)); return false; } - Xml xml(&qf); + Xml xml(0, &qf); xml << "\n"; xml.stag("museScore"); foreach(const InstrumentGenre* genre, instrumentGenres) @@ -614,7 +614,7 @@ bool loadInstrumentTemplates(const QString& instrTemplates) return false; } - XmlReader e(&qf); + XmlReader e(0, &qf); while (e.readNextStartElement()) { if (e.name() == "museScore") { while (e.readNextStartElement()) { diff --git a/libmscore/measure.cpp b/libmscore/measure.cpp index c2f6320eb6d4..76379f2ed0fc 100644 --- a/libmscore/measure.cpp +++ b/libmscore/measure.cpp @@ -1610,7 +1610,7 @@ void Measure::write(Xml& xml, int staff, bool writeSystemElements) const else xml.stag(QString("Measure number=\"%1\"").arg(mno)); - xml.curTick = tick(); + xml.setCurTick(tick()); if (_mmRestCount > 0) xml.tag("multiMeasureRest", _mmRestCount); diff --git a/libmscore/paste.cpp b/libmscore/paste.cpp index e4f03f53c804..4ee87e44f525 100644 --- a/libmscore/paste.cpp +++ b/libmscore/paste.cpp @@ -832,7 +832,7 @@ PasteState Score::cmdPaste(const QMimeData* ms, MuseScoreView* view) } if ((_selection.isSingle() || _selection.isList()) && ms->hasFormat(mimeSymbolFormat)) { QByteArray data(ms->data(mimeSymbolFormat)); - XmlReader e(data); + XmlReader e(this, data); QPointF dragOffset; Fraction duration(1, 4); Element::Type type = Element::readType(e, &dragOffset, &duration); @@ -890,7 +890,7 @@ PasteState Score::cmdPaste(const QMimeData* ms, MuseScoreView* view) QByteArray data(ms->data(mimeStaffListFormat)); if (MScore::debugMode) qDebug("paste <%s>", data.data()); - XmlReader e(data); + XmlReader e(this, data); e.setPasteMode(true); PasteState ps = pasteStaff(e, cr->segment(), cr->staffIdx()); if (ps != PasteState::PS_NO_ERROR) { @@ -921,7 +921,7 @@ PasteState Score::cmdPaste(const QMimeData* ms, MuseScoreView* view) QByteArray data(ms->data(mimeSymbolListFormat)); if (MScore::debugMode) qDebug("paste <%s>", data.data()); - XmlReader e(data); + XmlReader e(this, data); pasteSymbols(e, cr); } } diff --git a/libmscore/score.cpp b/libmscore/score.cpp index 4461a16c2834..363e80e99a3e 100644 --- a/libmscore/score.cpp +++ b/libmscore/score.cpp @@ -1812,7 +1812,7 @@ MasterScore* MasterScore::clone() { QBuffer buffer; buffer.open(QIODevice::WriteOnly); - Xml xml(&buffer); + Xml xml(this, &buffer); xml.header(); xml.stag("museScore version=\"" MSC_VERSION "\""); @@ -1821,7 +1821,7 @@ MasterScore* MasterScore::clone() buffer.close(); - XmlReader r(buffer.buffer()); + XmlReader r(this, buffer.buffer()); MasterScore* score = new MasterScore(style()); score->read1(r, true); diff --git a/libmscore/scorefile.cpp b/libmscore/scorefile.cpp index eb4e1fb980db..013a1c57483b 100644 --- a/libmscore/scorefile.cpp +++ b/libmscore/scorefile.cpp @@ -70,7 +70,7 @@ static void writeMeasure(Xml& xml, MeasureBase* m, int staffIdx, bool writeSyste if (m->score()->styleB(StyleIdx::createMultiMeasureRests) && m->isMeasure() && toMeasure(m)->mmRest()) toMeasure(m)->mmRest()->write(xml, staffIdx, writeSystemElements); - xml.curTick = m->endTick(); + xml.setCurTick(m->endTick()); } //--------------------------------------------------------- @@ -127,12 +127,12 @@ bool Score::write(Xml& xml, bool selectionOnly) } #ifdef OMR - if (masterScore()->omr() && xml.writeOmr) + if (masterScore()->omr() && xml.writeOmr()) masterScore()->omr()->write(xml); #endif - if (isMaster() && masterScore()->showOmr() && xml.writeOmr) + if (isMaster() && masterScore()->showOmr() && xml.writeOmr()) xml.tag("showOmr", masterScore()->showOmr()); - if (_audio && xml.writeOmr) { + if (_audio && xml.writeOmr()) { xml.tag("playMode", int(_playMode)); _audio->write(xml); } @@ -156,7 +156,7 @@ bool Score::write(Xml& xml, bool selectionOnly) if (pageNumberOffset()) xml.tag("page-offset", pageNumberOffset()); xml.tag("Division", MScore::division); - xml.curTrack = -1; + xml.setCurTrack(-1); _style.save(xml, true); // save only differences to buildin style @@ -180,7 +180,7 @@ bool Score::write(Xml& xml, bool selectionOnly) xml.etag(); } - xml.curTrack = 0; + xml.setCurTrack(0); int staffStart; int staffEnd; MeasureBase* measureStart; @@ -216,21 +216,21 @@ bool Score::write(Xml& xml, bool selectionOnly) part->write(xml); } - xml.curTrack = 0; - xml.trackDiff = -staffStart * VOICES; + xml.setCurTrack(0); + xml.setTrackDiff(-staffStart * VOICES); if (measureStart) { for (int staffIdx = staffStart; staffIdx < staffEnd; ++staffIdx) { xml.stag(QString("Staff id=\"%1\"").arg(staffIdx + 1 - staffStart)); - xml.curTick = measureStart->tick(); - xml.tickDiff = xml.curTick; - xml.curTrack = staffIdx * VOICES; + xml.setCurTick(measureStart->tick()); + xml.setTickDiff(xml.curTick()); + xml.setCurTrack(staffIdx * VOICES); bool writeSystemElements = (staffIdx == staffStart); for (MeasureBase* m = measureStart; m != measureEnd; m = m->next()) writeMeasure(xml, m, staffIdx, writeSystemElements); xml.etag(); } } - xml.curTrack = -1; + xml.setCurTrack(-1); if (isMaster()) { if (!selectionOnly) { for (const Excerpt* excerpt : excerpts()) { @@ -514,7 +514,7 @@ bool Score::saveCompressedFile(QIODevice* f, QFileInfo& info, bool onlySelection QString fn = info.completeBaseName() + ".mscx"; QBuffer cbuf; cbuf.open(QIODevice::ReadWrite); - Xml xml(&cbuf); + Xml xml(this, &cbuf); xml << "\n"; xml.stag("container"); xml.stag("rootfiles"); @@ -646,7 +646,7 @@ bool Score::saveStyle(const QString& name) return false; } - Xml xml(&f); + Xml xml(this, &f); xml.header(); xml.stag("museScore version=\"" MSC_VERSION "\""); _style.save(xml, false); // save complete style @@ -670,8 +670,8 @@ bool Score::saveFile(QIODevice* f, bool msczFormat, bool onlySelection) { if (!MScore::testMode) MScore::testMode = enableTestMode; - Xml xml(f); - xml.writeOmr = msczFormat; + Xml xml(this, f); + xml.setWriteOmr(msczFormat); xml.header(); if (!MScore::testMode) { xml.stag("museScore version=\"" MSC_VERSION "\""); @@ -709,7 +709,7 @@ QString readRootFile(MQZipReader* uz, QList& images) return rootfile; } - XmlReader e(cbuf); + XmlReader e(0, cbuf); while (e.readNextStartElement()) { if (e.name() != "container") { @@ -774,7 +774,7 @@ Score::FileError MasterScore::loadCompressedMsc(QIODevice* io, bool ignoreVersio } } } - XmlReader e(dbuf); + XmlReader e(this, dbuf); e.setDocName(masterScore()->fileInfo()->completeBaseName()); FileError retval = read1(e, ignoreVersionError); @@ -826,7 +826,7 @@ Score::FileError MasterScore::loadMsc(QString name, bool ignoreVersionError) if (name.endsWith(".mscz")) return loadCompressedMsc(&f, ignoreVersionError); else { - XmlReader r(&f); + XmlReader r(this, &f); return read1(r, ignoreVersionError); } } @@ -838,7 +838,7 @@ Score::FileError MasterScore::loadMsc(QString name, QIODevice* io, bool ignoreVe if (name.endsWith(".mscz")) return loadCompressedMsc(io, ignoreVersionError); else { - XmlReader r(io); + XmlReader r(this, io); return read1(r, ignoreVersionError); } } @@ -1071,15 +1071,15 @@ void Score::writeSegments(Xml& xml, int strack, int etrack, // special case: - barline span > 1 // - part (excerpt) staff starts after // barline element - bool needTick = (needFirstTick && segment == fs) || (segment->tick() != xml.curTick); + bool needTick = (needFirstTick && segment == fs) || (segment->tick() != xml.curTick()); if ((segment->isEndBarLineType()) && !e && writeSystemElements && ((track % VOICES) == 0)) { // search barline: for (int idx = track - VOICES; idx >= 0; idx -= VOICES) { if (segment->element(idx)) { - int oDiff = xml.trackDiff; - xml.trackDiff = idx; // staffIdx should be zero + int oDiff = xml.trackDiff(); + xml.setTrackDiff(idx); // staffIdx should be zero segment->element(idx)->write(xml); - xml.trackDiff = oDiff; + xml.setTrackDiff(oDiff); break; } } @@ -1089,9 +1089,9 @@ void Score::writeSegments(Xml& xml, int strack, int etrack, continue; if (needTick) { // xml.tag("tick", segment->tick() - xml.tickDiff); - int tick = xml.clipboardmode ? segment->tick() : segment->rtick(); - xml.tag("move", Fraction::fromTicks(tick + xml.tickDiff)); - xml.curTick = segment->tick(); + int tick = xml.clipboardmode() ? segment->tick() : segment->rtick(); + xml.tag("move", Fraction::fromTicks(tick + xml.tickDiff())); + xml.setCurTick(segment->tick()); needTick = false; } e->write(xml); @@ -1118,9 +1118,9 @@ void Score::writeSegments(Xml& xml, int strack, int etrack, if (s->tick() == segment->tick() && (!clip || end)) { if (needTick) { // xml.tag("tick", segment->tick() - xml.tickDiff); - int tick = xml.clipboardmode ? segment->tick() : segment->rtick(); - xml.tag("move", Fraction::fromTicks(tick + xml.tickDiff)); - xml.curTick = segment->tick(); + int tick = xml.clipboardmode() ? segment->tick() : segment->rtick(); + xml.tag("move", Fraction::fromTicks(tick + xml.tickDiff())); + xml.setCurTick(segment->tick()); needTick = false; } s->write(xml); @@ -1133,9 +1133,9 @@ void Score::writeSegments(Xml& xml, int strack, int etrack, ) { if (needTick) { // xml.tag("tick", segment->tick() - xml.tickDiff); - int tick = xml.clipboardmode ? segment->tick() : segment->rtick(); - xml.tag("move", Fraction::fromTicks(tick + xml.tickDiff)); - xml.curTick = segment->tick(); + int tick = xml.clipboardmode() ? segment->tick() : segment->rtick(); + xml.tag("move", Fraction::fromTicks(tick + xml.tickDiff())); + xml.setCurTick(segment->tick()); needTick = false; } xml.tagE(QString("endSpanner id=\"%1\"").arg(xml.spannerId(s))); @@ -1149,9 +1149,9 @@ void Score::writeSegments(Xml& xml, int strack, int etrack, continue; if (needTick) { // xml.tag("tick", segment->tick() - xml.tickDiff); - int tick = xml.clipboardmode ? segment->tick() : segment->rtick(); - xml.tag("move", Fraction::fromTicks(tick + xml.tickDiff)); - xml.curTick = segment->tick(); + int tick = xml.clipboardmode() ? segment->tick() : segment->rtick(); + xml.tag("move", Fraction::fromTicks(tick + xml.tickDiff())); + xml.setCurTick(segment->tick()); needTick = false; } if (e->isChordRest()) { diff --git a/libmscore/select.cpp b/libmscore/select.cpp index 31845340c18e..594812d695a4 100644 --- a/libmscore/select.cpp +++ b/libmscore/select.cpp @@ -669,9 +669,9 @@ QByteArray Selection::staffMimeData() const { QBuffer buffer; buffer.open(QIODevice::WriteOnly); - Xml xml(&buffer); + Xml xml(score(), &buffer); xml.header(); - xml.clipboardmode = true; + xml.setClipboardmode(true); xml.setFilter(selectionFilter()); int ticks = tickEnd() - tickStart(); @@ -728,9 +728,9 @@ QByteArray Selection::symbolListMimeData() const QBuffer buffer; buffer.open(QIODevice::WriteOnly); - Xml xml(&buffer); + Xml xml(score(), &buffer); xml.header(); - xml.clipboardmode = true; + xml.setClipboardmode(true); int topTrack = 1000000; int bottomTrack = 0; diff --git a/libmscore/staff.cpp b/libmscore/staff.cpp index d3bdddda5c8f..e5a46dad1a2a 100644 --- a/libmscore/staff.cpp +++ b/libmscore/staff.cpp @@ -506,7 +506,7 @@ void Staff::write(Xml& xml) const } // for copy/paste we need to know the actual transposition - if (xml.clipboardmode) { + if (xml.clipboardmode()) { Interval v = part()->instrument()->transpose(); // TODO: tick? if (v.diatonic) xml.tag("transposeDiatonic", v.diatonic); @@ -525,7 +525,7 @@ void Staff::write(Xml& xml) const xml.tag("defaultTransposingClef", ClefInfo::tag(ct._transposingClef)); } - if (small() && !xml.excerptmode) // switch small staves to normal ones when extracting part + if (small() && !xml.excerptmode()) // switch small staves to normal ones when extracting part xml.tag("small", small()); if (invisible()) xml.tag("invisible", invisible()); diff --git a/libmscore/stafftype.cpp b/libmscore/stafftype.cpp index 6cceaf814f91..b5a8de6175f6 100644 --- a/libmscore/stafftype.cpp +++ b/libmscore/stafftype.cpp @@ -1203,7 +1203,7 @@ bool StaffType::readConfigFile(const QString& fileName) return false; } - XmlReader e(&f); + XmlReader e(0, &f); while (e.readNextStartElement()) { if (e.name() == "museScore") { while (e.readNextStartElement()) { diff --git a/libmscore/style.cpp b/libmscore/style.cpp index 9b1dd8614e82..f9600bbe889e 100644 --- a/libmscore/style.cpp +++ b/libmscore/style.cpp @@ -627,7 +627,7 @@ void MStyle::convertToUnit(const QString& tag, const QString& val) bool MStyle::load(QFile* qf) { - XmlReader e(qf); + XmlReader e(0, qf); while (e.readNextStartElement()) { if (e.name() == "museScore") { QString version = e.attribute("version"); diff --git a/libmscore/text.cpp b/libmscore/text.cpp index 8e0f4702cec0..2305175371e1 100644 --- a/libmscore/text.cpp +++ b/libmscore/text.cpp @@ -3109,7 +3109,7 @@ bool Text::validateText(QString& s) d.append(c); } QString ss = "" + d + "\n"; - XmlReader xml(ss); + XmlReader xml(0, ss); while (xml.readNextStartElement()) ; // qDebug(" token %d <%s>", int(xml.tokenType()), qPrintable(xml.name().toString())); if (xml.error() == QXmlStreamReader::NoError) { diff --git a/libmscore/textline.cpp b/libmscore/textline.cpp index 7075c02c5494..78ee2271c9a3 100644 --- a/libmscore/textline.cpp +++ b/libmscore/textline.cpp @@ -38,8 +38,10 @@ void TextLineSegment::layout() TextLineBaseSegment::layout(); if (parent()) { - if (textLine()->placeBelow()) - rypos() = staff()->height() + score()->styleP(StyleIdx::textLinePosBelow) * mag(); + if (textLine()->placeBelow()) { + qreal sh = staff() ? staff()->height() : 0.0; + rypos() = sh + score()->styleP(StyleIdx::textLinePosBelow) * mag(); + } else rypos() = score()->styleP(StyleIdx::textLinePosAbove) * mag(); if (autoplace()) { diff --git a/libmscore/xml.cpp b/libmscore/xml.cpp index 720edda75f65..f37619390b76 100644 --- a/libmscore/xml.cpp +++ b/libmscore/xml.cpp @@ -273,14 +273,16 @@ bool compareProperty(void* val, void* defaultVal) // Xml //--------------------------------------------------------- -Xml::Xml() +Xml::Xml(Score* s) { + _score = s; setCodec("UTF-8"); } -Xml::Xml(QIODevice* device) +Xml::Xml(Score* s, QIODevice* device) : QTextStream(device) { + _score = s; setCodec("UTF-8"); } @@ -873,7 +875,7 @@ int Xml::spannerId(const Spanner* s) bool Xml::canWrite(const Element* e) const { - if (!clipboardmode) + if (!_clipboardmode) return true; return _filter.canSelect(e); } @@ -884,7 +886,7 @@ bool Xml::canWrite(const Element* e) const bool Xml::canWriteVoice(int track) const { - if (!clipboardmode) + if (!_clipboardmode) return true; return _filter.canSelectVoice(track); } diff --git a/libmscore/xml.h b/libmscore/xml.h index a269d456d655..79315247d035 100644 --- a/libmscore/xml.h +++ b/libmscore/xml.h @@ -43,6 +43,7 @@ struct SpannerValues { //--------------------------------------------------------- class XmlReader : public QXmlStreamReader { + Score* _score; QString docName; // used for error reporting // Score read context (for read optimizations): @@ -65,10 +66,10 @@ class XmlReader : public QXmlStreamReader { QMultiMap _tracks; public: - XmlReader(QFile* f) : QXmlStreamReader(f), docName(f->fileName()) {} - XmlReader(const QByteArray& d, const QString& s = QString()) : QXmlStreamReader(d), docName(s) {} - XmlReader(QIODevice* d, const QString& s = QString()) : QXmlStreamReader(d), docName(s) {} - XmlReader(const QString& d, const QString& s = QString()) : QXmlStreamReader(d), docName(s) {} + XmlReader(Score* s, QFile* f) : QXmlStreamReader(f), _score(s), docName(f->fileName()) {} + XmlReader(Score* s, const QByteArray& d, const QString& st = QString()) : QXmlStreamReader(d), _score(s), docName(st) {} + XmlReader(Score* s, QIODevice* d, const QString& st = QString()) : QXmlStreamReader(d), _score(s), docName(st) {} + XmlReader(Score* s, const QString& d, const QString& st = QString()) : QXmlStreamReader(d), _score(s), docName(st) {} bool hasAccidental; // used for userAccidental backward compatibility void unknown(); @@ -131,8 +132,6 @@ class XmlReader : public QXmlStreamReader { void setTransposeChromatic(int v) { _transpose.chromatic = v; } void setTransposeDiatonic(int v) { _transpose.diatonic = v; } -// QList>& clefs(int idx); - QMap& linkIds() { return _elinks; } QMultiMap& tracks() { return _tracks; } @@ -147,32 +146,60 @@ class XmlReader : public QXmlStreamReader { class Xml : public QTextStream { static const int BS = 2048; + Score* _score; QList stack; - void putLevel(); QList> _spanner; - int _spannerId = 1; SelectionFilter _filter; - public: - int curTick = 0; // used to optimize output - int curTrack = -1; - int tickDiff = 0; - int trackDiff = 0; // saved track is curTrack-trackDiff + int _spannerId = { 1 }; + int _curTick = { 0 }; // used to optimize output + int _curTrack = { -1 }; + int _tickDiff = { 0 }; + int _trackDiff = { 0 }; // saved track is curTrack-trackDiff - bool clipboardmode = false; // used to modify write() behaviour - bool excerptmode = false; // true when writing a part - bool writeOmr = true; // false if writing into *.msc file + bool _clipboardmode = { false }; // used to modify write() behaviour + bool _excerptmode = { false }; // true when writing a part + bool _writeOmr = { true }; // false if writing into *.msc file + int _tupletId = { 1 }; + int _beamId = { 1 }; - int tupletId = 1; - int beamId = 1; + void putLevel(); + + public: + Xml(Score*); + Xml(Score* s, QIODevice* dev); + + int spannerId() const { return _spannerId; } + int curTick() const { return _curTick; } + int curTrack() const { return _curTrack; } + int tickDiff() const { return _tickDiff; } + int trackDiff() const { return _trackDiff; } + + bool clipboardmode() const { return _clipboardmode; } + bool excerptmode() const { return _excerptmode; } + bool writeOmr() const { return _writeOmr; } +// int tupletId() const { return _tupletId; } + int nextTupletId() { return _tupletId++; } +// int beamId() const { return _beamId; } + int nextBeamId() { return _beamId++; } + + void setClipboardmode(bool v) { _clipboardmode = v; } + void setExcerptmode(bool v) { _excerptmode = v; } + void setWriteOmr(bool v) { _writeOmr = v; } + void setTupletId(int v) { _tupletId = v; } + void setBeamId(int v) { _beamId = v; } + void setSpannerId(int v) { _spannerId = v; } + void setCurTick(int v) { _curTick = v; } + void setCurTrack(int v) { _curTrack = v; } + void setTickDiff(int v) { _tickDiff = v; } + void setTrackDiff(int v) { _trackDiff = v; } + + void incCurTick(int v) { _curTick += v; } int addSpanner(const Spanner*); // returns allocated id const Spanner* findSpanner(int id); int spannerId(const Spanner*); // returns spanner id, allocates new one if none exists - Xml(QIODevice* dev); - Xml(); - void sTag(const char* name, Spatium sp) { Xml::tag(name, QVariant(sp.val())); } void pTag(const char* name, PlaceText); diff --git a/mscore/album.cpp b/mscore/album.cpp index 1c7312104f12..75be2b92f530 100644 --- a/mscore/album.cpp +++ b/mscore/album.cpp @@ -246,7 +246,7 @@ bool Album::read(const QString& p) return false; } - XmlReader e(&f); + XmlReader e(gscore, &f); while (e.readNextStartElement()) { if (e.name() == "museScore") { QString version = e.attribute("version"); diff --git a/mscore/albummanager.cpp b/mscore/albummanager.cpp index 7a1df1936925..af7b829c9cee 100644 --- a/mscore/albummanager.cpp +++ b/mscore/albummanager.cpp @@ -320,7 +320,7 @@ void AlbumManager::writeAlbum() QMessageBox::critical(mscore, QWidget::tr("MuseScore: Open Album File"), s.arg(album->path())); return; } - Xml xml(&f); + Xml xml(gscore, &f); album->write(xml); if (f.error() != QFile::NoError) { QString s = QWidget::tr("Write Album failed: ") + f.errorString(); diff --git a/mscore/capxml.cpp b/mscore/capxml.cpp index e6fbe05a7096..3b6051e8a6ed 100644 --- a/mscore/capxml.cpp +++ b/mscore/capxml.cpp @@ -1192,7 +1192,7 @@ Score::FileError importCapXml(MasterScore* score, const QString& name) } QByteArray dbuf = uz.fileData("score.xml"); - XmlReader e(dbuf); + XmlReader e(score, dbuf); e.setDocName(name); Capella cf; diff --git a/mscore/dragdrop.cpp b/mscore/dragdrop.cpp index 2015e64ed34e..0fe2ec99d150 100644 --- a/mscore/dragdrop.cpp +++ b/mscore/dragdrop.cpp @@ -213,7 +213,7 @@ void ScoreView::dragEnterEvent(QDragEnterEvent* event) if (MScore::debugMode) qDebug("ScoreView::dragEnterEvent Symbol: <%s>", a.data()); - XmlReader e(a); + XmlReader e(_score, a); dragOffset = QPoint(); Fraction duration; // dummy Element::Type type = Element::readType(e, &dragOffset, &duration); @@ -700,7 +700,7 @@ void ScoreView::dropEvent(QDropEvent* event) } else if (etype == Element::Type::MEASURE_LIST || etype == Element::Type::STAFF_LIST) { _score->startCmd(); - XmlReader xml(data); + XmlReader xml(_score, data); System* s = measure->system(); int idx = s->y2staff(pos.y()); if (idx != -1) { diff --git a/mscore/editdrumset.cpp b/mscore/editdrumset.cpp index ed6327c85dc1..ab171096d925 100644 --- a/mscore/editdrumset.cpp +++ b/mscore/editdrumset.cpp @@ -340,7 +340,7 @@ void EditDrumset::load() if (!fp.open(QIODevice::ReadOnly)) return; - XmlReader e(&fp); + XmlReader e(0, &fp); nDrumset.clear(); while (e.readNextStartElement()) { if (e.name() == "museScore") { @@ -378,7 +378,7 @@ void EditDrumset::save() return; } valueChanged(); //save last changes in name - Xml xml(&f); + Xml xml(0, &f); xml.header(); xml.stag("museScore version=\"" MSC_VERSION "\""); nDrumset.save(xml); diff --git a/mscore/exampleview.cpp b/mscore/exampleview.cpp index 8771d9bfa8b5..086b1b66b838 100644 --- a/mscore/exampleview.cpp +++ b/mscore/exampleview.cpp @@ -176,7 +176,7 @@ void ExampleView::dragEnterEvent(QDragEnterEvent* event) // qDebug("ExampleView::dragEnterEvent Symbol: <%s>", a.data()); - XmlReader e(a); + XmlReader e(score(), a); QPointF dragOffset; Fraction duration; // dummy Element::Type type = Element::readType(e, &dragOffset, &duration); diff --git a/mscore/exportxml.cpp b/mscore/exportxml.cpp index 1b1e4f419b47..cfeee829a22a 100644 --- a/mscore/exportxml.cpp +++ b/mscore/exportxml.cpp @@ -311,6 +311,7 @@ class ExportMusicXml { public: ExportMusicXml(Score* s) + : xml(s) { _score = s; tick = 0; div = 1; tenths = 40; millimeters = _score->spatium() * tenths / (10 * DPMM); @@ -5465,7 +5466,7 @@ bool saveMxl(Score* score, const QString& name) QBuffer cbuf; cbuf.open(QIODevice::ReadWrite); - Xml xml; + Xml xml(score); xml.setDevice(&cbuf); xml.setCodec("UTF-8"); xml << "\n"; diff --git a/mscore/harmonyedit.cpp b/mscore/harmonyedit.cpp index ea545696696c..fbfd8d168455 100644 --- a/mscore/harmonyedit.cpp +++ b/mscore/harmonyedit.cpp @@ -507,7 +507,7 @@ void HarmonyCanvas::dragEnterEvent(QDragEnterEvent* event) if (data->hasFormat(mimeSymbolFormat)) { QByteArray a = data->data(mimeSymbolFormat); - XmlReader e(a); + XmlReader e(gscore, a); QPointF dragOffset; Fraction duration; diff --git a/mscore/instrdialog.cpp b/mscore/instrdialog.cpp index b413e715d0c9..069deb29fa9f 100644 --- a/mscore/instrdialog.cpp +++ b/mscore/instrdialog.cpp @@ -90,12 +90,12 @@ void InstrumentsDialog::on_saveButton_clicked() return; } - Xml xml(&f); + Xml xml(0, &f); xml.header(); xml.stag("museScore version=\"" MSC_VERSION "\""); - foreach(InstrumentGroup* g, instrumentGroups) { + for (InstrumentGroup* g : instrumentGroups) { xml.stag(QString("InstrumentGroup name=\"%1\" extended=\"%2\"").arg(g->name).arg(g->extended)); - foreach(InstrumentTemplate* t, g->instrumentTemplates) + for (InstrumentTemplate* t : g->instrumentTemplates) t->write(xml); xml.etag(); } diff --git a/mscore/keyedit.cpp b/mscore/keyedit.cpp index 0fef0d72d9f9..f2eba9e1417e 100644 --- a/mscore/keyedit.cpp +++ b/mscore/keyedit.cpp @@ -194,7 +194,7 @@ void KeyCanvas::dragEnterEvent(QDragEnterEvent* event) if (data->hasFormat(mimeSymbolFormat)) { QByteArray a = data->data(mimeSymbolFormat); - XmlReader e(a); + XmlReader e(gscore, a); QPointF dragOffset; Fraction duration; diff --git a/mscore/musescore.cpp b/mscore/musescore.cpp index d9b3230f4747..934c489a5713 100644 --- a/mscore/musescore.cpp +++ b/mscore/musescore.cpp @@ -3677,7 +3677,7 @@ void MuseScore::writeSessionFile(bool cleanExit) qDebug("cannot create session file <%s>", qPrintable(f.fileName())); return; } - Xml xml(&f); + Xml xml(0, &f); xml.header(); xml.stag("museScore version=\"" MSC_VERSION "\""); xml.tagE(cleanExit ? "clean" : "dirty"); @@ -3832,7 +3832,7 @@ bool MuseScore::restoreSession(bool always) qDebug("Cannot open session file <%s>", qPrintable(f.fileName())); return false; } - XmlReader e(&f); + XmlReader e(0, &f); int tab = 0; int idx = -1; bool cleanExit = false; diff --git a/mscore/palette.cpp b/mscore/palette.cpp index 0a9beb5fad48..ab7ec027017b 100644 --- a/mscore/palette.cpp +++ b/mscore/palette.cpp @@ -374,7 +374,7 @@ static void applyDrop(Score* score, ScoreView* viewer, Element* target, Element* // use same code path as drag&drop QByteArray a = e->mimeData(QPointF()); - XmlReader e(a); + XmlReader e(gscore, a); Fraction duration; // dummy QPointF dragOffset; Element::Type type = Element::readType(e, &dragOffset, &duration); @@ -462,7 +462,7 @@ void Palette::mouseDoubleClickEvent(QMouseEvent* ev) int idx = cr1->staffIdx(); QByteArray a = element->mimeData(QPointF()); - XmlReader e(a); + XmlReader e(gscore, a); Fraction duration; // dummy QPointF dragOffset; Element::Type type = Element::readType(e, &dragOffset, &duration); @@ -1093,7 +1093,7 @@ void Palette::write(Xml& xml) const bool Palette::read(QFile* qf) { - XmlReader e(qf); + XmlReader e(gscore, qf); while (e.readNextStartElement()) { if (e.name() == "museScore") { QString version = e.attribute("version"); @@ -1135,7 +1135,7 @@ bool Palette::read(const QString& p) QByteArray ba = f.fileData("META-INF/container.xml"); - XmlReader e(ba); + XmlReader e(gscore, ba); // extract first rootfile QString rootfile = ""; QList images; @@ -1245,7 +1245,7 @@ void Palette::write(const QString& p) } QBuffer cbuf; cbuf.open(QIODevice::ReadWrite); - Xml xml(&cbuf); + Xml xml(gscore, &cbuf); xml.header(); xml.stag("container"); xml.stag("rootfiles"); @@ -1270,7 +1270,7 @@ void Palette::write(const QString& p) { QBuffer cbuf; cbuf.open(QIODevice::ReadWrite); - Xml xml(&cbuf); + Xml xml(gscore, &cbuf); xml.header(); xml.stag("museScore version=\"" MSC_VERSION "\""); write(xml); @@ -1645,7 +1645,7 @@ void Palette::dropEvent(QDropEvent* event) } else if (data->hasFormat(mimeSymbolFormat)) { QByteArray data(event->mimeData()->data(mimeSymbolFormat)); - XmlReader xml(data); + XmlReader xml(gscore, data); QPointF dragOffset; Fraction duration; Element::Type type = Element::readType(xml, &dragOffset, &duration); diff --git a/mscore/preferences.cpp b/mscore/preferences.cpp index ac15c16147b9..da32569b6468 100644 --- a/mscore/preferences.cpp +++ b/mscore/preferences.cpp @@ -1772,7 +1772,7 @@ bool Preferences::readPluginList() qDebug("Cannot open plugins file <%s>", qPrintable(f.fileName())); return false; } - XmlReader e(&f); + XmlReader e(0, &f); while (e.readNextStartElement()) { if (e.name() == "museScore") { while (e.readNextStartElement()) { @@ -1823,7 +1823,7 @@ void Preferences::writePluginList() qDebug("cannot create plugin file <%s>", qPrintable(f.fileName())); return; } - Xml xml(&f); + Xml xml(0, &f); xml.header(); xml.stag("museScore version=\"" MSC_VERSION "\""); foreach(const PluginDescription& d, pluginList) { diff --git a/mscore/savePositions.cpp b/mscore/savePositions.cpp index c12b492d95eb..1ae1df9932ec 100644 --- a/mscore/savePositions.cpp +++ b/mscore/savePositions.cpp @@ -53,7 +53,7 @@ bool savePositions(Score* score, const QString& name, bool segments) qDebug("Open <%s> failed", qPrintable(name)); return false; } - Xml xml(&fp); + Xml xml(score, &fp); xml.header(); xml.stag("score"); xml.stag("elements"); diff --git a/mscore/scoreview.cpp b/mscore/scoreview.cpp index 5342c288aa57..173583e386ea 100644 --- a/mscore/scoreview.cpp +++ b/mscore/scoreview.cpp @@ -2679,7 +2679,7 @@ void ScoreView::normalSwap() if (mimeType == mimeStaffListFormat) { // determine size of clipboard selection int tickLen = 0, staves = 0; QByteArray data(ms->data(mimeStaffListFormat)); - XmlReader e(data); + XmlReader e(_score, data); e.readNextStartElement(); if (e.name() == "StaffList") { tickLen = e.intAttribute("len", 0); @@ -5811,7 +5811,7 @@ void ScoreView::cmdRepeatSelection() QApplication::clipboard()->setMimeData(mimeData); QByteArray data(mimeData->data(mimeType)); - XmlReader xml(data); + XmlReader xml(_score, data); xml.setPasteMode(true); int dStaff = selection.staffStart(); diff --git a/mscore/shortcut.cpp b/mscore/shortcut.cpp index 8e0b5381e5cb..fc00246a6983 100644 --- a/mscore/shortcut.cpp +++ b/mscore/shortcut.cpp @@ -3753,7 +3753,7 @@ void Shortcut::save() qDebug("cannot save shortcuts"); return; } - Xml xml(&f); + Xml xml(0, &f); xml.header(); xml.stag("Shortcuts"); for (auto i : _sc) @@ -3822,7 +3822,7 @@ void Shortcut::load() if (MScore::debugMode) qDebug("read shortcuts from <%s>", qPrintable(f.fileName())); - XmlReader e(&f); + XmlReader e(0, &f); while (e.readNextStartElement()) { if (e.name() == "Shortcuts") { @@ -3885,7 +3885,7 @@ static QList loadDefaultShortcuts() qDebug("Cannot open shortcuts"); return list; } - XmlReader e(&f); + XmlReader e(0, &f); while (e.readNextStartElement()) { if (e.name() == "Shortcuts") { while (e.readNextStartElement()) { diff --git a/mscore/synthcontrol.cpp b/mscore/synthcontrol.cpp index 53edaabe5945..815a15bbb0c5 100644 --- a/mscore/synthcontrol.cpp +++ b/mscore/synthcontrol.cpp @@ -304,7 +304,7 @@ void SynthControl::recallButtonClicked() qDebug("cannot read synthesizer settings <%s>", qPrintable(s)); return; } - XmlReader e(&f); + XmlReader e(0, &f); while (e.readNextStartElement()) { if (e.name() == "Synthesizer") state.read(e); @@ -339,7 +339,7 @@ void SynthControl::storeButtonClicked() qDebug("cannot write synthesizer settings <%s>", qPrintable(s)); return; } - Xml xml(&f); + Xml xml(0, &f); xml.header(); synti->state().write(xml); diff --git a/mscore/workspace.cpp b/mscore/workspace.cpp index 352a566f25e7..359773b2a9eb 100644 --- a/mscore/workspace.cpp +++ b/mscore/workspace.cpp @@ -279,7 +279,7 @@ void Workspace::write() QBuffer cbuf; cbuf.open(QIODevice::ReadWrite); - Xml xml(&cbuf); + Xml xml(gscore, &cbuf); xml.header(); xml.stag("container"); xml.stag("rootfiles"); @@ -306,8 +306,8 @@ void Workspace::write() { QBuffer cbuf; cbuf.open(QIODevice::ReadWrite); - Xml xml(&cbuf); - xml.clipboardmode = true; + Xml xml(gscore, &cbuf); + xml.setClipboardmode(true); xml.header(); xml.stag("museScore version=\"" MSC_VERSION "\""); xml.stag("Workspace"); @@ -378,7 +378,7 @@ void Workspace::read() } QByteArray ba = f.fileData(rootfile); - XmlReader e(ba); + XmlReader e(gscore, ba); while (e.readNextStartElement()) { if (e.name() == "museScore") { diff --git a/mtest/libmscore/text/tst_text.cpp b/mtest/libmscore/text/tst_text.cpp index 62017f52d5d7..1f0c39ab7533 100644 --- a/mtest/libmscore/text/tst_text.cpp +++ b/mtest/libmscore/text/tst_text.cpp @@ -378,11 +378,11 @@ void TestText::testReadWrite() { auto testrw = [](Score* score, Text* t) { QBuffer buffer; buffer.open(QIODevice::WriteOnly); - Xml xml(&buffer); + Xml xml(score, &buffer); t->write(xml); buffer.close(); - XmlReader e(buffer.buffer()); + XmlReader e(score, buffer.buffer()); Text* text2 = new Text(score); e.readNextStartElement(); text2->read(e); @@ -391,27 +391,27 @@ void TestText::testReadWrite() { Text* text = new Text(score); text->setXmlText("test"); testrw(score, text); - + text = new Text(score); text->setXmlText("Titletwo"); testrw(score, text); - + text = new Text(score); text->setXmlText("Title Two"); testrw(score, text); - + text = new Text(score); text->setXmlText("Title Two"); testrw(score, text); - + text = new Text(score); text->setXmlText("Title\tTwo"); testrw(score, text); - + text = new Text(score); text->setXmlText("Title\nTwo"); testrw(score, text); - + text = new Text(score); text->setXmlText("Ti tleTw o"); testrw(score, text); diff --git a/mtest/testutils.cpp b/mtest/testutils.cpp index 774c7da5a388..54731813445b 100644 --- a/mtest/testutils.cpp +++ b/mtest/testutils.cpp @@ -89,7 +89,7 @@ Element* MTest::writeReadElement(Element* element) // QBuffer buffer; buffer.open(QIODevice::WriteOnly); - Xml xml(&buffer); + Xml xml(element->score(), &buffer); xml.header(); element->write(xml); buffer.close(); @@ -100,7 +100,7 @@ Element* MTest::writeReadElement(Element* element) // printf("===read <%s>===\n", element->name()); // printf("%s\n", buffer.buffer().data()); - XmlReader e(buffer.buffer()); + XmlReader e(element->score(), buffer.buffer()); e.readNextStartElement(); QString tag(e.name().toString()); // printf("read tag %s\n", qPrintable(tag)); diff --git a/synthesizer/msynthesizer.cpp b/synthesizer/msynthesizer.cpp index d6ea855d79c2..a5d74d88effd 100644 --- a/synthesizer/msynthesizer.cpp +++ b/synthesizer/msynthesizer.cpp @@ -68,7 +68,7 @@ void MasterSynthesizer::init() setState(defaultState); return; } - XmlReader e(&f); + XmlReader e(0, &f); while (e.readNextStartElement()) { if (e.name() == "Synthesizer") state.read(e); diff --git a/zerberus/instrument.cpp b/zerberus/instrument.cpp index 23d157f6705e..7acd70fe1502 100644 --- a/zerberus/instrument.cpp +++ b/zerberus/instrument.cpp @@ -181,7 +181,7 @@ bool ZInstrument::loadFromFile(const QString& path) bool ZInstrument::read(const QByteArray& buf, MQZipReader* /*uz*/, const QString& /*path*/) { - Ms::XmlReader e(buf); + Ms::XmlReader e(0, buf); while (e.readNextStartElement()) { if (e.name() == "MuseSynth") { while (e.readNextStartElement()) {