void InspectorBarLine::manageSpanData() { #if 0 BarLine* bl = toBarLine(inspector->element()); // determine MIN and MAX for SPANFROM and SPANTO Staff* staffFrom = bl->staff(); Staff* staffTo = bl->score()->staff(bl->staffIdx() + bl->span() - 1); int staffFromLines= (staffFrom ? staffFrom->lines(bl->tick()) : 5); int staffToLines = (staffTo ? staffTo->lines(bl->tick()) : 5); // From: min = minimum possible according to number of staff lines // max = if same as To, at least 1sp (2 units) above To; if not, max possible according to num.of lines int min = staffFromLines == 1 ? BARLINE_SPAN_1LINESTAFF_FROM : MIN_BARLINE_SPAN_FROMTO; int max = bl->span() < 2 ? bl->spanTo() - MIN_BARLINE_FROMTO_DIST : (staffFromLines == 1 ? BARLINE_SPAN_1LINESTAFF_TO : (staffFromLines-1) * 2 + 2); b.spanFrom->setMinimum(min); b.spanFrom->setMaximum(max); // To: min = if same as From, at least 1sp (2 units) below From; if not, min possible according to num.of lines // max = max possible according to number of staff lines min = bl->span() < 2 ? bl->spanFrom() + MIN_BARLINE_FROMTO_DIST : (staffToLines == 1 ? BARLINE_SPAN_1LINESTAFF_FROM : MIN_BARLINE_SPAN_FROMTO); max = staffToLines == 1 ? BARLINE_SPAN_1LINESTAFF_TO : (staffToLines-1) * 2 + 2; b.spanTo->setMinimum(min); b.spanTo->setMaximum(max); // determine MAX for SPAN max = bl->score()->nstaves() - bl->staffIdx(); b.span->setMaximum(max); #endif }
void InspectorBarLine::setElement() { InspectorElementBase::setElement(); BarLine* bl = toBarLine(inspector->element()); // enable / disable individual type combo items according to score and selected bar line status bool bMultiStaff = bl->score()->nstaves() > 1; BarLineType blt = bl->barLineType(); bool isRepeat = blt & (BarLineType::START_REPEAT | BarLineType::END_REPEAT | BarLineType::END_START_REPEAT); const QStandardItemModel* model = qobject_cast<const QStandardItemModel*>(b.type->model()); int i = 0; for (auto& k : BarLine::barLineTable) { QStandardItem* item = model->item(i); // if combo item is repeat type, should be disabled for multi-staff scores if (k.type & (BarLineType::START_REPEAT | BarLineType::END_REPEAT | BarLineType::END_START_REPEAT)) { // disable / enable item->setFlags(bMultiStaff ? item->flags() & ~(Qt::ItemIsSelectable|Qt::ItemIsEnabled) : item->flags() | (Qt::ItemFlags)(Qt::ItemIsSelectable|Qt::ItemIsEnabled) ); } // if combo item is NOT repeat type, should be disabled if selected bar line is a repeat else { item->setFlags(isRepeat ? item->flags() & ~(Qt::ItemIsSelectable|Qt::ItemIsEnabled) : item->flags() | (Qt::ItemFlags)(Qt::ItemIsSelectable|Qt::ItemIsEnabled) ); } ++i; } #if 0 blockSpanDataSignals(true); manageSpanData(); blockSpanDataSignals(false); #endif }
void InspectorBarLine::presetTick2Clicked() { BarLine* bl = toBarLine(inspector->element()); Score* score = bl->score(); score->startCmd(); bl->undoChangeProperty(P_ID::BARLINE_SPAN, false); bl->undoChangeProperty(P_ID::BARLINE_SPAN_FROM, BARLINE_SPAN_TICK2_FROM); bl->undoChangeProperty(P_ID::BARLINE_SPAN_TO, BARLINE_SPAN_TICK2_TO); score->endCmd(); }
void InspectorBarLine::presetDefaultClicked() { BarLine* bl = toBarLine(inspector->element()); Score* score = bl->score(); score->startCmd(); bl->undoResetProperty(P_ID::BARLINE_SPAN); bl->undoResetProperty(P_ID::BARLINE_SPAN_FROM); bl->undoResetProperty(P_ID::BARLINE_SPAN_TO); score->endCmd(); }
void InspectorBarLine::setAsStaffDefault() { BarLine* bl = toBarLine(inspector->element()); Staff* staff = bl->staff(); Score* score = bl->score(); score->startCmd(); staff->undoChangeProperty(Pid::STAFF_BARLINE_SPAN, bl->getProperty(Pid::BARLINE_SPAN)); staff->undoChangeProperty(Pid::STAFF_BARLINE_SPAN_FROM, bl->getProperty(Pid::BARLINE_SPAN_FROM)); staff->undoChangeProperty(Pid::STAFF_BARLINE_SPAN_TO, bl->getProperty(Pid::BARLINE_SPAN_TO)); if (bl->barLineType() == BarLineType::NORMAL) bl->setGenerated(true); score->endCmd(); }
void InspectorBarLine::presetShort2Clicked() { BarLine* bl = toBarLine(inspector->element()); Score* score = bl->score(); score->startCmd(); bl->undoChangeProperty(P_ID::BARLINE_SPAN, false); bl->undoChangeProperty(P_ID::BARLINE_SPAN_FROM, BARLINE_SPAN_SHORT2_FROM); int shortDelta = bl->staff() ? (bl->staff()->lines(bl->tick()) - 5) * 2 : 0; bl->undoChangeProperty(P_ID::BARLINE_SPAN_TO, BARLINE_SPAN_SHORT2_TO + shortDelta); score->endCmd(); }
void InspectorBarLine::presetShort2Clicked() { Score* score = inspector->element()->score(); score->startCmd(); BarLine* bl; for (Element* e : *inspector->el()) { if (e->isBarLine()) { bl = toBarLine(e); bl->undoChangeProperty(Pid::BARLINE_SPAN, false); bl->undoChangeProperty(Pid::BARLINE_SPAN_FROM, BARLINE_SPAN_SHORT2_FROM); int shortDelta = bl->staff() ? (bl->staff()->lines(bl->tick()) - 5) * 2 : 0; bl->undoChangeProperty(Pid::BARLINE_SPAN_TO, BARLINE_SPAN_SHORT2_TO + shortDelta); } } score->endCmd(); }
void InspectorBarLine::presetTick2Clicked() { Score* score = inspector->element()->score(); score->startCmd(); BarLine* bl; for (Element* e : *inspector->el()) { if (e->isBarLine()) { bl = toBarLine(e); bl->undoChangeProperty(Pid::BARLINE_SPAN, false); bl->undoChangeProperty(Pid::BARLINE_SPAN_FROM, BARLINE_SPAN_TICK2_FROM); bl->undoChangeProperty(Pid::BARLINE_SPAN_TO, BARLINE_SPAN_TICK2_TO); } } score->endCmd(); }
void InspectorBarLine::presetDefaultClicked() { Score* score = inspector->element()->score(); score->startCmd(); BarLine* bl; for (Element* e : *inspector->el()) { if (e->isBarLine()) { bl = toBarLine(e); bl->undoResetProperty(Pid::BARLINE_SPAN); bl->undoResetProperty(Pid::BARLINE_SPAN_FROM); bl->undoResetProperty(Pid::BARLINE_SPAN_TO); } } score->endCmd(); }
void System::layout2() { VBox* b = vbox(); if (b) { b->layout(); setbbox(b->bbox()); return; } setPos(0.0, 0.0); QList<std::pair<int,SysStaff*>> visibleStaves; int firstStaffIdx = -1; int lastStaffIdx = 0; int firstStaffInitialIdx = -1; int lastStaffInitialIdx = 0; Measure* fm = firstMeasure(); for (int i = 0; i < _staves.size(); ++i) { Staff* s = score()->staff(i); SysStaff* ss = _staves[i]; if (s->show() && ss->show()) { visibleStaves.append(std::pair<int,SysStaff*>(i, ss)); if (firstStaffIdx == -1) firstStaffIdx = i; if (i > lastStaffIdx) lastStaffIdx = i; if (fm && fm->visible(i)) { if (firstStaffInitialIdx == -1) firstStaffInitialIdx = i; lastStaffInitialIdx = i; } } else { ss->setbbox(QRectF()); // already done in layout() ? } } if (firstStaffIdx == -1) firstStaffIdx = 0; if (firstStaffInitialIdx == -1) firstStaffInitialIdx = 0; qreal _spatium = spatium(); qreal y = 0.0; qreal minVerticalDistance = score()->styleP(StyleIdx::minVerticalDistance); qreal staffDistance = score()->styleP(StyleIdx::staffDistance); qreal akkoladeDistance = score()->styleP(StyleIdx::akkoladeDistance); if (visibleStaves.empty()) { qDebug("====no visible staves, staves %d, score staves %d", _staves.size(), score()->nstaves()); } for (auto i = visibleStaves.begin();; ++i) { SysStaff* ss = i->second; int si1 = i->first; Staff* staff = score()->staff(si1); auto ni = i + 1; qreal h = staff->height(); if (ni == visibleStaves.end()) { ss->setYOff(staff->lines() == 1 ? _spatium * staff->mag() : 0.0); ss->bbox().setRect(_leftMargin, y, width() - _leftMargin, h); break; } int si2 = ni->first; qreal dist = h; switch (staff->innerBracket()) { case BracketType::BRACE: dist += akkoladeDistance; break; case BracketType::NORMAL: case BracketType::SQUARE: case BracketType::LINE: case BracketType::NO_BRACKET: dist += staffDistance; break; } dist += score()->staff(si2)->userDist(); for (MeasureBase* mb : ml) { if (!mb->isMeasure()) continue; Measure* m = toMeasure(mb); Shape& s1 = m->staffShape(si1); Shape& s2 = m->staffShape(si2); qreal d = s1.minVerticalDistance(s2) + minVerticalDistance; dist = qMax(dist, d); Spacer* sp = m->mstaff(si1)->_vspacerDown; if (sp) { if (sp->spacerType() == SpacerType::FIXED) { dist = staff->height() + sp->gap(); break; } else dist = qMax(dist, staff->height() + sp->gap()); } sp = m->mstaff(si2)->_vspacerUp; if (sp) dist = qMax(dist, sp->gap()); } ss->setYOff(staff->lines() == 1 ? _spatium * staff->mag() : 0.0); ss->bbox().setRect(_leftMargin, y, width() - _leftMargin, h); y += dist; } qreal systemHeight = staff(lastStaffIdx)->bbox().bottom(); setHeight(systemHeight); for (MeasureBase* m : ml) { if (m->isMeasure()) { // note that the factor 2 * _spatium must be corrected for when exporting // system distance in MusicXML (issue #24733) m->bbox().setRect(0.0, -_spatium, m->width(), systemHeight + 2.0 * _spatium); } else if (m->isHBox()) { m->bbox().setRect(0.0, 0.0, m->width(), systemHeight); toHBox(m)->layout2(); } else if (m->isTBox()) { // m->bbox().setRect(0.0, 0.0, m->width(), systemHeight); toTBox(m)->layout(); } else qDebug("unhandled measure type %s", m->name()); } if (fm) { Segment* s = fm->first(); BarLine* _barLine = s->isBeginBarLineType() ? toBarLine(s->element(0)) : 0; if (_barLine) { _barLine->setTrack(firstStaffInitialIdx * VOICES); _barLine->setSpan(lastStaffInitialIdx - firstStaffInitialIdx + 1); if (score()->staff(firstStaffInitialIdx)->lines() == 1) _barLine->setSpanFrom(BARLINE_SPAN_1LINESTAFF_FROM); else _barLine->setSpanFrom(0); int llines = score()->staff(lastStaffInitialIdx)->lines(); int spanTo = llines == 1 ? BARLINE_SPAN_1LINESTAFF_TO : (llines - 1) * 2; _barLine->setSpanTo(spanTo); _barLine->layout(); } } //--------------------------------------------------- // layout brackets vertical position //--------------------------------------------------- for (Bracket* b : _brackets) { int staffIdx1 = b->firstStaff(); int staffIdx2 = b->lastStaff(); qreal sy = 0; // assume bracket not visible qreal ey = 0; // if start staff not visible, try next staff while (staffIdx1 <= staffIdx2 && !_staves[staffIdx1]->show()) ++staffIdx1; // if end staff not visible, try prev staff while (staffIdx1 <= staffIdx2 && !_staves[staffIdx2]->show()) --staffIdx2; // the bracket will be shown IF: // it spans at least 2 visible staves (staffIdx1 < staffIdx2) OR // it spans just one visible staff (staffIdx1 == staffIdx2) but it is required to do so // (the second case happens at least when the bracket is initially dropped) bool notHidden = (staffIdx1 < staffIdx2) || (b->span() == 1 && staffIdx1 == staffIdx2); if (notHidden) { // set vert. pos. and height to visible spanned staves sy = _staves[staffIdx1]->bbox().top(); ey = _staves[staffIdx2]->bbox().bottom(); } b->rypos() = sy; // if (score()->staff(firstStaffInitialIdx)->lines() == 1) // bbox of one line staff bad? // b->rypos() -= _spatium; b->setHeight(ey - sy); b->layout(); } //--------------------------------------------------- // layout instrument names //--------------------------------------------------- int staffIdx = 0; for (Part* p : score()->parts()) { SysStaff* s = staff(staffIdx); SysStaff* s2; int nstaves = p->nstaves(); if (s->show()) { for (InstrumentName* t : s->instrumentNames) { // // override Text->layout() // qreal y1, y2; switch (t->layoutPos()) { default: case 0: // center at part y1 = s->bbox().top(); s2 = staff(staffIdx); for (int i = staffIdx + nstaves - 1; i > 0; --i) { SysStaff* s = staff(i); if (s->show()) { s2 = s; break; } } y2 = s2->bbox().bottom(); break; case 1: // center at first staff y1 = s->bbox().top(); y2 = s->bbox().bottom(); break; // TODO: // sort out invisible staves case 2: // center between first and second staff y1 = s->bbox().top(); y2 = staff(staffIdx + 1)->bbox().bottom(); break; case 3: // center at second staff y1 = staff(staffIdx + 1)->bbox().top(); y2 = staff(staffIdx + 1)->bbox().bottom(); break; case 4: // center between first and second staff y1 = staff(staffIdx + 1)->bbox().top(); y2 = staff(staffIdx + 2)->bbox().bottom(); break; case 5: // center at third staff y1 = staff(staffIdx + 2)->bbox().top(); y2 = staff(staffIdx + 2)->bbox().bottom(); break; } t->rypos() = y1 + (y2 - y1) * .5 + t->textStyle().offset(t->spatium()).y(); } } staffIdx += nstaves; } }