コード例 #1
0
ファイル: slur.cpp プロジェクト: kuribas/MuseScore
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;
      }
コード例 #2
0
ファイル: slur.cpp プロジェクト: kuribas/MuseScore
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);
      }
コード例 #3
0
ファイル: slur.cpp プロジェクト: kuribas/MuseScore
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);
            }
      }
コード例 #4
0
ファイル: slur.cpp プロジェクト: Archer90/MuseScore
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());
      }
コード例 #5
0
ファイル: slur.cpp プロジェクト: kuribas/MuseScore
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);
            }
      }
コード例 #6
0
ファイル: slur.cpp プロジェクト: kuribas/MuseScore
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();
      }
コード例 #7
0
ファイル: slur.cpp プロジェクト: kuribas/MuseScore
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();
      }