diff --git a/libmscore/chordrest.cpp b/libmscore/chordrest.cpp index 44b49ed707ce..aa67b9b5e336 100644 --- a/libmscore/chordrest.cpp +++ b/libmscore/chordrest.cpp @@ -1157,5 +1157,21 @@ void ChordRest::writeBeam(Xml& xml) #endif } +//--------------------------------------------------------- +// nextSegmentAfterCR +// returns first segment at tick CR->tick + CR->actualTicks +// of given types +//--------------------------------------------------------- + +Segment* ChordRest::nextSegmentAfterCR(Segment::Type types) const + { + for (Segment* s = segment()->next1MM(types); s; s = s->next1MM(types)) { + // chordrest ends at tick+actualTicks + // we return the segment at or after the end of the chordrest + if (s->tick() >= tick() + actualTicks()) + return s; + } + return 0; + } } diff --git a/libmscore/chordrest.h b/libmscore/chordrest.h index 18c12fcf6e64..0eaff7de0e74 100644 --- a/libmscore/chordrest.h +++ b/libmscore/chordrest.h @@ -16,6 +16,7 @@ #include "symbol.h" #include "duration.h" #include "beam.h" +#include "segment.h" namespace Ms { @@ -160,6 +161,8 @@ class ChordRest : public DurationElement { bool isGraceBefore() const; bool isGraceAfter() const; void writeBeam(Xml& xml); + + Segment* nextSegmentAfterCR(Segment::Type types) const; }; diff --git a/libmscore/score.cpp b/libmscore/score.cpp index 0f4f07da4b41..28b11ad7db40 100644 --- a/libmscore/score.cpp +++ b/libmscore/score.cpp @@ -2886,7 +2886,9 @@ void Score::selectRange(Element* e, int staffIdx) if (_selection.isList()) deselectAll(); _selection.setRange(cr->segment(), - cr->segment()->nextCR(cr->track()), + cr->nextSegmentAfterCR(Segment::Type::ChordRest + | Segment::Type::EndBarLine + | Segment::Type::Clef), e->staffIdx(), e->staffIdx() + 1); activeTrack = cr->track(); @@ -3059,6 +3061,7 @@ void Score::lassoSelectEnd() Segment* endSegment = 0; int startStaff = 0x7fffffff; int endStaff = 0; + const ChordRest* endCR; if (_selection.elements().isEmpty()) { _selection.setState(SelState::NONE); @@ -3078,6 +3081,7 @@ void Score::lassoSelectEnd() startSegment = seg; if ((endSegment == 0) || (*seg > *endSegment)) { endSegment = seg; + endCR = static_cast(e); } int idx = e->staffIdx(); if (idx < startStaff) @@ -3086,10 +3090,13 @@ void Score::lassoSelectEnd() endStaff = idx; } if (noteRestCount > 0) { - endSegment = endSegment->nextCR(endStaff * VOICES); + endSegment = endCR->nextSegmentAfterCR(Segment::Type::ChordRest + | Segment::Type::EndBarLine + | Segment::Type::Clef); _selection.setRange(startSegment, endSegment, startStaff, endStaff+1); if (!_selection.isRange()) _selection.setState(SelState::RANGE); + _selection.updateSelectedElements(); } _updateAll = true; } diff --git a/libmscore/select.cpp b/libmscore/select.cpp index 5ac1b976baa5..d0aac6aad9cd 100644 --- a/libmscore/select.cpp +++ b/libmscore/select.cpp @@ -1091,7 +1091,13 @@ QList Selection::uniqueNotes(int track) const void Selection::extendRangeSelection(ChordRest* cr) { - extendRangeSelection(cr->segment(),cr->segment()->nextCR(cr->track()),cr->staffIdx(),cr->tick(),cr->tick()); + extendRangeSelection(cr->segment(), + cr->nextSegmentAfterCR(Segment::Type::ChordRest + | Segment::Type::EndBarLine + | Segment::Type::Clef), + cr->staffIdx(), + cr->tick(), + cr->tick()); } //---------------------------------------------------------