bool Part::hasDrumStaff() { if (!staves()) return false; for (Staff* s : *staves()) { if (s && s->isDrumStaff(0)) return true; } return false; }
void TmultiScore::onClefChanged(Tclef cl) { if (staffCount() > 1) { int staffNr = SENDER_TO_STAFF->number(); for (int i = 0; i < staffCount(); i++) if (staves(i)->number() != staffNr) { staves(i)->disconnect(SIGNAL(clefChanged(Tclef))); staves(i)->onClefChanged(cl); connect(staves(i), SIGNAL(clefChanged(Tclef)), this, SLOT(onClefChanged(Tclef))); } } TsimpleScore::onClefChanged(cl); }
void TmultiScore::setEnableKeySign(bool isEnabled) { if (isEnabled != (bool)staff()->scoreKey()) { scoreScene()->mouseEntersOnKey(false); for (int i = 0; i < m_staves.size(); ++i) { staves(i)->setEnableKeySign(isEnabled); if (isEnabled) connect(staves(i)->scoreKey(), SIGNAL(keySignatureChanged()), this, SLOT(keyChangedSlot())); } if (isEnabled) staff()->scoreKey()->showKeyName(true); } }
/** * Before emitting signals about clicked/selected note in read only state, * a code below checks is any staff lays under clicked note. * This is due to staves are partially placed one over another. */ void TmultiScore::roClickedSlot(TscoreNote* sn, const QPointF& clickPos) { if (m_selectReadOnly) { int staffNr = sn->staff()->number(); if (clickPos.y() < sn->staff()->hiNotePos() && sn->staff()->number() > 0) // above staff staffNr--; else if (clickPos.y() > sn->staff()->loNotePos() && sn->staff()->number() < staffCount() - 1 && sn->index() <= staves(staffNr + 1)->count()) // below staff staffNr++; if (staffNr != sn->staff()->number()) { sn->staff()->setZValue(10); // // put fake staff under staves(staffNr)->setZValue(11); // and clicked staff above others } emit lockedNoteClicked(staffNr * staff()->maxNoteCount() + sn->index()); } }
Score::FileError MasterScore::read300(XmlReader& e) { while (e.readNextStartElement()) { const QStringRef& tag(e.name()); if (tag == "programVersion") { setMscoreVersion(e.readElementText()); parseVersion(mscoreVersion()); } else if (tag == "programRevision") setMscoreRevision(e.readInt()); else if (tag == "Score") { if (!read(e)) return FileError::FILE_BAD_FORMAT; } else if (tag == "Revision") { Revision* revision = new Revision; revision->read(e); revisions()->add(revision); } } int id = 1; for (LinkedElements* le : e.linkIds()) le->setLid(this, id++); for (Staff* s : staves()) s->updateOttava(); setCreated(false); return FileError::FILE_NO_ERROR; }
bool MasterScore::read(XmlReader& e) { if (!Score::read(e)) return false; for (Staff* s : staves()) s->updateOttava(); setCreated(false); return true; }
bool Score::read(XmlReader& e) { while (e.readNextStartElement()) { e.setTrack(-1); const QStringRef& tag(e.name()); if (tag == "Staff") readStaff(e); else if (tag == "Omr") { #ifdef OMR masterScore()->setOmr(new Omr(this)); masterScore()->omr()->read(e); #else e.skipCurrentElement(); #endif } else if (tag == "Audio") { _audio = new Audio; _audio->read(e); } else if (tag == "showOmr") masterScore()->setShowOmr(e.readInt()); else if (tag == "playMode") _playMode = PlayMode(e.readInt()); else if (tag == "LayerTag") { int id = e.intAttribute("id"); const QString& t = e.attribute("tag"); QString val(e.readElementText()); if (id >= 0 && id < 32) { _layerTags[id] = t; _layerTagComments[id] = val; } } else if (tag == "Layer") { Layer layer; layer.name = e.attribute("name"); layer.tags = e.attribute("mask").toUInt(); _layer.append(layer); e.readNext(); } else if (tag == "currentLayer") _currentLayer = e.readInt(); else if (tag == "Synthesizer") _synthesizerState.read(e); else if (tag == "page-offset") _pageNumberOffset = e.readInt(); else if (tag == "Division") _fileDivision = e.readInt(); else if (tag == "showInvisible") _showInvisible = e.readInt(); else if (tag == "showUnprintable") _showUnprintable = e.readInt(); else if (tag == "showFrames") _showFrames = e.readInt(); else if (tag == "showMargins") _showPageborders = e.readInt(); else if (tag == "Style") { qreal sp = style().value(Sid::spatium).toDouble(); style().load(e); // if (_layoutMode == LayoutMode::FLOAT || _layoutMode == LayoutMode::SYSTEM) { if (_layoutMode == LayoutMode::FLOAT) { // style should not change spatium in // float mode style().set(Sid::spatium, sp); } _scoreFont = ScoreFont::fontFactory(style().value(Sid::MusicalSymbolFont).toString()); } else if (tag == "copyright" || tag == "rights") { Text* text = new Text(this); text->read(e); setMetaTag("copyright", text->xmlText()); delete text; } else if (tag == "movement-number") setMetaTag("movementNumber", e.readElementText()); else if (tag == "movement-title") setMetaTag("movementTitle", e.readElementText()); else if (tag == "work-number") setMetaTag("workNumber", e.readElementText()); else if (tag == "work-title") setMetaTag("workTitle", e.readElementText()); else if (tag == "source") setMetaTag("source", e.readElementText()); else if (tag == "metaTag") { QString name = e.attribute("name"); setMetaTag(name, e.readElementText()); } else if (tag == "Part") { Part* part = new Part(this); part->read(e); _parts.push_back(part); } else if ((tag == "HairPin") || (tag == "Ottava") || (tag == "TextLine") || (tag == "Volta") || (tag == "Trill") || (tag == "Slur") || (tag == "Pedal")) { Spanner* s = toSpanner(Element::name2Element(tag, this)); s->read(e); addSpanner(s); } else if (tag == "Excerpt") { if (MScore::noExcerpts) e.skipCurrentElement(); else { if (isMaster()) { Excerpt* ex = new Excerpt(static_cast<MasterScore*>(this)); ex->read(e); excerpts().append(ex); } else { qDebug("Score::read(): part cannot have parts"); e.skipCurrentElement(); } } } else if (e.name() == "Tracklist") { int strack = e.intAttribute("sTrack", -1); int dtrack = e.intAttribute("dstTrack", -1); if (strack != -1 && dtrack != -1) e.tracks().insert(strack, dtrack); e.skipCurrentElement(); } else if (tag == "Score") { // recursion if (MScore::noExcerpts) e.skipCurrentElement(); else { e.tracks().clear(); // ??? MasterScore* m = masterScore(); Score* s = new Score(m, MScore::baseStyle()); Excerpt* ex = new Excerpt(m); ex->setPartScore(s); e.setLastMeasure(nullptr); s->read(e); ex->setTracks(e.tracks()); m->addExcerpt(ex); } } else if (tag == "name") { QString n = e.readElementText(); if (!isMaster()) //ignore the name if it's not a child score excerpt()->setTitle(n); } else if (tag == "layoutMode") { QString s = e.readElementText(); if (s == "line") _layoutMode = LayoutMode::LINE; else if (s == "system") _layoutMode = LayoutMode::SYSTEM; else qDebug("layoutMode: %s", qPrintable(s)); } else e.unknown(); } e.reconnectBrokenConnectors(); if (e.error() != QXmlStreamReader::NoError) { qDebug("%s: xml read error at line %lld col %lld: %s", qPrintable(e.getDocName()), e.lineNumber(), e.columnNumber(), e.name().toUtf8().data()); MScore::lastError = QObject::tr("XML read error at line %1, column %2: %3").arg(e.lineNumber()).arg(e.columnNumber()).arg(e.name().toString()); return false; } connectTies(); _fileDivision = MScore::division; #if 0 // TODO:barline // // sanity check for barLineSpan // for (Staff* st : staves()) { int barLineSpan = st->barLineSpan(); int idx = st->idx(); int n = nstaves(); if (idx + barLineSpan > n) { qDebug("bad span: idx %d span %d staves %d", idx, barLineSpan, n); // span until last staff barLineSpan = n - idx; st->setBarLineSpan(barLineSpan); } else if (idx == 0 && barLineSpan == 0) { qDebug("bad span: idx %d span %d staves %d", idx, barLineSpan, n); // span from the first staff until the start of the next span barLineSpan = 1; for (int i = 1; i < n; ++i) { if (staff(i)->barLineSpan() == 0) ++barLineSpan; else break; } st->setBarLineSpan(barLineSpan); } // check spanFrom int minBarLineFrom = st->lines(0) == 1 ? BARLINE_SPAN_1LINESTAFF_FROM : MIN_BARLINE_SPAN_FROMTO; if (st->barLineFrom() < minBarLineFrom) st->setBarLineFrom(minBarLineFrom); if (st->barLineFrom() > st->lines(0) * 2) st->setBarLineFrom(st->lines(0) * 2); // check spanTo Staff* stTo = st->barLineSpan() <= 1 ? st : staff(idx + st->barLineSpan() - 1); // 1-line staves have special bar line spans int maxBarLineTo = stTo->lines(0) == 1 ? BARLINE_SPAN_1LINESTAFF_TO : stTo->lines(0) * 2; if (st->barLineTo() < MIN_BARLINE_SPAN_FROMTO) st->setBarLineTo(MIN_BARLINE_SPAN_FROMTO); if (st->barLineTo() > maxBarLineTo) st->setBarLineTo(maxBarLineTo); // on single staff span, check spanFrom and spanTo are distant enough if (st->barLineSpan() == 1) { if (st->barLineTo() - st->barLineFrom() < MIN_BARLINE_FROMTO_DIST) { st->setBarLineFrom(0); st->setBarLineTo(0); } } } #endif if (!masterScore()->omr()) masterScore()->setShowOmr(false); fixTicks(); masterScore()->rebuildMidiMapping(); masterScore()->updateChannel(); // createPlayEvents(); return true; }
void TmultiScore::setNote(int index, const Tnote& note) { if (index < notesCount()) staves(index / staff()->maxNoteCount())->setNote(index % staff()->maxNoteCount(), note); }