Skip to content

Commit

Permalink
Merge pull request #933 from BartlomiejLewandowski/25852-range-timesig
Browse files Browse the repository at this point in the history
Range selection ending fix
  • Loading branch information
lasconic committed Aug 9, 2014
2 parents 6413e68 + 2bf14c7 commit cec67e6
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 3 deletions.
16 changes: 16 additions & 0 deletions libmscore/chordrest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}

3 changes: 3 additions & 0 deletions libmscore/chordrest.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#include "symbol.h"
#include "duration.h"
#include "beam.h"
#include "segment.h"

namespace Ms {

Expand Down Expand Up @@ -160,6 +161,8 @@ class ChordRest : public DurationElement {
bool isGraceBefore() const;
bool isGraceAfter() const;
void writeBeam(Xml& xml);

Segment* nextSegmentAfterCR(Segment::Type types) const;
};


Expand Down
11 changes: 9 additions & 2 deletions libmscore/score.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down Expand Up @@ -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);
Expand All @@ -3078,6 +3081,7 @@ void Score::lassoSelectEnd()
startSegment = seg;
if ((endSegment == 0) || (*seg > *endSegment)) {
endSegment = seg;
endCR = static_cast<const ChordRest*>(e);
}
int idx = e->staffIdx();
if (idx < startStaff)
Expand All @@ -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;
}
Expand Down
8 changes: 7 additions & 1 deletion libmscore/select.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1091,7 +1091,13 @@ QList<Note*> 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());
}

//---------------------------------------------------------
Expand Down

0 comments on commit cec67e6

Please sign in to comment.