Skip to content

Commit

Permalink
fix #276976 Crash on clicking on some measure in a corrupted score
Browse files Browse the repository at this point in the history
  • Loading branch information
wschweer committed Dec 20, 2018
1 parent e7ec297 commit 00e6040
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 47 deletions.
73 changes: 27 additions & 46 deletions libmscore/score.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2902,44 +2902,37 @@ void Score::selectRange(Element* e, int staffIdx)
int activeTrack = e->track();
// current selection is range extending to end of score?
bool endRangeSelected = selection().isRange() && selection().endSegment() == nullptr;
if (e->type() == ElementType::MEASURE) {
Measure* m = toMeasure(e);
int tick = m->tick();
int etick = tick + m->ticks();
if (e->isMeasure()) {
Measure* m = toMeasure(e);
int tick = m->tick();
int etick = tick + m->ticks();
activeTrack = staffIdx * VOICES;
if (_selection.isNone()
|| (_selection.isList() && !_selection.isSingle())) {
if (_selection.isList())
deselectAll();
_selection.setRange(m->tick2segment(tick),
m == lastMeasure() ? 0 : m->last(),
staffIdx,
staffIdx + 1);
}
else if (_selection.isRange()) {
_selection.extendRangeSelection(m->tick2segment(tick),
m == lastMeasure() ? 0 : m->last(),
staffIdx,
tick,
etick);
Segment* s1 = m->tick2segment(tick);
if (!s1) // m is corrupted!
s1 = m->first(SegmentType::ChordRest);
Segment* s2 = m == lastMeasure() ? 0 : m->last();
if (_selection.isNone() || (_selection.isList() && !_selection.isSingle())) {
if (_selection.isList())
deselectAll();
_selection.setRange(s1, s2, staffIdx, staffIdx + 1);
}
else if (_selection.isRange())
_selection.extendRangeSelection(s1, s2, staffIdx, tick, etick);
else if (_selection.isSingle()) {
Element* oe = selection().element();
if (oe->isNote() || oe->isChordRest()) {
if (oe->isNote())
oe = oe->parent();

ChordRest* cr = toChordRest(oe);
int oetick = cr->segment()->tick();
Segment* startSegment = cr->segment();
Segment* endSegment = m->last();
if (tick < oetick) {
startSegment = m->tick2segment(tick);
if (etick <= oetick)
endSegment = cr->nextSegmentAfterCR(SegmentType::ChordRest
| SegmentType::EndBarLine
| SegmentType::Clef);

if (etick <= oetick) {
SegmentType st = SegmentType::ChordRest | SegmentType::EndBarLine | SegmentType::Clef;
endSegment = cr->nextSegmentAfterCR(st);
}
}
int staffStart = staffIdx;
int endStaff = staffIdx + 1;
Expand All @@ -2951,51 +2944,39 @@ void Score::selectRange(Element* e, int staffIdx)
}
else {
deselectAll();
_selection.setRange(m->tick2segment(tick),
m == lastMeasure() ? 0 : m->last(),
staffIdx,
staffIdx + 1);
_selection.setRange(s1, s2, staffIdx, staffIdx + 1);
}
}
else {
qDebug("SELECT_RANGE: measure: sel state %d", int(_selection.state()));
return;
}
}
else if (e->type() == ElementType::NOTE || e->isChordRest()) {
if (e->type() == ElementType::NOTE)
else if (e->isNote() || e->isChordRest()) {
if (e->isNote())
e = e->parent();
ChordRest* cr = toChordRest(e);

if (_selection.isNone()
|| (_selection.isList() && !_selection.isSingle())) {
if (_selection.isNone() || (_selection.isList() && !_selection.isSingle())) {
if (_selection.isList())
deselectAll();
_selection.setRange(cr->segment(),
cr->nextSegmentAfterCR(SegmentType::ChordRest
| SegmentType::EndBarLine
| SegmentType::Clef),
e->staffIdx(),
e->staffIdx() + 1);
SegmentType st = SegmentType::ChordRest | SegmentType::EndBarLine | SegmentType::Clef;
_selection.setRange(cr->segment(), cr->nextSegmentAfterCR(st), e->staffIdx(), e->staffIdx() + 1);
activeTrack = cr->track();
}
else if (_selection.isSingle()) {
Element* oe = _selection.element();
if (oe && (oe->type() == ElementType::NOTE || oe->type() == ElementType::REST)) {
if (oe->type() == ElementType::NOTE)
if (oe && (oe->isNote() || oe->isRest())) {
if (oe->isNote())
oe = oe->parent();
ChordRest* ocr = toChordRest(oe);

Segment* endSeg = tick2segmentMM(ocr->segment()->tick() + ocr->actualTicks());
if (!endSeg)
endSeg = ocr->segment()->next();

_selection.setRange(ocr->segment(),
endSeg,
oe->staffIdx(),
oe->staffIdx() + 1);
_selection.setRange(ocr->segment(), endSeg, oe->staffIdx(), oe->staffIdx() + 1);
_selection.extendRangeSelection(cr);

}
else {
select(e, SelectType::SINGLE, 0);
Expand Down
5 changes: 4 additions & 1 deletion libmscore/select.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,8 @@ ChordRest* Selection::activeCR() const

Segment* Selection::firstChordRestSegment() const
{
if (!isRange()) return 0;
if (!isRange())
return 0;

for (Segment* s = _startSegment; s && (s != _endSegment); s = s->next1MM()) {
if (!s->enabled())
Expand Down Expand Up @@ -564,6 +565,7 @@ void Selection::updateSelectedElements()
void Selection::setRange(Segment* startSegment, Segment* endSegment, int staffStart, int staffEnd)
{
Q_ASSERT(staffEnd > staffStart && staffStart >= 0 && staffEnd >= 0 && staffEnd <= _score->nstaves());
Q_ASSERT(!(endSegment && !startSegment));

_startSegment = startSegment;
_endSegment = endSegment;
Expand Down Expand Up @@ -1291,6 +1293,7 @@ void Selection::extendRangeSelection(Segment* seg, Segment* segAfter, int staffI
}
activeIsFirst ? _activeSegment = _startSegment : _activeSegment = _endSegment;
_score->setSelectionChanged(true);
Q_ASSERT(!(_endSegment && !_startSegment));
}

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

0 comments on commit 00e6040

Please sign in to comment.