fix import regressions; remove debug code
This commit is contained in:
parent
7c1f1c09d3
commit
f227ab77d1
18 changed files with 63 additions and 145 deletions
|
@ -298,7 +298,7 @@ bool ChordRest::readProperties(XmlReader& e)
|
|||
slur->setAnchor(Spanner::ANCHOR_SEGMENT);
|
||||
}
|
||||
else if (atype == "stop") {
|
||||
slur->setTickLen(e.tick() - slur->tick());
|
||||
slur->setTick2(e.tick());
|
||||
slur->setEndElement(this);
|
||||
Chord* start = static_cast<Chord*>(slur->startElement());
|
||||
if (start)
|
||||
|
|
|
@ -243,7 +243,7 @@ void Score::cmdAddSpanner(Spanner* spanner, const QPointF& pos)
|
|||
delete spanner;
|
||||
return;
|
||||
}
|
||||
spanner->setTickLen(ns->tick() - spanner->tick());
|
||||
spanner->setTick2(ns->tick());
|
||||
}
|
||||
else { // ANCHOR_MEASURE
|
||||
Measure* m = static_cast<Measure*>(mb);
|
||||
|
@ -252,7 +252,7 @@ void Score::cmdAddSpanner(Spanner* spanner, const QPointF& pos)
|
|||
if (pos.x() >= (b.x() + b.width() * .5))
|
||||
m = m->nextMeasure();
|
||||
spanner->setTick(m->tick());
|
||||
spanner->setTickLen(m->ticks());
|
||||
spanner->setTick2(m->endTick());
|
||||
}
|
||||
|
||||
undoAddElement(spanner);
|
||||
|
@ -280,7 +280,7 @@ void Score::cmdAddSpanner(Spanner* spanner, const QPointF& pos)
|
|||
s = s->next1(Segment::SegChordRest);
|
||||
}
|
||||
if (s)
|
||||
spanner->setTickLen(s->tick() - spanner->tick());
|
||||
spanner->setTick2(s->tick());
|
||||
Fraction d(1,32);
|
||||
Fraction e = l / d;
|
||||
int n = e.numerator() / e.denominator();
|
||||
|
@ -437,7 +437,7 @@ printf("add pitch %d add %d repitch %d\n", pitch, addFlag, _is.repitchMode());
|
|||
_is.slur->setTick(stick);
|
||||
}
|
||||
else
|
||||
_is.slur->setTickLen(e->tick() - _is.slur->tick());
|
||||
_is.slur->setTick2(e->tick());
|
||||
}
|
||||
else
|
||||
qDebug("addPitch: cannot find slur note");
|
||||
|
|
|
@ -961,7 +961,7 @@ void Score::cmdAddHairpin(bool decrescendo)
|
|||
pin->setHairpinType(decrescendo ? Hairpin::DECRESCENDO : Hairpin::CRESCENDO);
|
||||
pin->setTrack(cr1->track());
|
||||
pin->setTick(cr1->segment()->tick());
|
||||
pin->setTickLen(cr2->segment()->tick() - pin->tick());
|
||||
pin->setTick2(cr2->segment()->tick());
|
||||
pin->setParent(cr1->segment());
|
||||
undoAddElement(pin);
|
||||
if (!noteEntryMode())
|
||||
|
|
|
@ -298,7 +298,7 @@ bool LineSegment::edit(MuseScoreView* sv, int curGrip, int key, Qt::KeyboardModi
|
|||
if (key == Qt::Key_Left)
|
||||
ls = l->takeLastSegment();
|
||||
}
|
||||
l->setTickLen(m2->tick() - l->tick());
|
||||
l->setTick2(m2->tick());
|
||||
}
|
||||
}
|
||||
l->layout();
|
||||
|
@ -655,16 +655,10 @@ bool SLine::readProperties(XmlReader& e)
|
|||
{
|
||||
const QStringRef& tag(e.name());
|
||||
|
||||
if (tag == "tick2") {
|
||||
int tick2 = e.readInt();
|
||||
setTickLen(tick() == -1 ? tick2 : tick2 - tick());
|
||||
}
|
||||
else if (tag == "tick") {
|
||||
int tick1 = e.readInt();
|
||||
if (tickLen() != -1)
|
||||
setTickLen(tickLen() - tick1);
|
||||
setTick(tick1);
|
||||
}
|
||||
if (tag == "tick2") // obsolete
|
||||
setTick2(e.readInt());
|
||||
else if (tag == "tick") // obsolete
|
||||
setTick(e.readInt());
|
||||
else if (tag == "Segment") {
|
||||
LineSegment* ls = createLineSegment();
|
||||
ls->read(e);
|
||||
|
|
|
@ -2022,7 +2022,7 @@ void Measure::read(XmlReader& e, int staffIdx)
|
|||
int id = e.attribute("id").toInt();
|
||||
Spanner* spanner = score()->findSpanner(id);
|
||||
if (spanner) {
|
||||
spanner->setTickLen(e.tick() - spanner->tick());
|
||||
spanner->setTick2(e.tick());
|
||||
if (spanner->type() == OTTAVA) {
|
||||
Ottava* o = static_cast<Ottava*>(spanner);
|
||||
int shift = o->pitchShift();
|
||||
|
|
|
@ -160,7 +160,7 @@ static const PropertyData propertyList[] = {
|
|||
{ P_TIMESIG_GLOBAL, false, 0, T_FRACTION },
|
||||
|
||||
{ P_SPANNER_TICK, true, "tick", T_INT },
|
||||
{ P_SPANNER_TICKLEN, true, "tickLen", T_INT },
|
||||
{ P_SPANNER_TICK2, true, "tick2", T_INT },
|
||||
{ P_USER_OFF2, false, "userOff2", T_POINT },
|
||||
|
||||
{ P_END, false, "", T_INT }
|
||||
|
|
|
@ -152,7 +152,7 @@ enum P_ID {
|
|||
P_TIMESIG_GLOBAL,
|
||||
|
||||
P_SPANNER_TICK,
|
||||
P_SPANNER_TICKLEN,
|
||||
P_SPANNER_TICK2,
|
||||
P_USER_OFF2,
|
||||
|
||||
P_END
|
||||
|
|
|
@ -516,8 +516,8 @@ Score::FileError Score::read114(XmlReader& e)
|
|||
}
|
||||
qDeleteAll(e.clefListList());
|
||||
|
||||
#if 0 // TODO-S
|
||||
foreach(Spanner* s, e.spanner()) {
|
||||
for (std::pair<int,Spanner*> p : spanner()) {
|
||||
Spanner* s = p.second;
|
||||
if (s->type() == Element::OTTAVA
|
||||
|| (s->type() == Element::TEXTLINE)
|
||||
|| (s->type() == Element::VOLTA)
|
||||
|
@ -529,71 +529,10 @@ Score::FileError Score::read114(XmlReader& e)
|
|||
tl->setEndSymbol(resolveSymCompatibility(tl->endSymbol(), mscoreVersion()));
|
||||
}
|
||||
|
||||
if (s->type() == Element::SLUR) {
|
||||
Slur* slur = static_cast<Slur*>(s);
|
||||
|
||||
if (!slur->startElement() || !slur->endElement()) {
|
||||
qDebug("incomplete Slur");
|
||||
if (slur->startElement()) {
|
||||
qDebug(" front %d", static_cast<ChordRest*>(slur->startElement())->tick());
|
||||
static_cast<ChordRest*>(slur->startElement())->removeSlurFor(slur);
|
||||
}
|
||||
if (slur->endElement()) {
|
||||
qDebug(" back %d", static_cast<ChordRest*>(slur->endElement())->tick());
|
||||
static_cast<ChordRest*>(slur->endElement())->removeSlurBack(slur);
|
||||
}
|
||||
}
|
||||
else {
|
||||
ChordRest* cr1 = (ChordRest*)(slur->startElement());
|
||||
ChordRest* cr2 = (ChordRest*)(slur->endElement());
|
||||
if (cr1->tick() > cr2->tick()) {
|
||||
qDebug("Slur invalid start-end tick %d-%d", cr1->tick(), cr2->tick());
|
||||
slur->setStartElement(cr2);
|
||||
slur->setEndElement(cr1);
|
||||
}
|
||||
int n1 = 0;
|
||||
int n2 = 0;
|
||||
for (Spanner* s = cr1->spannerFor(); s; s = s->next()) {
|
||||
if (s == slur)
|
||||
++n1;
|
||||
}
|
||||
for (Spanner* s = cr2->spannerBack(); s; s = s->next()) {
|
||||
if (s == slur)
|
||||
++n2;
|
||||
}
|
||||
if (n1 != 1 || n2 != 1) {
|
||||
qDebug("Slur references bad: %d %d", n1, n2);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
Segment* s1 = tick2segment(s->__tick1());
|
||||
Segment* s2 = tick2segment(s->__tick2());
|
||||
if (s1 == 0 || s2 == 0) {
|
||||
qDebug("cannot place %s at tick %d - %d",
|
||||
s->name(), s->__tick1(), s->__tick2());
|
||||
continue;
|
||||
}
|
||||
if (s->type() != Element::SLUR) {
|
||||
if (s->type() == Element::VOLTA) {
|
||||
Volta* volta = static_cast<Volta*>(s);
|
||||
volta->setAnchor(Spanner::ANCHOR_MEASURE);
|
||||
volta->setStartMeasure(s1->measure());
|
||||
Measure* m2 = s2->measure();
|
||||
if (s2->tick() == m2->tick())
|
||||
m2 = m2->prevMeasure();
|
||||
volta->setEndMeasure(m2);
|
||||
s1->measure()->add(s);
|
||||
int n = volta->spannerSegments().size();
|
||||
if (n) {
|
||||
// volta->setYoff(-styleS(ST_voltaHook).val());
|
||||
// LineSegment* ls = volta->segmentAt(0);
|
||||
// ls->setReadPos(QPointF());
|
||||
}
|
||||
}
|
||||
else {
|
||||
s->setStartElement(s1);
|
||||
s->setEndElement(s2);
|
||||
s1->add(s);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -608,7 +547,7 @@ Score::FileError Score::read114(XmlReader& e)
|
|||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
connectTies();
|
||||
|
||||
//
|
||||
|
@ -684,7 +623,11 @@ Score::FileError Score::read114(XmlReader& e)
|
|||
_showOmr = false;
|
||||
|
||||
// create excerpts
|
||||
foreach(Excerpt* excerpt, _excerpts) {
|
||||
foreach (Excerpt* excerpt, _excerpts) {
|
||||
if (excerpt->parts().isEmpty()) { // ignore empty parts
|
||||
_excerpts.removeOne(excerpt);
|
||||
continue;
|
||||
}
|
||||
Score* nscore = Ms::createExcerpt(excerpt->parts());
|
||||
if (nscore) {
|
||||
nscore->setParentScore(this);
|
||||
|
|
|
@ -3426,7 +3426,7 @@ printf(" %p score %p change spanner %d+%d\n", s, s->score(), s->tick(), s->tic
|
|||
// +----spanner--------+
|
||||
// +---add---
|
||||
//
|
||||
undoChangeProperty(s, P_SPANNER_TICKLEN, s->tickLen() + len);
|
||||
undoChangeProperty(s, P_SPANNER_TICK2, s->tick2() + len);
|
||||
}
|
||||
else if (tick < s->tick()) {
|
||||
//
|
||||
|
@ -3455,9 +3455,9 @@ printf(" %p score %p change spanner %d+%d\n", s, s->score(), s->tick(), s->tic
|
|||
// +----spanner--------+
|
||||
// +---remove---+
|
||||
//
|
||||
int l = s->tickLen() + len;
|
||||
if (l > 0)
|
||||
undoChangeProperty(s, P_SPANNER_TICKLEN, l);
|
||||
int t2 = s->tick2() + len;
|
||||
if (t2 > s->tick())
|
||||
undoChangeProperty(s, P_SPANNER_TICK2, t2);
|
||||
}
|
||||
else if (s->tick() >= tick && s->tick2() < tick2) {
|
||||
//
|
||||
|
@ -3478,10 +3478,8 @@ printf(" %p score %p change spanner %d+%d\n", s, s->score(), s->tick(), s->tic
|
|||
int len = s->tickLen() - d2;
|
||||
if (len == 0)
|
||||
undoRemoveElement(s);
|
||||
else {
|
||||
else
|
||||
undoChangeProperty(s, P_SPANNER_TICK, s->tick() - d1);
|
||||
undoChangeProperty(s, P_SPANNER_TICKLEN, s->tickLen() - d2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -114,8 +114,6 @@ Segment::Segment(Measure* m)
|
|||
Segment::Segment(Measure* m, SegmentType st, int t)
|
||||
: Element(m->score())
|
||||
{
|
||||
if (st == SegBreath)
|
||||
abort();
|
||||
setParent(m);
|
||||
setSegmentType(st);
|
||||
setTick(t);
|
||||
|
|
|
@ -142,7 +142,7 @@ class Segment : public Element {
|
|||
static const char* subTypeName(SegmentType);
|
||||
static SegmentType segmentType(ElementType type);
|
||||
SegmentType segmentType() const { return _segmentType; }
|
||||
void setSegmentType(SegmentType t) { if (t == SegBreath) abort(); _segmentType = t; }
|
||||
void setSegmentType(SegmentType t) { _segmentType = t; }
|
||||
|
||||
void removeGeneratedElements();
|
||||
bool isEmpty() const { return empty; }
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
namespace Ms {
|
||||
|
||||
int Spanner::editTick;
|
||||
int Spanner::editTickLen;
|
||||
int Spanner::editTick2;
|
||||
QList<QPointF> Spanner::userOffsets2;
|
||||
QList<QPointF> Spanner::userOffsets;
|
||||
|
||||
|
@ -144,7 +144,7 @@ Spanner::Spanner(Score* s)
|
|||
_startElement = 0;
|
||||
_endElement = 0;
|
||||
_tick = -1;
|
||||
_tickLen = -1;
|
||||
_tick2 = -1;
|
||||
_id = 0;
|
||||
}
|
||||
|
||||
|
@ -155,7 +155,7 @@ Spanner::Spanner(const Spanner& s)
|
|||
_startElement = s._startElement;
|
||||
_endElement = s._endElement;
|
||||
_tick = s._tick;
|
||||
_tickLen = s._tickLen;
|
||||
_tick2 = s._tick2;
|
||||
_id = 0;
|
||||
}
|
||||
|
||||
|
@ -217,8 +217,8 @@ void Spanner::setScore(Score* s)
|
|||
|
||||
void Spanner::startEdit(MuseScoreView*, const QPointF&)
|
||||
{
|
||||
editTick = _tick;
|
||||
editTickLen = _tickLen;
|
||||
editTick = _tick;
|
||||
editTick2 = _tick2;
|
||||
userOffsets.clear();
|
||||
userOffsets2.clear();
|
||||
foreach (SpannerSegment* ss, spannerSegments()) {
|
||||
|
@ -234,7 +234,7 @@ void Spanner::startEdit(MuseScoreView*, const QPointF&)
|
|||
void Spanner::endEdit()
|
||||
{
|
||||
score()->undoPropertyChanged(this, P_SPANNER_TICK, editTick);
|
||||
score()->undoPropertyChanged(this, P_SPANNER_TICKLEN, editTickLen);
|
||||
score()->undoPropertyChanged(this, P_SPANNER_TICK2, editTick2);
|
||||
|
||||
if (spannerSegments().size() != userOffsets2.size()) {
|
||||
qDebug("SLine::endEdit(): segment size changed");
|
||||
|
@ -265,7 +265,7 @@ void Spanner::setSelected(bool f)
|
|||
|
||||
bool Spanner::isEdited(Spanner* originalSpanner) const
|
||||
{
|
||||
if (_tick != originalSpanner->_tick || _tickLen != originalSpanner->_tickLen)
|
||||
if (_tick != originalSpanner->_tick || _tick2 != originalSpanner->_tick2)
|
||||
return true;
|
||||
if (spannerSegments().size() != originalSpanner->spannerSegments().size())
|
||||
return true;
|
||||
|
@ -285,8 +285,8 @@ QVariant Spanner::getProperty(P_ID propertyId) const
|
|||
switch (propertyId) {
|
||||
case P_SPANNER_TICK:
|
||||
return tick();
|
||||
case P_SPANNER_TICKLEN:
|
||||
return tickLen();
|
||||
case P_SPANNER_TICK2:
|
||||
return tick2();
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -303,8 +303,8 @@ bool Spanner::setProperty(P_ID propertyId, const QVariant& v)
|
|||
case P_SPANNER_TICK:
|
||||
setTick(v.toInt());
|
||||
break;
|
||||
case P_SPANNER_TICKLEN:
|
||||
setTickLen(v.toInt());
|
||||
case P_SPANNER_TICK2:
|
||||
setTick2(v.toInt());
|
||||
break;
|
||||
default:
|
||||
if (!Element::setProperty(propertyId, v))
|
||||
|
@ -334,7 +334,7 @@ QVariant Spanner::propertyDefault(P_ID propertyId) const
|
|||
|
||||
ChordRest* Score::findCR(int tick, int track) const
|
||||
{
|
||||
Segment* s = tick2segment(tick);
|
||||
Segment* s = tick2segment(tick, false, Segment::SegChordRest);
|
||||
if (s)
|
||||
return static_cast<ChordRest*>(s->element(track));
|
||||
return nullptr;
|
||||
|
@ -346,29 +346,20 @@ ChordRest* Score::findCR(int tick, int track) const
|
|||
|
||||
void Spanner::computeStartElement()
|
||||
{
|
||||
bool first = _tickLen == 0;
|
||||
Element* e = 0;
|
||||
_startElement = 0;
|
||||
switch (_anchor) {
|
||||
case ANCHOR_SEGMENT:
|
||||
e = score()->findCR(tick(), track());
|
||||
_startElement = score()->findCR(tick(), track());
|
||||
break;
|
||||
|
||||
case ANCHOR_MEASURE:
|
||||
{
|
||||
Segment* s = score()->tick2segment(tick(), first, Segment::SegChordRest);
|
||||
if (s) {
|
||||
ChordRest* cr = static_cast<ChordRest*>(s->element(track()));
|
||||
if (cr)
|
||||
e = cr->measure();
|
||||
}
|
||||
}
|
||||
_startElement = score()->tick2measure(tick());
|
||||
break;
|
||||
|
||||
case ANCHOR_CHORD:
|
||||
case ANCHOR_NOTE:
|
||||
return;
|
||||
}
|
||||
_startElement = e;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------
|
||||
|
@ -377,26 +368,20 @@ void Spanner::computeStartElement()
|
|||
|
||||
void Spanner::computeEndElement()
|
||||
{
|
||||
Element* e = 0;
|
||||
_endElement = 0;
|
||||
switch (_anchor) {
|
||||
case ANCHOR_SEGMENT:
|
||||
e = score()->findCR(tick2(), track());
|
||||
_endElement = score()->findCR(tick2(), track());
|
||||
break;
|
||||
|
||||
case ANCHOR_MEASURE:
|
||||
{
|
||||
ChordRest* cr = score()->findCR(tick2(), track());
|
||||
e = cr ? cr->measure() : 0;
|
||||
}
|
||||
_endElement = score()->tick2measure(tick2());
|
||||
break;
|
||||
|
||||
case ANCHOR_CHORD:
|
||||
return;
|
||||
|
||||
case ANCHOR_NOTE:
|
||||
break;
|
||||
}
|
||||
_endElement = e;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------
|
||||
|
|
|
@ -96,17 +96,17 @@ class Spanner : public Element {
|
|||
};
|
||||
private:
|
||||
Q_PROPERTY(int tick READ tick WRITE setTick)
|
||||
Q_PROPERTY(int tickLen READ tickLen WRITE setTickLen)
|
||||
Q_PROPERTY(int tick2 READ tick2 WRITE setTick2)
|
||||
Q_PROPERTY(Anchor anchor READ anchor WRITE setAnchor)
|
||||
|
||||
QList<SpannerSegment*> segments;
|
||||
Anchor _anchor;
|
||||
Element* _startElement;
|
||||
Element* _endElement;
|
||||
int _tick, _tickLen;
|
||||
int _tick, _tick2;
|
||||
int _id; // used for xml serialization
|
||||
|
||||
static int editTick, editTickLen;
|
||||
static int editTick, editTick2;
|
||||
static QList<QPointF> userOffsets;
|
||||
static QList<QPointF> userOffsets2;
|
||||
|
||||
|
@ -118,12 +118,12 @@ class Spanner : public Element {
|
|||
virtual ElementType type() const = 0;
|
||||
virtual void setScore(Score* s);
|
||||
|
||||
int tick() const { return _tick; }
|
||||
void setTick(int v) { _tick = v; }
|
||||
int tickLen() const { return _tickLen; }
|
||||
void setTickLen(int v) { _tickLen = v; }
|
||||
int tick2() const { return _tick + _tickLen; } // helper function
|
||||
void setTick2(int v) { _tickLen = v - _tick; } // assume _tick is already set
|
||||
int tick() const { return _tick; }
|
||||
void setTick(int v) { _tick = v; }
|
||||
int tickLen() const { return _tick2 - _tick; }
|
||||
int tick2() const { return _tick2; }
|
||||
void setTick2(int v) { _tick2 = v; }
|
||||
|
||||
int id() const { return _id; }
|
||||
void setId(int v) { _id = v; }
|
||||
|
||||
|
|
|
@ -50,9 +50,9 @@ Measure* Score::tick2measure(int tick) const
|
|||
lm = m;
|
||||
}
|
||||
// check last measure
|
||||
if (lm && (tick >= lm->tick()) && (tick <= (lm->tick() + lm->ticks())))
|
||||
if (lm && (tick >= lm->tick()) && (tick <= lm->endTick()))
|
||||
return lm;
|
||||
qDebug("-tick2measure %d not found", tick);
|
||||
qDebug("-tick2measure %d (max %d) not found", tick, lm ? lm->tick() : -1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -690,7 +690,7 @@ void Xml::dump(int len, const unsigned char* p)
|
|||
}
|
||||
|
||||
//---------------------------------------------------------
|
||||
// htmlToString
|
||||
// htmlToStringg
|
||||
//---------------------------------------------------------
|
||||
|
||||
void Xml::htmlToString(XmlReader& e, int level, QString* s)
|
||||
|
|
|
@ -2122,7 +2122,7 @@ Measure* MusicXml::xmlMeasure(Part* part, QDomElement e, int number, int measure
|
|||
else if (endingType == "stop") {
|
||||
if (lastVolta) {
|
||||
lastVolta->setVoltaType(VoltaType::CLOSED);
|
||||
lastVolta->setTickLen(measure->tick() - lastVolta->tick());
|
||||
lastVolta->setTick2(measure->tick());
|
||||
lastVolta = 0;
|
||||
}
|
||||
else {
|
||||
|
|
|
@ -173,7 +173,7 @@ void MuseData::openSlur(int idx, int tick, Staff* staff, int voice)
|
|||
void MuseData::closeSlur(int idx, int tick, Staff* staff, int voice)
|
||||
{
|
||||
if (slur[idx]) {
|
||||
slur[idx]->setTickLen(tick - slur[idx]->tick());
|
||||
slur[idx]->setTick2(tick);
|
||||
slur[idx] = 0;
|
||||
}
|
||||
else
|
||||
|
|
|
@ -3775,7 +3775,7 @@ void ScoreView::cmdAddSlur()
|
|||
cr2 = cr1;
|
||||
Slur* slur = new Slur(_score);
|
||||
slur->setTick(cr1->tick());
|
||||
slur->setTickLen(cr2->tick() - cr1->tick());
|
||||
slur->setTick2(cr2->tick());
|
||||
slur->setTrack(cr1->track());
|
||||
slur->setParent(0);
|
||||
_score->undoAddElement(slur);
|
||||
|
@ -3885,7 +3885,7 @@ void ScoreView::cmdAddSlur(Note* firstNote, Note* lastNote)
|
|||
Slur* slur = new Slur(_score);
|
||||
slur->setAnchor(Spanner::ANCHOR_SEGMENT);
|
||||
slur->setTick(cr1->tick());
|
||||
slur->setTickLen(cr2->tick() - cr1->tick());
|
||||
slur->setTick2(cr2->tick());
|
||||
slur->setTrack(cr1->track());
|
||||
slur->setParent(0);
|
||||
_score->undoAddElement(slur);
|
||||
|
|
Loading…
Reference in a new issue