void Volta::read(XmlReader& e) { qDeleteAll(spannerSegments()); spannerSegments().clear(); e.addSpanner(e.intAttribute("id", -1), this); while (e.readNextStartElement()) { const QStringRef& tag(e.name()); if (tag == "text") // obsolete setText(e.readElementText()); else if (tag == "endings") { QString s = e.readElementText(); QStringList sl = s.split(",", QString::SkipEmptyParts); _endings.clear(); for (const QString& l : sl) { int i = l.simplified().toInt(); _endings.append(i); } } else if (tag == "lineWidth") { setLineWidth(Spatium(e.readDouble())); lineWidthStyle = PropertyStyle::UNSTYLED; } else if (tag == "subtype") { // obsolete int st = e.readInt(); if (st == 1) setEndHook(true); } else if (!TextLineBase::readProperties(e)) e.unknown(); } }
void Hairpin::read(XmlReader& e) { foreach(SpannerSegment* seg, spannerSegments()) delete seg; spannerSegments().clear(); setId(e.intAttribute("id", -1)); while (e.readNextStartElement()) { const QStringRef& tag(e.name()); if (tag == "subtype") _hairpinType = HairpinType(e.readInt()); else if (tag == "lineWidth") { setLineWidth(Spatium(e.readDouble())); lineWidthStyle = PropertyStyle::UNSTYLED; } else if (tag == "hairpinHeight") { setHairpinHeight(Spatium(e.readDouble())); hairpinHeightStyle = PropertyStyle::UNSTYLED; } else if (tag == "hairpinContHeight") { setHairpinContHeight(Spatium(e.readDouble())); hairpinContHeightStyle = PropertyStyle::UNSTYLED; } else if (tag == "veloChange") _veloChange = e.readInt(); else if (tag == "dynType") _dynRange = DynamicRange(e.readInt()); else if (!SLine::readProperties(e)) e.unknown(); } }
void Ottava::read(XmlReader& e) { qDeleteAll(spannerSegments()); spannerSegments().clear(); e.addSpanner(e.intAttribute("id", -1), this); while (e.readNextStartElement()) { const QStringRef& tag(e.name()); if (tag == "subtype") { QString s = e.readElementText(); bool ok; int idx = s.toInt(&ok); if (!ok) { idx = int(Type::OTTAVA_8VA); for (unsigned i = 0; i < sizeof(ottavaDefault)/sizeof(*ottavaDefault); ++i) { if (s == ottavaDefault[i].name) { idx = i; break; } } } else if (score()->mscVersion() <= 114) { //subtype are now in a different order... if (idx == 1) idx = 2; else if (idx == 2) idx = 1; } setOttavaType(Type(idx)); } else if (tag == "numbersOnly") { _numbersOnly = e.readInt(); numbersOnlyStyle = PropertyStyle::UNSTYLED; } else if (tag == "lineWidth") { setLineWidth(Spatium(e.readDouble())); lineWidthStyle = PropertyStyle::UNSTYLED; } else if (tag == "lineStyle") { setLineStyle(Qt::PenStyle(e.readInt())); lineStyleStyle = PropertyStyle::UNSTYLED; } else if (tag == "beginSymbol") { // obsolete beginTextStyle = PropertyStyle::UNSTYLED; QString text(e.readElementText()); setBeginText(QString("<sym>%1</sym>").arg(text[0].isNumber() ? Sym::id2name(SymId(text.toInt())) : text)); } else if (tag == "continueSymbol") { // obsolete continueTextStyle = PropertyStyle::UNSTYLED; QString text(e.readElementText()); setContinueText(QString("<sym>%1</sym>").arg(text[0].isNumber() ? Sym::id2name(SymId(text.toInt())) : text)); } else if (!TextLine::readProperties(e)) e.unknown(); } if (beginText() != propertyDefault(P_ID::BEGIN_TEXT)) beginTextStyle = PropertyStyle::UNSTYLED; if (continueText() != propertyDefault(P_ID::CONTINUE_TEXT)) continueTextStyle = PropertyStyle::UNSTYLED; }
void Ottava::read(XmlReader& e) { qDeleteAll(spannerSegments()); spannerSegments().clear(); e.addSpanner(e.intAttribute("id", -1), this); while (e.readNextStartElement()) readProperties(e); updateStyledProperties(); }
void TextLine::read(XmlReader& e) { qDeleteAll(spannerSegments()); spannerSegments().clear(); setId(e.intAttribute("id", -1)); while (e.readNextStartElement()) { if (!readProperties(e)) e.unknown(); } }
void TextLine::read(const QDomElement& de) { foreach(SpannerSegment* seg, spannerSegments()) delete seg; spannerSegments().clear(); setId(de.attribute("id", "-1").toInt()); for (QDomElement e = de.firstChildElement(); !e.isNull(); e = e.nextSiblingElement()) { if (!readProperties(e)) domError(e); } }
void SLine::read(XmlReader& e) { foreach(SpannerSegment* seg, spannerSegments()) delete seg; spannerSegments().clear(); setId(e.intAttribute("id", -1)); while (e.readNextStartElement()) { if (!SLine::readProperties(e)) e.unknown(); } }
void Trill::layout() { SLine::layout(); if (score() == gscore) return; if (spannerSegments().empty()) return; TrillSegment* ls = toTrillSegment(frontSegment()); if (spannerSegments().empty()) qDebug("Trill: no segments"); if (_accidental) _accidental->setParent(ls); }
void Ottava::setOttavaType(OttavaType val) { setEndHook(true); _ottavaType = val; const OttavaDefault* def = &ottavaDefault[int(val)]; Spatium hook(score()->styleS(ST_ottavaHook)); SymId id = _numbersOnly ? def->numbersOnlyId : def->id; if (symIsValid(id)) { if (beginSymbolStyle == PropertyStyle::STYLED) setBeginSymbol(id); if (continueSymbolStyle == PropertyStyle::STYLED) setContinueSymbol(id); setBeginSymbolOffset(def->offset); setContinueSymbolOffset(def->offset); foreach(SpannerSegment* s, spannerSegments()) { OttavaSegment* os = static_cast<OttavaSegment*>(s); os->clearText(); } delete _beginText; _beginText = 0; delete _continueText; _continueText = 0; }
QRectF SLine::bbox() const { if (spannerSegments().isEmpty()) return QRectF(); else return segmentAt(0)->bbox(); }
void Ottava::setOttavaType(OttavaType val) { setEndHook(true); _ottavaType = val; Spatium hook(score()->styleS(ST_ottavaHook)); SymId id; if (_numbersOnly) id = ottavaDefault[int(val)].numbersOnlyId; else id = ottavaDefault[int(val)].id; if (beginSymbolStyle == PropertyStyle::STYLED) setBeginSymbol(id); if (continueSymbolStyle == PropertyStyle::STYLED) setContinueSymbol(id); setBeginSymbolOffset(ottavaDefault[int(val)].offset); setContinueSymbolOffset(ottavaDefault[int(val)].offset); setEndHookHeight(hook * ottavaDefault[int(val)].hookDirection); setPlacement(ottavaDefault[int(val)].place); _pitchShift = ottavaDefault[int(val)].shift; foreach(SpannerSegment* s, spannerSegments()) { OttavaSegment* os = static_cast<OttavaSegment*>(s); os->clearText(); }
void Trill::layout() { qreal _spatium = spatium(); SLine::layout(); if (score() == gscore) return; TrillSegment* ls = static_cast<TrillSegment*>(frontSegment()); // // special case: // if end segment is first chord/rest segment in measure, // shorten trill line so it ends at end of previous measure // Segment* seg1 = startSegment(); Segment* seg2 = endSegment(); if (seg2 && (seg1->system() == seg2->system()) && (spannerSegments().size() == 1) && (seg2->tick() == seg2->measure()->tick()) ) { qreal x1 = seg2->pagePos().x(); Measure* m = seg2->measure()->prevMeasure(); if (m) { Segment* s2 = m->last(); qreal x2 = s2->pagePos().x(); qreal dx = x1 - x2 + _spatium * .3; ls->setPos2(ls->ipos2() + QPointF(-dx, 0.0)); ls->layout(); } } if (_accidental) _accidental->setParent(ls); }
void SLine::writeProperties(Xml& xml, const SLine* proto) const { Element::writeProperties(xml); if (_diagonal && (proto == 0 || proto->diagonal() != _diagonal)) xml.tag("diagonal", _diagonal); if (anchor() != ANCHOR_SEGMENT && (proto == 0 || proto->anchor() != anchor())) xml.tag("anchor", anchor()); if (score() == gscore) { // when used as icon if (!spannerSegments().isEmpty()) { LineSegment* s = frontSegment(); xml.tag("length", s->pos2().x()); } else xml.tag("length", spatium() * 4); return; } // // check if user has modified the default layout // bool modified = false; int n = spannerSegments().size(); for (int i = 0; i < n; ++i) { const LineSegment* seg = segmentAt(i); if (!seg->userOff().isNull() || !seg->userOff2().isNull() || !seg->visible()) { modified = true; break; } } if (!modified) return; // // write user modified layout // qreal _spatium = spatium(); for (int i = 0; i < n; ++i) { const LineSegment* seg = segmentAt(i); xml.stag("Segment"); xml.tag("subtype", seg->subtype()); xml.tag("off2", seg->userOff2() / _spatium); seg->Element::writeProperties(xml); xml.etag(); } }
void Hairpin::read(XmlReader& e) { foreach(SpannerSegment* seg, spannerSegments()) delete seg; spannerSegments().clear(); int id = e.intAttribute("id", -1); e.addSpanner(id, this); while (e.readNextStartElement()) { const QStringRef& tag(e.name()); if (tag == "subtype") _hairpinType = Type(e.readInt()); else if (tag == "lineWidth") { setLineWidth(Spatium(e.readDouble())); lineWidthStyle = PropertyStyle::UNSTYLED; } else if (tag == "hairpinHeight") { setHairpinHeight(Spatium(e.readDouble())); hairpinHeightStyle = PropertyStyle::UNSTYLED; } else if (tag == "hairpinContHeight") { setHairpinContHeight(Spatium(e.readDouble())); hairpinContHeightStyle = PropertyStyle::UNSTYLED; } else if (tag == "hairpinCircledTip") _hairpinCircledTip = e.readInt(); else if (tag == "veloChange") _veloChange = e.readInt(); else if (tag == "dynType") _dynRange = Dynamic::Range(e.readInt()); else if (tag == "useTextLine") _useTextLine = e.readInt(); else if (!TextLine::readProperties(e)) e.unknown(); } // add default text to legacy hairpins if (score()->mscVersion() <= 206 && !_useTextLine) { bool cresc = _hairpinType == Hairpin::Type::CRESCENDO; if (!_beginText) setBeginText(cresc ? "cresc." : "dim."); if (!_continueText) setContinueText(cresc ? "(cresc.)" : "(dim.)"); } }
void SLine::setLen(qreal l) { if (spannerSegments().isEmpty()) add(createLineSegment()); LineSegment* s = frontSegment(); s->setPos(QPointF()); s->setPos2(QPointF(l, 0)); }
const QRectF& SLine::bbox() const { if (spannerSegments().isEmpty()) setbbox(QRectF()); else setbbox(segmentAt(0)->bbox()); return Element::bbox(); }
void Trill::read(QDomElement e) { foreach(SpannerSegment* seg, spannerSegments()) delete seg; spannerSegments().clear(); setId(e.attribute("id", "-1").toInt()); for (e = e.firstChildElement(); !e.isNull(); e = e.nextSiblingElement()) { QString tag(e.tagName()); QString val(e.text()); if (tag == "Accidental") { _accidental = new Accidental(score()); _accidental->read(e); } else if (!SLine::readProperties(e)) domError(e); } }
void Spanner::removeUnmanaged() { for (SpannerSegment* ss : spannerSegments()) if (ss->system()) { // ss->system()->remove(ss); ss->setSystem(nullptr); } score()->removeUnmanagedSpanner(this); }
void Trill::read(XmlReader& e) { qDeleteAll(spannerSegments()); spannerSegments().clear(); e.addSpanner(e.intAttribute("id", -1), this); while (e.readNextStartElement()) { const QStringRef& tag(e.name()); if (tag == "subtype") setTrillType(e.readElementText()); else if (tag == "Accidental") { _accidental = new Accidental(score()); _accidental->read(e); _accidental->setParent(this); } else if (!SLine::readProperties(e)) e.unknown(); } }
void Hairpin::read(XmlReader& e) { foreach(SpannerSegment* seg, spannerSegments()) delete seg; spannerSegments().clear(); setId(e.intAttribute("id", -1)); while (e.readNextStartElement()) { const QStringRef& tag(e.name()); if (tag == "subtype") _hairpinType = HairpinType(e.readInt()); else if (tag == "veloChange") _veloChange = e.readInt(); else if (tag == "dynType") _dynRange = DynamicRange(e.readInt()); else if (!SLine::readProperties(e)) e.unknown(); } }
void Spanner::startEdit(MuseScoreView*, const QPointF&) { editTick = _tick; editTick2 = _tick2; userOffsets.clear(); userOffsets2.clear(); foreach (SpannerSegment* ss, spannerSegments()) { userOffsets.push_back(ss->userOff()); userOffsets2.push_back(ss->userOff2()); }
void Vibrato::layout() { SLine::layout(); if (score() == gscore) return; if (spannerSegments().empty()) { qDebug("Vibrato: no segments"); return; } }
void Glissando::read(XmlReader& e) { qDeleteAll(spannerSegments()); spannerSegments().clear(); e.addSpanner(e.intAttribute("id", -1), this); _showText = false; while (e.readNextStartElement()) { const QStringRef& tag = e.name(); if (tag == "text") { _showText = true; _text = e.readElementText(); } else if (tag == "subtype") _glissandoType = Type(e.readInt()); else if (!SLine::readProperties(e)) e.unknown(); } }
void Volta::read(XmlReader& e) { qDeleteAll(spannerSegments()); spannerSegments().clear(); e.addSpanner(e.intAttribute("id", -1), this); while (e.readNextStartElement()) { const QStringRef& tag(e.name()); if (tag == "text") // obsolete setText(e.readElementText()); else if (tag == "endings") { QString s = e.readElementText(); QStringList sl = s.split(",", QString::SkipEmptyParts); _endings.clear(); foreach(const QString& l, sl) { int i = l.simplified().toInt(); _endings.append(i); } }
void Hairpin::read(XmlReader& e) { foreach(SpannerSegment* seg, spannerSegments()) delete seg; spannerSegments().clear(); int id = e.intAttribute("id", -1); e.addSpanner(id, this); while (e.readNextStartElement()) { const QStringRef& tag(e.name()); if (tag == "subtype") setHairpinType(Type(e.readInt())); else if (tag == "lineWidth") { setLineWidth(Spatium(e.readDouble())); lineWidthStyle = PropertyStyle::UNSTYLED; } else if (tag == "hairpinHeight") { setHairpinHeight(Spatium(e.readDouble())); hairpinHeightStyle = PropertyStyle::UNSTYLED; } else if (tag == "hairpinContHeight") { setHairpinContHeight(Spatium(e.readDouble())); hairpinContHeightStyle = PropertyStyle::UNSTYLED; } else if (tag == "hairpinCircledTip") _hairpinCircledTip = e.readInt(); else if (tag == "veloChange") _veloChange = e.readInt(); else if (tag == "dynType") _dynRange = Dynamic::Range(e.readInt()); else if (tag == "useTextLine") { // obsolete e.readInt(); if (hairpinType() == Type::CRESC_HAIRPIN) setHairpinType(Type::CRESC_LINE); else if (hairpinType() == Type::DECRESC_HAIRPIN) setHairpinType(Type::DECRESC_LINE); } else if (!TextLine::readProperties(e)) e.unknown(); } }
void Volta::read(const QDomElement& de) { foreach(SpannerSegment* seg, spannerSegments()) delete seg; spannerSegments().clear(); setId(de.attribute("id", "-1").toInt()); for (QDomElement e = de.firstChildElement(); !e.isNull(); e = e.nextSiblingElement()) { const QString& tag(e.tagName()); if (tag == "subtype") setSubtype(VoltaType(e.text().toInt())); else if (tag == "text") // obsolete setText(e.text()); else if (tag == "endings") { QString s = e.text(); QStringList sl = s.split(",", QString::SkipEmptyParts); _endings.clear(); foreach(const QString& l, sl) { int i = l.simplified().toInt(); _endings.append(i); } }
void Volta::read(XmlReader& e) { qDeleteAll(spannerSegments()); spannerSegments().clear(); e.addSpanner(e.intAttribute("id", -1), this); while (e.readNextStartElement()) { const QStringRef& tag(e.name()); if (tag == "endings") { QString s = e.readElementText(); QStringList sl = s.split(",", QString::SkipEmptyParts); _endings.clear(); for (const QString& l : sl) { int i = l.simplified().toInt(); _endings.append(i); } } else if (!TextLineBase::readProperties(e)) e.unknown(); } }
void Trill::layout() { SLine::layout(); if (score() == gscore) return; if (spannerSegments().empty()) return; TrillSegment* ls = toTrillSegment(frontSegment()); #if 0 // this is now handled differently, in SLine::linePos // // special case: // if end segment is first chord/rest segment in measure, // shorten trill line so it ends at end of previous measure // qreal _spatium = spatium(); Segment* seg1 = startSegment(); Segment* seg2 = endSegment(); if (seg1 && seg2 && (seg1->system() == seg2->system()) && (spannerSegments().size() == 1) && (seg2->tick() == seg2->measure()->tick()) ) { qreal x1 = seg2->pagePos().x(); Measure* m = seg2->measure()->prevMeasure(); if (m) { Segment* s2 = m->last(); qreal x2 = s2->pagePos().x(); qreal dx = x1 - x2 + _spatium * .3; ls->setPos2(ls->ipos2() + QPointF(-dx, 0.0)); ls->layout(); } } #endif if (spannerSegments().empty()) qDebug("Trill: no segments"); if (_accidental) _accidental->setParent(ls); }
void Volta::read(XmlReader* r) { foreach(SpannerSegment* seg, spannerSegments()) delete seg; spannerSegments().clear(); int i= -1; while (r->readAttribute()) { if (r->tag() == "id") i = r->intValue(); } setId(i); while (r->readElement()) { MString8 tag(r->tag()); if (tag == "endings") { QString s = r->stringValue(); QStringList sl = s.split(",", QString::SkipEmptyParts); _endings.clear(); foreach(const QString& l, sl) { int i = l.simplified().toInt(); _endings.append(i); } }
void Spanner::startEdit(MuseScoreView*, const QPointF&) { editTick = _tick; editTick2 = tick2(); editTrack2 = _track2; if (_anchor == Spanner::Anchor::NOTE) { editEndNote = static_cast<Note*>(_endElement); editStartNote = static_cast<Note*>(_startElement); } userOffsets.clear(); userOffsets2.clear(); foreach (SpannerSegment* ss, spannerSegments()) { userOffsets.push_back(ss->userOff()); userOffsets2.push_back(ss->userOff2()); }