bool SlurSegment::edit(MuseScoreView* viewer, int curGrip, int key, Qt::KeyboardModifiers modifiers, const QString&) { Slur* sl = static_cast<Slur*>(slurTie()); if (key == Qt::Key_X) { sl->setSlurDirection(sl->up() ? MScore::DOWN : MScore::UP); sl->layout(); return true; } if (slurTie()->type() != SLUR) return false; if (!((modifiers & Qt::ShiftModifier) && ((subtype() == SEGMENT_SINGLE) || (subtype() == SEGMENT_BEGIN && curGrip == 0) || (subtype() == SEGMENT_END && curGrip == 3) ))) return false; ChordRest* cr = 0; Element* e = curGrip == 0 ? sl->startElement() : sl->endElement(); Element* e1 = curGrip == 0 ? sl->endElement() : sl->startElement(); if (key == Qt::Key_Left) cr = prevChordRest((ChordRest*)e); else if (key == Qt::Key_Right) cr = nextChordRest((ChordRest*)e); if (cr == 0 || cr == (ChordRest*)e1) return true; changeAnchor(viewer, curGrip, cr); return true; }
void SlurSegment::draw(QPainter* painter) const { QPen pen(curColor()); if (slurTie()->lineType() == 0) { painter->setBrush(QBrush(QColor(curColor()))); pen.setCapStyle(Qt::RoundCap); pen.setJoinStyle(Qt::RoundJoin); qreal lw = point(score()->styleS(ST_SlurEndWidth)); pen.setWidthF(lw); } else if (slurTie()->lineType() == 1) { painter->setBrush(Qt::NoBrush); qreal lw = point(score()->styleS(ST_SlurDottedWidth)); pen.setWidthF(lw); pen.setStyle(Qt::DotLine); } else if (slurTie()->lineType() == 2) { painter->setBrush(Qt::NoBrush); qreal lw = point(score()->styleS(ST_SlurDottedWidth)); pen.setWidthF(lw); pen.setStyle(Qt::DashLine); } painter->setPen(pen); painter->drawPath(path); }
void SlurSegment::changeAnchor(MuseScoreView* viewer, int curGrip, ChordRest* cr) { Slur* sl = static_cast<Slur*>(slurTie()); if (curGrip == 0) { ((ChordRest*)sl->startElement())->removeSlurFor(sl); sl->setStartElement(cr); cr->addSlurFor(sl); } else { ((ChordRest*)sl->endElement())->removeSlurBack(sl); sl->setEndElement(cr); cr->addSlurBack(sl); } int segments = sl->spannerSegments().size(); ups[curGrip].off = QPointF(); sl->layout(); if (sl->spannerSegments().size() != segments) { SlurSegment* newSegment = curGrip == 3 ? sl->backSegment() : sl->frontSegment(); score()->endCmd(); score()->startCmd(); viewer->startEdit(newSegment, curGrip); score()->setLayoutAll(true); } }
void SlurSegment::layout(const QPointF& p1, const QPointF& p2) { ups[GRIP_START].p = p1; ups[GRIP_END].p = p2; slurTie()->computeBezier(this); setbbox(path.boundingRect()); }
void SlurSegment::editDrag(const EditData& ed) { qreal _spatium = spatium(); ups[ed.curGrip].off += (ed.delta / _spatium); if (ed.curGrip == GRIP_START || ed.curGrip == GRIP_END) { slurTie()->computeBezier(this); // // move anchor for slurs // Slur* slur = static_cast<Slur*>(slurTie()); Element* e = ed.view->elementNear(ed.pos); if ((slur->type() == SLUR) && ( (ed.curGrip == GRIP_START && (subtype() == SEGMENT_SINGLE || subtype() == SEGMENT_BEGIN)) || (ed.curGrip == GRIP_END && (subtype() == SEGMENT_SINGLE || subtype() == SEGMENT_END)) ) ) { if (e && e->type() == NOTE) { Chord* chord = static_cast<Note*>(e)->chord(); if ((ed.curGrip == GRIP_END && chord != slur->endElement()) || (ed.curGrip == GRIP_START && chord != slur->startElement())) { changeAnchor(ed.view, ed.curGrip, chord); QPointF p1 = ed.pos - ups[ed.curGrip].p - pagePos(); ups[ed.curGrip].off = p1 / _spatium; return; } } } } else if (ed.curGrip == GRIP_BEZIER1 || ed.curGrip == GRIP_BEZIER2) slurTie()->computeBezier(this); else if (ed.curGrip == GRIP_SHOULDER) { ups[ed.curGrip].off = QPointF(); slurTie()->computeBezier(this, ed.delta); } else if (ed.curGrip == GRIP_DRAG) { ups[GRIP_DRAG].off = QPointF(); setUserOff(userOff() + ed.delta); } }
void SlurSegment::setGrip(int n, const QPointF& pt) { switch(n) { case GRIP_START: case GRIP_END: ups[n].off = ((pt * spatium()) - (ups[n].p - gripAnchor(n))) / spatium(); break; default: ups[n].off = pt; break; } slurTie()->layout(); }
QPointF SlurSegment::gripAnchor(int grip) const { SlurPos spos; slurTie()->slurPos(&spos); QPointF sp(system()->pagePos()); QPointF p1(spos.p1 + spos.system1->pagePos()); QPointF p2(spos.p2 + spos.system2->pagePos()); switch (subtype()) { case SEGMENT_SINGLE: if (grip == GRIP_START) return p1; else if (grip == GRIP_END) return p2; break; case SEGMENT_BEGIN: if (grip == GRIP_START) return p1; else if (grip == GRIP_END) return system()->abbox().topRight(); break; case SEGMENT_MIDDLE: if (grip == GRIP_START) return sp; else if (grip == GRIP_END) return system()->abbox().topRight(); break; case SEGMENT_END: if (grip == GRIP_START) return sp; else if (grip == GRIP_END) return p2; break; } return QPointF(); }