void TimeSigProperties::accept()
{
    if (zText->text() != timesig->numeratorString())
        timesig->setNumeratorString(zText->text());
    if (nText->text() != timesig->denominatorString())
        timesig->setDenominatorString(nText->text());

    TimeSigType ts = TimeSigType::NORMAL;
    if (textButton->isChecked())
        ts = TimeSigType::NORMAL;
    else if (fourfourButton->isChecked())
        ts = TimeSigType::FOUR_FOUR;
    else if (allaBreveButton->isChecked())
        ts = TimeSigType::ALLA_BREVE;
    else if (otherButton->isChecked()) {
        // if other symbol, set as normal text...
        ts = TimeSigType::NORMAL;
        ScoreFont* scoreFont = timesig->score()->scoreFont();
        SymId symId = (SymId)( otherCombo->itemData(otherCombo->currentIndex()).toInt() );
        // ...and set numerator to font string for symbol and denominator to empty string
        timesig->setNumeratorString(scoreFont->toString(symId));
        timesig->setDenominatorString(QString());
    }

    Fraction actual(zActual->value(), nActual->value());
    Fraction nominal(zNominal->value(), nNominal->value());
    timesig->setSig(actual, ts);
    timesig->setStretch(nominal / actual);

    Groups g = groups->groups();
    timesig->setGroups(g);
    QDialog::accept();
}
Beispiel #2
0
void Arpeggio::symbolLine(SymId end, SymId fill)
      {
      qreal y1 = -_userLen1;
      qreal y2 = _height + _userLen2;
      qreal w   = y2 - y1;
      qreal mag = magS();
      ScoreFont* f = score()->scoreFont();
      const QString& fillString = f->toString(fill);

      symbols.clear();
      symbols.append(f->toString(end));
      qreal w1 = f->bbox(end, mag).width();
      qreal w2 = f->width(fill, mag);
      int n    = lrint((w - w1) / w2);
      for (int i = 0; i < n; ++i)
           symbols.prepend(fillString);
      }
Beispiel #3
0
void TrillSegment::symbolLine(SymId start, SymId fill)
      {
      qreal x1 = 0;
      qreal x2 = pos2().x();
      qreal w   = x2 - x1;
      qreal mag = magS();
      ScoreFont* f = score()->scoreFont();

      _symbols.clear();
      _symbols.push_back(start);
      qreal w1 = f->advance(start, mag);
      qreal w2 = f->advance(fill, mag);
      int n    = lrint((w - w1) / w2);
      for (int i = 0; i < n; ++i)
           _symbols.push_back(fill);
      QRectF r(f->bbox(_symbols, mag));
      setbbox(r);
      }
Beispiel #4
0
void VibratoSegment::symbolLine(SymId start, SymId fill, SymId end)
      {
      qreal x1 = 0;
      qreal x2 = pos2().x();
      qreal w   = x2 - x1;
      qreal mag = magS();
      ScoreFont* f = score()->scoreFont();

      _symbols.clear();
      _symbols.push_back(start);
      qreal w1 = f->bbox(start, mag).width();
      qreal w2 = f->width(fill, mag);
      qreal w3 = f->width(end, mag);
      int n    = lrint((w - w1 - w3) / w2);
      for (int i = 0; i < n; ++i)
           _symbols.push_back(fill);
      _symbols.push_back(end);
      QRectF r(f->bbox(_symbols, mag));
      setbbox(r);
      }
Beispiel #5
0
void Marker::setMarkerType(MarkerType t)
      {
      _markerType = t;
      ScoreFont* f = score()->scoreFont();
      switch (t) {
            case MarkerType::SEGNO:
                  setText("&segno;");
                  setFont(f->font());
                  setLabel("segno");
                  break;

            case MarkerType::VARSEGNO:
                  setText("&segnoSerpent1;");
                  setFont(f->font());
                  setLabel("varsegno");
                  break;

            case MarkerType::CODA:
                  setText("&coda;");
                  setFont(f->font());
                  setLabel("codab");
                  break;

            case MarkerType::VARCODA:
                  setText("&codaSquare;");
                  setFont(f->font());
                  setLabel("varcoda");
                  break;

            case MarkerType::CODETTA:
                  setText("&coda;&coda;");
                  setFont(f->font());
                  setLabel("codetta");
                  break;

            case MarkerType::FINE:
                  setText("Fine");
                  setLabel("fine");
                  break;

            case MarkerType::TOCODA:
                  setText("To Coda");
                  setLabel("coda");
                  break;

            case MarkerType::USER:
                  break;

            default:
                  qDebug("unknown marker type %d\n", t);
                  break;
            }
      }
void TrillSegment::symbolLine(SymId start, SymId fill, SymId end)
      {
      qreal x1 = 0;
      qreal x2 = pos2().x();
      qreal w   = x2 - x1;
      qreal mag = magS();
      ScoreFont* f = score()->scoreFont();

      _symbols.clear();
      _symbols.append(f->toString(start));
      _symbols.append(f->toString(end));
      qreal w1 = f->bbox(start, mag).width();
      qreal w2 = f->width(fill, mag);
      qreal w3 = f->width(end, mag);
      int n    = lrint((w - w1 - w3) / w2);
      for (int i = 0; i < n; ++i)
           _symbols.insert(1, f->toString(fill));
      QRectF r(f->bbox(_symbols, mag));
      setbbox(r);
      }
Beispiel #7
0
void Marker::setMarkerType(MarkerType t)
      {
      _markerType = t;
      ScoreFont* f = score()->scoreFont();
      switch(t) {
            case MarkerType::SEGNO:
                  setText(f->toString(SymId::segno));
                  setLabel("segno");
                  break;

            case MarkerType::VARSEGNO:
                  setText(f->toString(SymId::segno));       // TODO-smufl
                  setLabel("varsegno");
                  break;

            case MarkerType::CODA:
                  setText(f->toString(SymId::coda));
                  setLabel("codab");
                  break;

            case MarkerType::VARCODA:
                  setText(f->toString(SymId::codaSquare));
                  setLabel("varcoda");
                  break;

            case MarkerType::CODETTA:
                  setText(f->toString(SymId::codaSquare));  // TODO-smufl
                  setLabel("codetta");
                  break;

            case MarkerType::FINE:
                  setText("Fine");
                  setLabel("fine");
                  break;

            case MarkerType::TOCODA:
                  setText("To Coda");
                  setLabel("coda");
                  break;

            case MarkerType::USER:
                  break;

            default:
                  qDebug("unknown marker type %d\n", t);
                  break;
            }
      }
TextPalette::TextPalette(QWidget* parent)
   : QWidget(parent)
      {
      setWindowFlags(Qt::Tool);
      setupUi(this);

      pCommon = new Palette;
      pCommon->setMag(0.8);
      pCommon->setGrid(33, 60);
      pCommon->setReadOnly(true);

      pSmufl = new Palette;
      pSmufl->setMag(0.8);
      pSmufl->setGrid(33, 60);
      pSmufl->setReadOnly(true);

      pUnicode = new Palette;
      pUnicode->setMag(0.8);
      pUnicode->setGrid(33, 60);
      pUnicode->setReadOnly(true);

      PaletteScrollArea* psa = new PaletteScrollArea(pCommon);
      psa->setRestrictHeight(false);

      tabWidget->clear();
      tabWidget->addTab(psa, tr("Common Symbols"));

      psa = new PaletteScrollArea(pSmufl);
      psa->setRestrictHeight(false);

      QSplitter* ws = new QSplitter;
      lws = new QListWidget;

      ScoreFont* scoreFont = ScoreFont::fontFactory("Bravura");
      QFile fi(scoreFont->fontPath() + "ranges.json");
      if (!fi.open(QIODevice::ReadOnly))
            qDebug("ScoreFont: open ranges file <%s> failed", qPrintable(fi.fileName()));
      QJsonParseError error;
      QJsonObject o = QJsonDocument::fromJson(fi.readAll(), &error).object();
      if (error.error != QJsonParseError::NoError)
            qDebug("Json parse error in <%s>(offset: %d): %s", qPrintable(fi.fileName()),
               error.offset, qPrintable(error.errorString()));
	int i = 0;
      QStringList smuflRangeNames;
      for (auto s : o.keys()) {
            QJsonObject range = o.value(s).toObject();
            QString desc = range.value("description").toString();
            QJsonArray glyphs = range.value("glyphs").toArray();
            if (glyphs.size() > 0) {
                  for (QJsonValue g : glyphs)
                        smuflMap[i].append(g.toString());
                  smuflRangeNames.append(desc);
                  i++;
                  }
            }

      lws->addItems(smuflRangeNames);
      lws->setCurrentRow(0);

      ws->addWidget(lws);
      ws->addWidget(psa);

      tabWidget->addTab(ws, tr("Musical Symbols"));

      psa = new PaletteScrollArea(pUnicode);
      psa->setRestrictHeight(false);

      QSplitter* wu = new QSplitter;
      lwu = new QListWidget;
      lwu->setSortingEnabled(true);
      for (i = 0; i < unicodeRangeNames.length(); i++) {
            QListWidgetItem* newItem = new QListWidgetItem(qApp->translate("accidental", unicodeRangeNames.at(i).toUtf8().constData()));
            newItem->setData(Qt::UserRole, i);
            lwu->addItem(newItem);
            if (i == 0)
                  lwu->setCurrentItem(newItem);
            }

      wu->addWidget(lwu);
      wu->addWidget(psa);

      tabWidget->addTab(wu, tr("Unicode Symbols"));

      connect(lws, SIGNAL(currentRowChanged(int)), SLOT(populateSmufl()));
      connect(lwu, SIGNAL(currentRowChanged(int)), SLOT(populateUnicode()));

	// others are done in setFont
      populateSmufl();

      setFocusPolicy(Qt::NoFocus);
      }
TimeSigProperties::TimeSigProperties(TimeSig* t, QWidget* parent)
    : QDialog(parent)
{
    setupUi(this);
    setWindowFlags(this->windowFlags() & ~Qt::WindowContextHelpButtonHint);
    timesig = t;

    zText->setText(timesig->numeratorString());
    nText->setText(timesig->denominatorString());
    // set validators for numerator and denominator strings
    // which only accept '+', '(', ')', digits and some time symb conventional representations
    QRegExp rx("[0-9+CO()\\x00A2\\x00D8]*");
    QValidator *validator = new QRegExpValidator(rx, this);
    zText->setValidator(validator);
    nText->setValidator(validator);

    Fraction nominal = timesig->sig() / timesig->stretch();
    nominal.reduce();
    zNominal->setValue(nominal.numerator());
    nNominal->setValue(nominal.denominator());
    Fraction sig(timesig->sig());
    zActual->setValue(sig.numerator());
    nActual->setValue(sig.denominator());
    zNominal->setEnabled(false);
    nNominal->setEnabled(false);

    // TODO: fix http://musescore.org/en/node/42341
    // for now, editing of actual (local) time sig is disabled in dialog
    // but more importantly, the dialog should make it clear that this is "local" change only
    // and not normally the right way to add 7/4 to a score
    zActual->setEnabled(false);
    nActual->setEnabled(false);
    switch (timesig->timeSigType()) {
    case TimeSigType::NORMAL:
        textButton->setChecked(true);
        break;
    case TimeSigType::FOUR_FOUR:
        fourfourButton->setChecked(true);
        break;
    case TimeSigType::ALLA_BREVE:
        allaBreveButton->setChecked(true);
        break;
    }

    // set ID's of other symbols
    static const SymId prolatioSymbols[] = {
        SymId::mensuralProlation1,          // tempus perfectum, prol. perfecta
        SymId::mensuralProlation2,          // tempus perfectum, prol. imperfecta
        SymId::mensuralProlation3,          // tempus perfectum, prol. imperfecta, dimin.
        SymId::mensuralProlation4,          // tempus perfectum, prol. perfecta, dimin.
        SymId::mensuralProlation5,          // tempus imperf. prol. perfecta
//            SymId::mensuralProlation6,              // same shape as common time
        SymId::mensuralProlation7,          // tempus imperf., prol. imperfecta, reversed
        SymId::mensuralProlation8,          // tempus imperf., prol. perfecta, dimin.
//            SymId::mensuralProlation9,              // same shape as alla breve
        SymId::mensuralProlation10,         // tempus imperf., prol imperfecta, dimin., reversed
        SymId::mensuralProlation11,         // tempus inperf., prol. perfecta, reversed
    };

    ScoreFont* scoreFont = t->score()->scoreFont();
    int idx = 0;
    for (SymId symId : prolatioSymbols) {
        const QString& str = scoreFont->toString(symId);
        if (str.size() > 0) {
            otherCombo->setItemData(idx, (int)symId);
            // if time sig matches this symbol string, set as selected
            if (timesig->timeSigType() == TimeSigType::NORMAL && timesig->denominatorString().isEmpty()
                    && timesig->numeratorString() == str) {
                textButton->setChecked(false);
                otherButton->setChecked(true);
                otherCombo->setCurrentIndex(idx);
            }
        }
        idx++;
    }

    Groups g = t->groups();
    if (g.empty())
        g = Groups::endings(timesig->sig());     // initialize with default
    groups->setSig(timesig->sig(), g);
}
TimeSigProperties::TimeSigProperties(TimeSig* t, QWidget* parent)
   : QDialog(parent)
      {
      setupUi(this);
      setWindowFlags(this->windowFlags() & ~Qt::WindowContextHelpButtonHint);
      timesig = t;

      zText->setText(timesig->numeratorString());
      nText->setText(timesig->denominatorString());
      // set validators for numerator and denominator strings
      // which only accept '+', '(', ')' and digits
      QRegExp rx("[0-9+()]*");
      QValidator *validator = new QRegExpValidator(rx, this);
      zText->setValidator(validator);
      nText->setValidator(validator);

      Fraction nominal = timesig->sig() * timesig->stretch();
      nominal.reduce();
      zNominal->setValue(nominal.numerator());
      nNominal->setValue(nominal.denominator());
      zActual->setValue(timesig->sig().numerator());
      nActual->setValue(timesig->sig().denominator());
      switch (timesig->timeSigType()) {
            case TSIG_NORMAL:
                  textButton->setChecked(true);
                  break;
            case TSIG_FOUR_FOUR:
                  fourfourButton->setChecked(true);
                  break;
            case TSIG_ALLA_BREVE:
                  allaBreveButton->setChecked(true);
                  break;
            }

      // set ID's of other symbols
      static const SymId prolatioSymbols[] = {
            SymId::mensuralTempPerfProlPerf,
            SymId::mensuralTempPerfProlImp,
            SymId::mensuralTempPerfProlImpDimin,
            SymId::mensuralTempPerfProlPerfDimin,
            SymId::mensuralTempImpProlPerf,
//            SymId::mensuralTempImpProlImp,          // same shape as common time
            SymId::mensuralTempImpProlImpRev,
            SymId::mensuralTempImpProlPerfDimin,
//            SymId::mensuralTempImpProlImpDimin,     // same shape as alla breve
            SymId::mensuralTempImpProlImpDiminRev,
            SymId::mensuralTempImpProlPerfRev,
            };

      ScoreFont* scoreFont = t->score()->scoreFont();
      int idx = 0;
      for (SymId symId : prolatioSymbols) {
            const QString& str = scoreFont->toString(symId);
            if (str.size() > 0) {
                  otherCombo->setItemData(idx, (int)symId);
                  // if time sig matches this symbol string, set as selected
                  if (timesig->timeSigType() == TSIG_NORMAL && timesig->denominatorString().isEmpty()
                  && timesig->numeratorString() == str) {
                        textButton->setChecked(false);
                        otherButton->setChecked(true);
                        otherCombo->setCurrentIndex(idx);
                        }
                  }
            idx++;
            }

      Groups g = t->groups();
      if (g.empty())
            g = Groups::endings(timesig->sig());     // initialize with default
      groups->setSig(timesig->sig(), g);
      }
Beispiel #11
0
void TimeSig::layout()
      {
      setPos(0.0, 0.0);
      qreal _spatium = spatium();

      setbbox(QRectF());                  // prepare for an empty time signature
      pointLargeLeftParen = QPointF();
      pz = QPointF();
      pn = QPointF();
      pointLargeRightParen = QPointF();

      qreal lineDist;
      int   numOfLines;
      TimeSigType sigType = timeSigType();
      Staff* _staff       = staff();

      if (_staff) {
            // if staff is without time sig, format as if no text at all
            if (!_staff->staffType(tick())->genTimesig() ) {
                  // reset position and box sizes to 0
                  // qDebug("staff: no time sig");
                  pointLargeLeftParen.rx() = 0.0;
                  pn.rx() = 0.0;
                  pz.rx() = 0.0;
                  pointLargeRightParen.rx() = 0.0;
                  setbbox(QRectF());
                  // leave everything else as it is:
                  // draw() will anyway skip any drawing if staff type has no time sigs
                  return;
                  }
            numOfLines  = _staff->lines(tick());
            lineDist    = _staff->lineDistance(tick());
            }
      else {
            // assume dimensions of a standard staff
            lineDist = 1.0;
            numOfLines = 5;
            }

      // if some symbol
      // compute vert. displacement to center in the staff height
      // determine middle staff position:

      qreal yoff = _spatium * (numOfLines-1) *.5 * lineDist;

      // C and Ccut are placed at the middle of the staff: use yoff directly
      if (sigType ==  TimeSigType::FOUR_FOUR) {
            pz = QPointF(0.0, yoff);
            setbbox(symBbox(SymId::timeSigCommon).translated(pz));
            ns.clear();
            ns.push_back(SymId::timeSigCommon);
            ds.clear();
            }
      else if (sigType == TimeSigType::ALLA_BREVE) {
            pz = QPointF(0.0, yoff);
            setbbox(symBbox(SymId::timeSigCutCommon).translated(pz));
            ns.clear();
            ns.push_back(SymId::timeSigCutCommon);
            ds.clear();
            }
      else {
            ns = toTimeSigString(_numeratorString.isEmpty()   ? QString::number(_sig.numerator())   : _numeratorString);
            ds = toTimeSigString(_denominatorString.isEmpty() ? QString::number(_sig.denominator()) : _denominatorString);

            ScoreFont* font = score()->scoreFont();
            QSizeF mag(magS() * _scale);

            QRectF numRect = font->bbox(ns, mag);
            QRectF denRect = font->bbox(ds, mag);

            // position numerator and denominator; vertical displacement:
            // number of lines is odd: 0.0 (strings are directly above and below the middle line)
            // number of lines even:   0.05 (strings are moved up/down to leave 1/10sp between them)

            qreal displ = (numOfLines & 1) ? 0.0 : (0.05 * _spatium);

            //align on the wider
            qreal pzY = yoff - (denRect.width() < 0.01 ? 0.0 : (displ + numRect.height() * .5));
            qreal pnY = yoff + displ + denRect.height() * .5;

            if (numRect.width() >= denRect.width()) {
                  // numerator: one space above centre line, unless denomin. is empty (if so, directly centre in the middle)
                  pz = QPointF(0.0, pzY);
                  // denominator: horiz: centred around centre of numerator | vert: one space below centre line
                  pn = QPointF((numRect.width() - denRect.width())*.5, pnY);
                  }
            else {
                  // numerator: one space above centre line, unless denomin. is empty (if so, directly centre in the middle)
                  pz = QPointF((denRect.width() - numRect.width())*.5, pzY);
                  // denominator: horiz: centred around centre of numerator | vert: one space below centre line
                  pn = QPointF(0.0, pnY);
                  }

            // centering of parenthesis so the middle of the parenthesis is at the divisor marking level
            int centerY = yoff/2 + _spatium;
            int widestPortion = numRect.width() > denRect.width() ? numRect.width() : denRect.width();
            pointLargeLeftParen = QPointF(-_spatium, centerY);
            pointLargeRightParen = QPointF(widestPortion + _spatium, centerY);

            setbbox(numRect.translated(pz));   // translate bounding boxes to actual string positions
            addbbox(denRect.translated(pn));
            if (_largeParentheses) {
                  addbbox(QRect(pointLargeLeftParen.x(), pointLargeLeftParen.y() - denRect.height(), _spatium / 2, numRect.height() + denRect.height()));
                  addbbox(QRect(pointLargeRightParen.x(), pointLargeRightParen.y() - denRect.height(),  _spatium / 2, numRect.height() + denRect.height()));
                  }
            }
      }