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(); }
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); }
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); }
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); }
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); }
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); }
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())); } } }