void Fermata::layout() { Segment* s = segment(); if (!s) { // for use in palette setPos(QPointF()); return; } qreal x = 0.0; Element* e = s->element(track()); if (e) { if (e->isChord()) x = score()->noteHeadWidth() * staff()->mag(0) * .5; else x = e->x() + e->width() * staff()->mag(0) * .5; } qreal y = placeAbove() ? styleP(Sid::fermataPosAbove) : styleP(Sid::fermataPosBelow) + staff()->height(); setPos(QPointF(x, y)); // check used symbol QString name = Sym::id2name(_symId); if (placeAbove()) { if (name.endsWith("Below")) _symId = Sym::name2id(name.left(name.size() - 5) + "Above"); } else { if (name.endsWith("Above")) _symId = Sym::name2id(name.left(name.size() - 5) + "Below"); } QRectF b(symBbox(_symId)); setbbox(b.translated(-0.5 * b.width(), 0.0)); autoplaceSegmentElement(styleP(Sid::fermataMinDistance)); }
Sid Ottava::getPropertyStyle(Pid pid) const { Q_ASSERT(int(OttavaType::OTTAVA_22MB) - int(OttavaType::OTTAVA_8VA) == 5); static const Sid ss[24] = { Sid::ottava8VAPlacement, Sid::ottava8VAnoText, Sid::ottava8VBPlacement, Sid::ottava8VBnoText, Sid::ottava15MAPlacement, Sid::ottava15MAnoText, Sid::ottava15MBPlacement, Sid::ottava15MBnoText, Sid::ottava22MAPlacement, Sid::ottava22MAnoText, Sid::ottava22MBPlacement, Sid::ottava22MBnoText, Sid::ottava8VAPlacement, Sid::ottava8VAText, Sid::ottava8VBPlacement, Sid::ottava8VBText, Sid::ottava15MAPlacement, Sid::ottava15MAText, Sid::ottava15MBPlacement, Sid::ottava15MBText, Sid::ottava22MAPlacement, Sid::ottava22MAText, Sid::ottava22MBPlacement, Sid::ottava22MBText, }; switch (pid) { case Pid::OFFSET: return placeAbove() ? Sid::ottavaPosAbove : Sid::ottavaPosBelow; case Pid::PLACEMENT: { int idx = int(_ottavaType) * 2 + (_numbersOnly ? 0 : 12); return ss[idx]; } case Pid::BEGIN_TEXT: case Pid::CONTINUE_TEXT: { int idx = int(_ottavaType) * 2 + (_numbersOnly ? 0 : 12); return ss[idx+1]; // BEGIN_TEXT } case Pid::END_HOOK_HEIGHT: { int idx = int(_ottavaType) * 2 + (_numbersOnly ? 0 : 12); if (isStyled(Pid::PLACEMENT)) return score()->styleI(ss[idx]) == int(Placement::ABOVE) ? Sid::ottavaHookAbove : Sid::ottavaHookBelow; else return placeAbove() ? Sid::ottavaHookAbove : Sid::ottavaHookBelow; } default: return TextLineBase::getPropertyStyle(pid); } }
void RehearsalMark::layout() { if (autoplace()) setUserOff(QPointF()); qreal y; if (placeAbove()) y = score()->styleP(StyleIdx::rehearsalMarkPosAbove); else { qreal sh = staff() ? staff()->height() : 0; y = score()->styleP(StyleIdx::rehearsalMarkPosBelow) + sh + lineSpacing(); } setPos(QPointF(0.0, y)); Text::layout1(); Segment* s = segment(); if (s) { if (!s->rtick()) { // first CR of measure, decide whether to align to barline if (!s->prev() && align() & Align::CENTER) { // measure with no clef / keysig / timesig rxpos() -= s->x(); } else if (align() & Align::RIGHT) { // measure with clef / keysig / timesig, rehearsal mark right aligned // align left edge of rehearsal to barline if that is further to left qreal leftX = bbox().x(); qreal barlineX = -s->x(); rxpos() += qMin(leftX, barlineX) + width(); } } if (autoplace()) { int firstStaffIdx = s->measure()->system()->firstVisibleStaff(); qreal minDistance = score()->styleP(StyleIdx::rehearsalMarkMinDistance); Shape s1 = s->measure()->staffShape(firstStaffIdx); Shape s2 = shape().translated(s->pos() + pos()); if (placeAbove()) { qreal d = s2.minVerticalDistance(s1); if (d > -minDistance) rUserYoffset() = -d - minDistance; } else { qreal d = s1.minVerticalDistance(s2); if (d > -minDistance) rUserYoffset() = d + minDistance; } } } }
bool Fermata::setProperty(Pid propertyId, const QVariant& v) { switch (propertyId) { case Pid::PLACEMENT: { Placement p = Placement(v.toInt()); if (p != placement()) { QString s = Sym::id2name(_symId); bool up = placeAbove(); if (s.endsWith(up ? "Above" : "Below")) { QString s2 = s.left(s.size() - 5) + (up ? "Below" : "Above"); _symId = Sym::name2id(s2); } setPlacement(p); } } break; case Pid::PLAY: setPlay(v.toBool()); break; case Pid::TIME_STRETCH: setTimeStretch(v.toDouble()); score()->fixTicks(); break; default: return Element::setProperty(propertyId, v); } triggerLayout(); return true; }
void Fermata::layout() { Segment* s = segment(); setPos(QPointF()); if (!s) { // for use in palette setOffset(0.0, 0.0); QRectF b(symBbox(_symId)); setbbox(b.translated(-0.5 * b.width(), 0.0)); return; } if (isStyled(Pid::OFFSET)) setOffset(propertyDefault(Pid::OFFSET).toPointF()); Element* e = s->element(track()); if (e) { if (e->isChord()) rxpos() += score()->noteHeadWidth() * staff()->mag(Fraction(0, 1)) * .5; else rxpos() += e->x() + e->width() * staff()->mag(Fraction(0, 1)) * .5; } QString name = Sym::id2name(_symId); if (placeAbove()) { if (name.endsWith("Below")) _symId = Sym::name2id(name.left(name.size() - 5) + "Above"); } else { rypos() += staff()->height(); if (name.endsWith("Above")) _symId = Sym::name2id(name.left(name.size() - 5) + "Below"); } QRectF b(symBbox(_symId)); setbbox(b.translated(-0.5 * b.width(), 0.0)); autoplaceSegmentElement(styleP(Sid::fermataMinDistance)); }
void OttavaSegment::layout() { TextLineBaseSegment::layout(); if (parent()) { qreal y; if (placeAbove()) { y = score()->styleP(Sid::ottavaPosAbove); } else { qreal sh = ottava()->staff() ? ottava()->staff()->height() : 0; y = score()->styleP(Sid::ottavaPosBelow) + sh; } rypos() = y; if (autoplace()) { setUserOff(QPointF()); qreal minDistance = spatium() * .7; Shape s1 = shape().translated(pos()); if (ottava()->placeAbove()) { qreal d = system()->topDistance(staffIdx(), s1); if (d > -minDistance) rUserYoffset() = -d - minDistance; } else { qreal d = system()->bottomDistance(staffIdx(), s1); if (d > -minDistance) rUserYoffset() = d + minDistance; } } } }
void Jump::layout() { setPos(QPointF(0.0, score()->styleP(Sid::jumpPosAbove))); TextBase::layout1(); if (parent() && autoplace()) { setUserOff(QPointF()); #if 0 int si = staffIdx(); qreal minDistance = 0.5 * spatium(); // score()->styleP(Sid::tempoMinDistance); Shape& s1 = measure()->staffShape(si); Shape s2 = shape().translated(pos()); if (placeAbove()) { qreal d = s2.minVerticalDistance(s1); if (d > -minDistance) { qreal yd = -d - minDistance; rUserYoffset() = yd; s2.translate(QPointF(0.0, yd)); } } else { qreal d = s1.minVerticalDistance(s2); if (d > -minDistance) { qreal yd = d + minDistance; rUserYoffset() = yd; s2.translate(QPointF(0.0, yd)); } } s1.add(s2); #endif } }
void StaffTextBase::layout() { Staff* s = staff(); qreal y = placeAbove() ? styleP(Sid::staffTextPosAbove) : styleP(Sid::staffTextPosBelow) + (s ? s->height() : 0.0); setPos(QPointF(0.0, y)); TextBase::layout1(); autoplaceSegmentElement(styleP(Sid::staffTextMinDistance)); }
void Ottava::updateStyledProperties() { Q_ASSERT(int(OttavaType::OTTAVA_22MB) - int(OttavaType::OTTAVA_8VA) == 5); static const Sid ss[24] = { Sid::ottava8VAPlacement, Sid::ottava8VAnoText, Sid::ottava8VBPlacement, Sid::ottava8VBnoText, Sid::ottava15MAPlacement, Sid::ottava15MAnoText, Sid::ottava15MBPlacement, Sid::ottava15MBnoText, Sid::ottava22MAPlacement, Sid::ottava22MAnoText, Sid::ottava22MBPlacement, Sid::ottava22MBnoText, Sid::ottava8VAPlacement, Sid::ottava8VAText, Sid::ottava8VBPlacement, Sid::ottava8VBText, Sid::ottava15MAPlacement, Sid::ottava15MAText, Sid::ottava15MBPlacement, Sid::ottava15MBText, Sid::ottava22MAPlacement, Sid::ottava22MAText, Sid::ottava22MBPlacement, Sid::ottava22MBText, }; // switch right substyles depending on _ottavaType and _numbersOnly int idx = int(_ottavaType) * 2 + (_numbersOnly ? 0 : 12); _ottavaStyle[0].sid = ss[idx]; // PLACEMENT _ottavaStyle[2].sid = ss[idx+1]; // BEGIN_TEXT _ottavaStyle[3].sid = ss[idx+1]; // CONTINUE_TEXT if (isStyled(Pid::PLACEMENT)) _ottavaStyle[4].sid = score()->styleI(ss[idx]) == int(Placement::ABOVE) ? Sid::ottavaHookAbove : Sid::ottavaHookBelow; else _ottavaStyle[4].sid = placeAbove() ? Sid::ottavaHookAbove : Sid::ottavaHookBelow; styleChanged(); // this changes all styled properties with flag STYLED MuseScoreCore::mscoreCore->updateInspector(); }
void TempoText::layout() { qreal y = placeAbove() ? styleP(Sid::tempoPosAbove) : styleP(Sid::tempoPosBelow) + staff()->height(); setPos(QPointF(0.0, y)); TextBase::layout1(); Segment* s = segment(); if (!s) // for use in palette return; // tempo text on first chordrest of measure should align over time sig if present // if (!s->rtick()) { Segment* p = segment()->prev(SegmentType::TimeSig); if (p) { rxpos() -= s->x() - p->x(); Element* e = p->element(staffIdx() * VOICES); if (e) rxpos() += e->x(); } } autoplaceSegmentElement(styleP(Sid::tempoMinDistance)); }
void Pedal::setYoff(qreal val) { rUserYoffset() += val * spatium() - score()->styleP(placeAbove() ? Sid::pedalPosAbove : Sid::pedalPosBelow); }
Sid Trill::getPropertyStyle(Pid pid) const { if (pid == Pid::OFFSET) return placeAbove() ? Sid::trillPosAbove : Sid::trillPosBelow; return SLine::getPropertyStyle(pid); }
Sid Fermata::getPropertyStyle(Pid pid) const { if (pid == Pid::OFFSET) return placeAbove() ? Sid::fermataPosAbove : Sid::fermataPosBelow; return ScoreElement::getPropertyStyle(pid); }
Sid Pedal::getPropertyStyle(Pid pid) const { if (pid == Pid::OFFSET) return placeAbove() ? Sid::pedalPosAbove : Sid::pedalPosBelow; return TextLineBase::getPropertyStyle(pid); }
Sid Vibrato::getPropertyStyle(Pid pid) const { if (pid == Pid::OFFSET) return placeAbove() ? Sid::vibratoPosAbove : Sid::vibratoPosBelow; return SLine::getPropertyStyle(pid); }
void Fingering::layout() { if (parent()) { Fraction tick = parent()->tick(); const Staff* st = staff(); if (st && st->isTabStaff(tick) && !st->staffType(tick)->showTabFingering()) { setbbox(QRectF()); return; } } TextBase::layout(); rypos() = 0.0; // handle placement below if (autoplace() && note()) { Note* n = note(); Chord* chord = n->chord(); bool voices = chord->measure()->hasVoices(chord->staffIdx()); bool tight = voices && chord->notes().size() == 1 && !chord->beam() && tid() != Tid::STRING_NUMBER; qreal headWidth = n->bboxRightPos(); // update offset after drag qreal rebase = 0.0; if (offsetChanged() != OffsetChange::NONE) rebase = rebaseOffset(); // temporarily exclude self from chord shape setAutoplace(false); if (layoutType() == ElementType::CHORD) { Stem* stem = chord->stem(); Segment* s = chord->segment(); Measure* m = s->measure(); qreal sp = spatium(); qreal md = minDistance().val() * sp; SysStaff* ss = m->system()->staff(chord->vStaffIdx()); Staff* vStaff = chord->staff(); // TODO: use current height at tick if (n->mirror()) rxpos() -= n->ipos().x(); rxpos() += headWidth * .5; if (placeAbove()) { if (tight) { if (chord->stem()) rxpos() -= 0.8 * sp; rypos() -= 1.5 * sp; } else { QRectF r = bbox().translated(m->pos() + s->pos() + chord->pos() + n->pos() + pos()); SkylineLine sk(false); sk.add(r.x(), r.bottom(), r.width()); qreal d = sk.minDistance(ss->skyline().north()); qreal yd = 0.0; if (d > 0.0 && isStyled(Pid::MIN_DISTANCE)) yd -= d + height() * .25; // force extra space above staff & chord (but not other fingerings) qreal top; if (chord->up() && chord->beam() && stem) { top = stem->y() + stem->bbox().top(); } else { Note* un = chord->upNote(); top = qMin(0.0, un->y() + un->bbox().top()); } top -= md; qreal diff = (bbox().bottom() + ipos().y() + yd + n->y()) - top; if (diff > 0.0) yd -= diff; if (offsetChanged() != OffsetChange::NONE) { // user moved element within the skyline // we may need to adjust minDistance, yd, and/or offset bool inStaff = placeAbove() ? r.bottom() + rebase > 0.0 : r.top() + rebase < staff()->height(); rebaseMinDistance(md, yd, sp, rebase, inStaff); } rypos() += yd; } } else { if (tight) { if (chord->stem()) rxpos() += 0.8 * sp; rypos() += 1.5 * sp; } else { QRectF r = bbox().translated(m->pos() + s->pos() + chord->pos() + n->pos() + pos()); SkylineLine sk(true); sk.add(r.x(), r.top(), r.width()); qreal d = ss->skyline().south().minDistance(sk); qreal yd = 0.0; if (d > 0.0 && isStyled(Pid::MIN_DISTANCE)) yd += d + height() * .25; // force extra space below staff & chord (but not other fingerings) qreal bottom; if (!chord->up() && chord->beam() && stem) { bottom = stem->y() + stem->bbox().bottom(); } else { Note* dn = chord->downNote(); bottom = qMax(vStaff->height(), dn->y() + dn->bbox().bottom()); } bottom += md; qreal diff = bottom - (bbox().top() + ipos().y() + yd + n->y()); if (diff > 0.0) yd += diff; if (offsetChanged() != OffsetChange::NONE) { // user moved element within the skyline // we may need to adjust minDistance, yd, and/or offset bool inStaff = placeAbove() ? r.bottom() + rebase > 0.0 : r.top() + rebase < staff()->height(); rebaseMinDistance(md, yd, sp, rebase, inStaff); } rypos() += yd; } } } else if (tid() == Tid::LH_GUITAR_FINGERING) { // place to left of note qreal left = n->shape().left(); if (left - n->x() > 0.0) rxpos() -= left; else rxpos() -= n->x(); } // for other fingering styles, do not autoplace // restore autoplace setAutoplace(true); } else if (offsetChanged() != OffsetChange::NONE) { // rebase horizontally too, as autoplace may have adjusted it rebaseOffset(false); } setOffsetChanged(false); }
void Ottava::setYoff(qreal val) { rUserYoffset() += val * spatium() - score()->styleP(placeAbove() ? Sid::ottavaPosAbove : Sid::ottavaPosBelow); }