Measure* MeasureBase::prevMeasure() const { MeasureBase* m = prev(); while (m) { if (m->isMeasure()) return toMeasure(m); m = m->prev(); } return 0; }
Segment* Segment::prev1() const { if (prev()) return prev(); MeasureBase* m = measure(); for (;;) { m = m->prev(); if (m == 0) return 0; if (m->type() == MEASURE) return static_cast<Measure*>(m)->last(); } }
Measure* MeasureBase::prevMeasureMM() const { MeasureBase* m = prev(); while (m) { if (m->isMeasure()) { Measure* mm = toMeasure(m); if (score()->styleB(StyleIdx::createMultiMeasureRests)) { if (mm->mmRestCount() >= 0) { if (mm->hasMMRest()) return mm->mmRest(); return mm; } } else return mm; } m = m->prev(); } return 0; }
ChordRest* Score::prevMeasure(ChordRest* element) { if (!element) return 0; MeasureBase* mb = element->measure()->prev(); while (mb && mb->type() != Element::MEASURE) mb = mb->prev(); Measure* measure = static_cast<Measure*>(mb); int startTick = element->measure()->first()->nextChordRest(element->track())->tick(); bool last = false; if ((selection().state() == SEL_RANGE) && selection().isEndActive() && selection().startSegment()->tick() <= startTick) last = true; else if (element->tick() != startTick) { measure = element->measure(); } if (!measure) { measure = element->measure(); last = false; } int staff = element->staffIdx(); Segment* startSeg = last ? measure->last() : measure->first(); for (Segment* seg = startSeg; seg; seg = last ? seg->prev() : seg->next()) { int etrack = (staff+1) * VOICES; for (int track = staff * VOICES; track < etrack; ++track) { Element* pel = seg->element(track); if (pel && pel->isChordRest()) return static_cast<ChordRest*>(pel); } } return 0; }