diff --git a/libmscore/barline.cpp b/libmscore/barline.cpp index c3a458a9ffec..cad94952da94 100644 --- a/libmscore/barline.cpp +++ b/libmscore/barline.cpp @@ -1507,8 +1507,7 @@ QString BarLine::accessibleExtraInfo() int tick = seg->tick(); auto spanners = score()->spannerMap().findOverlapping(tick, tick); - for (auto i = spanners.begin(); i < spanners.end(); i++) { - ::Interval interval = *i; + for (auto interval : spanners) { Spanner* s = interval.value; if (!score()->selectionFilter().canSelect(s)) continue; if (s->type() == Element::Type::VOLTA) { diff --git a/libmscore/chord.cpp b/libmscore/chord.cpp index dc2134a517c3..fa299ff94a8f 100644 --- a/libmscore/chord.cpp +++ b/libmscore/chord.cpp @@ -2844,8 +2844,8 @@ QPointF Chord::layoutArticulation(Articulation* a) bool botGap = false; bool topGap = false; - const std::vector< ::Interval >& si = score()->spannerMap().findOverlapping(tick(), tick()); - for (::Interval is : si) { + auto si = score()->spannerMap().findOverlapping(tick(), tick()); + for (auto is : si) { Spanner* sp = is.value; if ((sp->type() != Element::Type::SLUR) || (sp->tick() != tick() && sp->tick2() != tick())) continue; diff --git a/libmscore/chordrest.cpp b/libmscore/chordrest.cpp index 2d351dc2e780..f4b8cefcffe9 100644 --- a/libmscore/chordrest.cpp +++ b/libmscore/chordrest.cpp @@ -1420,8 +1420,7 @@ QString ChordRest::accessibleExtraInfo() SpannerMap& smap = score()->spannerMap(); auto spanners = smap.findOverlapping(tick(), tick()); - for (auto i = spanners.begin(); i < spanners.end(); i++) { - const ::Interval interval = *i; + for (auto interval : spanners) { Spanner* s = interval.value; if (!score()->selectionFilter().canSelect(s)) continue; if (s->type() == Element::Type::VOLTA || //voltas are added for barlines diff --git a/libmscore/edit.cpp b/libmscore/edit.cpp index 2211ea19e43c..24cad589be63 100644 --- a/libmscore/edit.cpp +++ b/libmscore/edit.cpp @@ -446,7 +446,8 @@ bool Score::rewriteMeasures(Measure* fm, Measure* lm, const Fraction& ns, int st int tick1 = m1->tick(); int tick2 = m2->endTick(); - for (auto i : s->spannerMap().findContained(tick1, tick2)) + auto spanners = s->spannerMap().findContained(tick1, tick2); + for (auto i : spanners) undo(new RemoveElement(i.value)); s->undoRemoveMeasures(m1, m2); @@ -2167,7 +2168,8 @@ void Score::cmdDeleteSelection() int tick2 = s2 ? s2->tick() : INT_MAX; int track1 = selection().staffStart() * VOICES; int track2 = selection().staffEnd() * VOICES; - for (auto i : _spanner.findOverlapping(stick1, stick2 - 1)) { + auto spanners = _spanner.findOverlapping(stick1, stick2 - 1); + for (auto i : spanners) { Spanner* sp = i.value; if (sp->type() == Element::Type::VOLTA) continue; diff --git a/libmscore/joinMeasure.cpp b/libmscore/joinMeasure.cpp index ef550ad14aef..ea976471339b 100644 --- a/libmscore/joinMeasure.cpp +++ b/libmscore/joinMeasure.cpp @@ -33,7 +33,8 @@ void Score::cmdJoinMeasure(Measure* m1, Measure* m2) int tick1 = m1->tick(); int tick2 = m2->endTick(); - for (auto i : _spanner.findContained(tick1, tick2)) + auto spanners = _spanner.findContained(tick1, tick2); + for (auto i : spanners) undo(new RemoveElement(i.value)); undoRemoveMeasures(m1, m2); Measure* m = new Measure(this); diff --git a/libmscore/layout.cpp b/libmscore/layout.cpp index 129d425a186d..7dfa3e0115e9 100644 --- a/libmscore/layout.cpp +++ b/libmscore/layout.cpp @@ -1779,7 +1779,7 @@ static bool validMMRestMeasure(Measure* m) #if 0 auto l = m->score()->spannerMap().findOverlapping(m->tick(), m->endTick()); - for (::Interval isp : l) { + for (auto isp : l) { Spanner* s = isp.value; if (s->type() == Element::Type::VOLTA && (s->tick() == m->tick() || s->tick2() == m->endTick())) return false; @@ -1809,7 +1809,7 @@ static bool breakMultiMeasureRest(Measure* m) if (m->breakMultiMeasureRest()) return true; auto sl = m->score()->spannerMap().findOverlapping(m->tick(), m->endTick()); - foreach (auto i, sl) { + for (auto i : sl) { Spanner* s = i.value; if (s->type() == Element::Type::VOLTA && (s->tick() == m->tick() || s->tick2() == m->tick())) return true; @@ -1841,7 +1841,7 @@ static bool breakMultiMeasureRest(Measure* m) // break for end of volta auto l = m->score()->spannerMap().findOverlapping(m->tick(), m->endTick()); - for (::Interval isp : l) { + for (auto isp : l) { Spanner* s = isp.value; if (s->type() == Element::Type::VOLTA && (s->tick2() == m->endTick())) return false; diff --git a/libmscore/rendermidi.cpp b/libmscore/rendermidi.cpp index 72d5dd73a52b..880b06bbfdc7 100644 --- a/libmscore/rendermidi.cpp +++ b/libmscore/rendermidi.cpp @@ -1301,7 +1301,8 @@ void renderGlissando(NoteEventList* events, Note *notestart) //--------------------------------------------------------- Trill* findFirstTrill(Chord *chord) { - for (auto i : chord->score()->spannerMap().findOverlapping(1+chord->tick(), chord->tick() + chord->actualTicks() - 1)) { + auto spanners = chord->score()->spannerMap().findOverlapping(1+chord->tick(), chord->tick() + chord->actualTicks() - 1); + for (auto i : spanners) { if (i.value->type() != Element::Type::TRILL) continue; if (i.value->track() != chord->track()) diff --git a/libmscore/score.cpp b/libmscore/score.cpp index f65df54a6888..33678d8df57c 100644 --- a/libmscore/score.cpp +++ b/libmscore/score.cpp @@ -2486,7 +2486,6 @@ void Score::splitStaff(int staffIdx, int splitPoint) undoRemoveElement(note); Chord* chord = note->chord(); if (chord->notes().isEmpty()) { - undoRemoveElement(chord); for (auto sp : spanner()) { Slur* slur = static_cast(sp.second); if (slur->type() != Element::Type::SLUR) @@ -2506,6 +2505,7 @@ void Score::splitStaff(int staffIdx, int splitPoint) } } } + undoRemoveElement(chord); } } } diff --git a/libmscore/segment.cpp b/libmscore/segment.cpp index 5f427475afec..8a18b509bbab 100644 --- a/libmscore/segment.cpp +++ b/libmscore/segment.cpp @@ -565,6 +565,16 @@ void Segment::remove(Element* el) _elist[track] = 0; int staffIdx = el->staffIdx(); measure()->checkMultiVoices(staffIdx); + // spanners with this cr as start or end element will need relayout + SpannerMap& smap = score()->spannerMap(); + auto spanners = smap.findOverlapping(tick(), tick()); + for (auto interval : spanners) { + Spanner* s = interval.value; + if (s->startElement() == el) + s->setStartElement(nullptr); + if (s->endElement() == el) + s->setEndElement(nullptr); + } } break; @@ -1226,9 +1236,8 @@ QString Segment::accessibleExtraInfo() QString startSpanners = ""; QString endSpanners = ""; - std::vector< ::Interval > spanners = score()->spannerMap().findOverlapping(this->tick(), this->tick()); - for (std::vector< ::Interval >::iterator i = spanners.begin(); i < spanners.end(); i++) { - ::Interval interval = *i; + auto spanners = score()->spannerMap().findOverlapping(this->tick(), this->tick()); + for (auto interval : spanners) { Spanner* s = interval.value; if (!score()->selectionFilter().canSelect(s)) continue; if (this->segmentType() == Segment::Type::EndBarLine || diff --git a/mscore/exportxml.cpp b/mscore/exportxml.cpp index 9aa62c4d04f4..356b91eef6bb 100644 --- a/mscore/exportxml.cpp +++ b/mscore/exportxml.cpp @@ -1368,7 +1368,8 @@ static Volta* findVolta(Measure* m, bool left) { int stick = m->tick(); int etick = m->tick() + m->ticks(); - for (auto i : m->score()->spannerMap().findOverlapping(stick, etick)) { + auto spanners = m->score()->spannerMap().findOverlapping(stick, etick); + for (auto i : spanners) { Spanner* el = i.value; if (el->type() != Element::Type::VOLTA) continue;