Skip to content

Commit

Permalink
fix for #28761 and #29511
Browse files Browse the repository at this point in the history
  • Loading branch information
wschweer committed Aug 22, 2014
1 parent aeebbb6 commit f2ea47b
Show file tree
Hide file tree
Showing 11 changed files with 53 additions and 51 deletions.
1 change: 1 addition & 0 deletions libmscore/cmd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1030,6 +1030,7 @@ qDebug(" ChangeCRLen:: %d += %d(actual=%d)", tick, f2.ticks(), f2.ticks() * tim
expandVoice(s, track);
cr1 = static_cast<ChordRest*>(s->element(track));
}
// checkSpanner(cr->tick(), cr->tick() + d.ticks());
connectTies();
}

Expand Down
31 changes: 31 additions & 0 deletions libmscore/edit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2378,5 +2378,36 @@ MeasureBase* Score::insertMeasure(Element::Type type, MeasureBase* measure, bool
return omb;
}

//---------------------------------------------------------
// checkSpanner
// check if spanners are still valid as anchors may
// have changed or be removed
//---------------------------------------------------------

void Score::checkSpanner(int startTick, int endTick)
{
QList<Spanner*> sl;
auto spanners = _spanner.findOverlapping(startTick, endTick);
for (auto i = spanners.begin(); i < spanners.end(); i++) {
Spanner* s = i->value;

if (s->type() == Element::Type::SLUR) {
Segment* seg = tick2segmentMM(s->tick(), false, Segment::Type::ChordRest);
if (!seg || !seg->element(s->track()))
sl.append(s);
seg = tick2segmentMM(s->tick2(), false, Segment::Type::ChordRest);
if (!seg || !seg->element(s->track2()))
sl.append(s);
}
else {
// remove spanner if there is no start element
s->computeStartElement();
if (!s->startElement())
sl.append(s);
}
}
for (auto s : sl) // actually remove scheduled spanners
undo(new RemoveElement(s));
}
}

2 changes: 2 additions & 0 deletions libmscore/layout.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1394,6 +1394,8 @@ void Score::doLayout()
for (Measure* m = firstMeasureMM(); m; m = m->nextMeasureMM())
m->layout2();

checkSpanner(0, lastSegment()->tick());

for (auto s : _spanner.map()) { // DEBUG
Spanner* sp = s.second;
if (sp->type() == Element::Type::SLUR) {
Expand Down
4 changes: 2 additions & 2 deletions libmscore/score.h
Original file line number Diff line number Diff line change
Expand Up @@ -566,8 +566,6 @@ class Score : public QObject {
void addElement(Element*);
void removeElement(Element*);

void cmdAddSpanner(Spanner* e, const QPointF& pos);

Note* addPitch(NoteVal&, bool addFlag);
void addPitch(int pitch, bool addFlag);
Note* addNote(Chord*, NoteVal& noteVal);
Expand Down Expand Up @@ -965,6 +963,8 @@ class Score : public QObject {
bool isSpannerStartEnd(int tick, int track) const;
void removeSpanner(Spanner*);
void addSpanner(Spanner*);
void cmdAddSpanner(Spanner* e, const QPointF& pos);
void checkSpanner(int startTick, int lastTick);

Hairpin* addHairpin(bool crescendo, int tickStart, int tickEnd, int track);

Expand Down
8 changes: 2 additions & 6 deletions libmscore/slur.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,7 @@ void SlurSegment::changeAnchor(MuseScoreView* viewer, int curGrip, Element* elem
}
case Spanner::Anchor::CHORD:
spanner()->setTick(static_cast<Chord*>(element)->tick());
spanner()->setStartChord(static_cast<Chord*>(element));
spanner()->setStartElement(element);
break;
case Spanner::Anchor::SEGMENT:
case Spanner::Anchor::MEASURE:
Expand All @@ -232,7 +232,7 @@ void SlurSegment::changeAnchor(MuseScoreView* viewer, int curGrip, Element* elem
case Spanner::Anchor::CHORD:
spanner()->setTick2(static_cast<Chord*>(element)->tick());
spanner()->setTrack2(element->track());
spanner()->setEndChord(static_cast<Chord*>(element));
spanner()->setEndElement(element);
break;

case Spanner::Anchor::SEGMENT:
Expand Down Expand Up @@ -781,10 +781,6 @@ void Slur::slurPosChord(SlurPos* sp)

void Slur::slurPos(SlurPos* sp)
{
// if (anchor() == Anchor::CHORD) {
// slurPosChord(sp);
// return;
// }
qreal _spatium = spatium();

if (endCR() == 0) {
Expand Down
33 changes: 3 additions & 30 deletions libmscore/spanner.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -398,10 +398,7 @@ void Spanner::computeStartElement()
{
switch (_anchor) {
case Anchor::SEGMENT:
if (type() == Element::Type::SLUR)
_startElement = score()->findCR(tick(), track());
else
_startElement = score()->findCRinStaff(tick(), track());
_startElement = score()->findCRinStaff(tick(), track());
break;

case Anchor::MEASURE:
Expand All @@ -422,12 +419,7 @@ void Spanner::computeEndElement()
{
switch (_anchor) {
case Anchor::SEGMENT:
if (type() == Element::Type::SLUR) {
Segment* s = score()->tick2segmentMM(tick2(), false, Segment::Type::ChordRest);
_endElement = s ? static_cast<ChordRest*>(s->element(track2())) : nullptr;
}
else
_endElement = score()->findCRinStaff(tick2() - 1, track2());
_endElement = score()->findCRinStaff(tick2() - 1, track2());
break;

case Anchor::MEASURE:
Expand All @@ -444,16 +436,6 @@ void Spanner::computeEndElement()
}
}

//---------------------------------------------------------
// setStartChord
//---------------------------------------------------------

void Spanner::setStartChord(Chord* c)
{
_anchor = Anchor::CHORD;
_startElement = c;
}

//---------------------------------------------------------
// startChord
//---------------------------------------------------------
Expand All @@ -467,15 +449,6 @@ Chord* Spanner::startChord()
return static_cast<Chord*>(_startElement);
}

//---------------------------------------------------------
// setEndChord
//---------------------------------------------------------

void Spanner::setEndChord(Chord* c)
{
_endElement = c;
}

//---------------------------------------------------------
// endChord
//---------------------------------------------------------
Expand All @@ -502,7 +475,7 @@ ChordRest* Spanner::startCR()
{
Q_ASSERT(_anchor == Anchor::SEGMENT || _anchor == Anchor::CHORD);
if (!_startElement)
_startElement = score()->findCR(tick(), track());
computeStartElement();
return static_cast<ChordRest*>(_startElement);
}

Expand Down
10 changes: 4 additions & 6 deletions libmscore/spanner.h
Original file line number Diff line number Diff line change
Expand Up @@ -106,9 +106,10 @@ class Spanner : public Element {
Q_PROPERTY(int tick2 READ tick2 WRITE setTick2)
Q_PROPERTY(Ms::Spanner::Anchor anchor READ anchor WRITE setAnchor)

Anchor _anchor { Anchor::SEGMENT };
Element* _startElement { 0 };
Element* _endElement { 0 };

Anchor _anchor { Anchor::SEGMENT };
int _tick { -1 };
int _ticks { 0 };
int _track2 { -1 };
Expand Down Expand Up @@ -164,15 +165,12 @@ class Spanner : public Element {
void setStartElement(Element* e);
void setEndElement(Element* e);

void setStartChord(Chord*);
void setEndChord(Chord*);
ChordRest* startCR();
ChordRest* endCR();

Chord* startChord();
Chord* endChord();

ChordRest* startCR();
ChordRest* endCR();

Segment* startSegment() const;
Segment* endSegment() const;

Expand Down
3 changes: 2 additions & 1 deletion libmscore/undo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1429,6 +1429,7 @@ RemoveElement::RemoveElement(Element* e)

Score* score = element->score();
if (element->isChordRest()) {
#if 0
// do not delete pending slur in note entry mode
Slur* pendingSlur = 0;
for (Score* sc : score->scoreList()) {
Expand Down Expand Up @@ -1456,7 +1457,7 @@ RemoveElement::RemoveElement(Element* e)
}
for (auto s : sl) // actually remove scheduled spanners
score->undo(new RemoveElement(s));

#endif
ChordRest* cr = static_cast<ChordRest*>(element);
if (cr->tuplet() && cr->tuplet()->elements().empty())
score->undo(new RemoveElement(cr->tuplet()));
Expand Down
4 changes: 2 additions & 2 deletions mscore/importgtp-gp4.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -333,8 +333,8 @@ bool GuitarPro4::readNote(int string, int staffIdx, Note* note)

Slur* slur = new Slur(score);
slur->setAnchor(Spanner::Anchor::CHORD);
slur->setStartChord(static_cast<Chord*>(cr1));
slur->setEndChord(static_cast<Chord*>(cr2));
slur->setStartElement(cr1);
slur->setEndElement(cr2);
slur->setTick(cr1->tick());
slur->setTick2(cr2->tick());
slur->setTrack(cr1->track());
Expand Down
4 changes: 2 additions & 2 deletions mscore/importgtp-gp5.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -677,8 +677,8 @@ bool GuitarPro5::readNoteEffects(Note* note)

Slur* slur = new Slur(score);
slur->setAnchor(Spanner::Anchor::CHORD);
slur->setStartChord(static_cast<Chord*>(cr1));
slur->setEndChord(static_cast<Chord*>(cr2));
slur->setStartElement(cr1);
slur->setEndElement(cr2);
slur->setTick(cr1->tick());
slur->setTick2(cr2->tick());
slur->setTrack(cr1->track());
Expand Down
4 changes: 2 additions & 2 deletions mscore/importgtp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1579,8 +1579,8 @@ void GuitarPro1::readNote(int string, Note* note)
ChordRest* cr2 = static_cast<Chord*>(note->chord());

Slur* slur = new Slur(score);
slur->setStartChord(static_cast<Chord*>(cr1));
slur->setEndChord(static_cast<Chord*>(cr2));
slur->setStartElement(cr1);
slur->setEndElement(cr2);
slur->setTick(cr1->tick());
slur->setTick2(cr2->tick());
slur->setTrack(cr1->track());
Expand Down

0 comments on commit f2ea47b

Please sign in to comment.