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 TestBarline::barline06() { char msg[256]; Score* score = readScore(DIR + "barline06.mscx"); QVERIFY(score); score->doLayout(); // scan each measure Measure* msr = score->firstMeasure(); int msrNo = 1; for (int i=0; i < 3; i++) { // check measure endbarline type sprintf(msg, "EndBarLineType not NORMAL in measure %d.", msrNo); //TODO QVERIFY2(msr->endBarLineType() == BarLineType::NORMAL, msg); // locate end-measure bar line segment Segment* seg = msr->findSegment(SegmentType::EndBarLine, msr->tick()+msr->ticks()); sprintf(msg, "No SegEndBarLine in measure %d.", msr->no()); QVERIFY2(seg != nullptr, msg); // check only i-th staff has custom bar line type for (int j=0; j < 3; j++) { BarLine* bar = static_cast<BarLine*>(seg->element(j*VOICES)); // if not the i-th staff, bar should be normal and not custom if (j != i) { sprintf(msg, "barline type NOT NORMAL or CUSTOM TYPE in staff %d of measure %d.", j+1, msrNo); QVERIFY2(bar->barLineType() == BarLineType::NORMAL, msg); // QVERIFY2(bar->customSubtype() == false, msg); } // in the i-th staff, the bar line should be of type DOUBLE and custom type should be true else { sprintf(msg, "No barline for staff %d in measure %d", j+1, msrNo); QVERIFY2(bar != nullptr, msg); sprintf(msg, "barline type NOT DOUBLE or NOT CUSTOM TYPE in staff %d of measure %d.", j+1, msrNo); QVERIFY2(bar->barLineType() == BarLineType::DOUBLE, msg); // QVERIFY2(bar->customSubtype() == true, msg); } } msr = msr->nextMeasure(); msrNo++; } // QVERIFY(saveCompareScore(score, "barline06.mscx", DIR + "barline06-ref.mscx")); delete score; }
bool BarLine::acceptDrop(MuseScoreView*, const QPointF&, Element* e) const { int type = e->type(); if (type == BAR_LINE) { if (parent() && parent()->type() == SEGMENT) return true; if (parent() && parent()->type() == SYSTEM) { BarLine* b = static_cast<BarLine*>(e); return (b->barLineType() == BROKEN_BAR || b->barLineType() == DOTTED_BAR || b->barLineType() == NORMAL_BAR || b->barLineType() == DOUBLE_BAR || b->spanFrom() != 0 || b->spanTo() != DEFAULT_BARLINE_TO); } } else { return (type == ARTICULATION && parent() && parent()->type() == SEGMENT && static_cast<Segment*>(parent())->segmentType() == Segment::SegEndBarLine); } return false; }
bool BarLine::acceptDrop(const DropData& data) const { Element::Type type = data.element->type(); if (type == Element::Type::BAR_LINE) { if (parent() && parent()->type() == Element::Type::SEGMENT) return true; if (parent() && parent()->type() == Element::Type::SYSTEM) { BarLine* b = static_cast<BarLine*>(data.element); return (b->barLineType() == BarLineType::BROKEN || b->barLineType() == BarLineType::DOTTED || b->barLineType() == BarLineType::NORMAL || b->barLineType() == BarLineType::DOUBLE || b->spanFrom() != 0 || b->spanTo() != DEFAULT_BARLINE_TO); } } else { return (type == Element::Type::ARTICULATION && parent() && parent()->type() == Element::Type::SEGMENT && static_cast<Segment*>(parent())->segmentType() == Segment::Type::EndBarLine); } return false; }
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 TestBarline::barline05() { Score* score = readScore(DIR + "barline05.mscx"); QVERIFY(score); score->doLayout(); // 'go' to 4th measure Measure* msr = score->firstMeasure(); for (int i=0; i < 3; i++) msr = msr->nextMeasure(); // create and add a LineBreak element LayoutBreak* lb = new LayoutBreak(score); lb->setLayoutBreakType(LayoutBreak::Type::LINE); lb->setTrack(-1); // system-level element lb->setParent(msr); score->undoAddElement(lb); score->doLayout(); // check an end-repeat bar line has been created at the end of this measure and it is generated Segment* seg = msr->findSegment(SegmentType::EndBarLine, msr->tick()+msr->ticks()); QVERIFY2(seg != nullptr, "No SegEndBarLine segment in measure 4."); BarLine* bar = static_cast<BarLine*>(seg->element(0)); QVERIFY2(bar != nullptr, "No end-repeat barline in measure 4."); QVERIFY2(bar->barLineType() == BarLineType::END_REPEAT, "Barline at measure 4 is not END-REPEAT"); QVERIFY2(bar->generated(), "End-repeat barline in measure 4 is non-generated."); // // check an end-repeat bar line has been created at the beginning of the next measure and it is not generated // check an end-repeat bar line has been created at the beginning of the next measure and it is generated msr = msr->nextMeasure(); seg = msr->findSegment(SegmentType::StartRepeatBarLine, msr->tick()); QVERIFY2(seg != nullptr, "No SegStartRepeatBarLine segment in measure 5."); bar = static_cast<BarLine*>(seg->element(0)); QVERIFY2(bar != nullptr, "No start-repeat barline in measure 5."); QVERIFY2(bar->generated(), "Start-reapeat barline in measure 5 is not generated."); // QVERIFY(saveCompareScore(score, "barline05.mscx", DIR + "barline05-ref.mscx")); delete score; }
Element* BarLine::drop(const DropData& data) { Element* e = data.element; int type = e->type(); if (type == BAR_LINE) { BarLine* bl = static_cast<BarLine*>(e); BarLineType st = bl->barLineType(); // if no change in subtype or no change in span, do nothing if (st == barLineType() && bl->spanFrom() == 0 && bl->spanTo() == DEFAULT_BARLINE_TO) { delete e; return 0; } // system left-side bar line if (parent()->type() == SYSTEM) { BarLine* b = static_cast<System*>(parent())->barLine(); score()->undoChangeProperty(b, P_SUBTYPE, int(bl->barLineType())); delete e; return 0; } // check if the new property can apply to this single bar line bool oldRepeat = (barLineType() == START_REPEAT || barLineType() == END_REPEAT || barLineType() == END_START_REPEAT); bool newRepeat = (bl->barLineType() == START_REPEAT || bl->barLineType() == END_REPEAT || bl->barLineType() == END_START_REPEAT); // if repeats are not involved or drop refers to span rather than subtype => // single bar line drop if( (!oldRepeat && !newRepeat) || (bl->spanFrom() != 0 || bl->spanTo() != DEFAULT_BARLINE_TO) ) { // if drop refers to span, update this bar line span if(bl->spanFrom() != 0 || bl->spanTo() != DEFAULT_BARLINE_TO) { // if dropped spanFrom or spanTo are below the middle of standard staff (5 lines) // adjust to the number of syaff lines int bottomSpan = (staff()->lines()-1) * 2; int spanFrom = bl->spanFrom() > 4 ? bottomSpan - (8 - bl->spanFrom()) : bl->spanFrom(); int spanTo = bl->spanTo() > 4 ? bottomSpan - (8 - bl->spanTo()) : bl->spanTo(); score()->undoChangeSingleBarLineSpan(this, 1, spanFrom, spanTo); } // if drop refer to subtype, update this bar line subtype else { score()->undoChangeProperty(this, P_SUBTYPE, int(bl->barLineType())); // setCustomSubtype(true); } delete e; return 0; } // drop applies to all bar lines of the measure Measure* m = static_cast<Segment*>(parent())->measure(); if (st == START_REPEAT) { m = m->nextMeasure(); if (m == 0) { delete e; return 0; } } m->drop(data); } else if (type == ARTICULATION) { Articulation* atr = static_cast<Articulation*>(e); atr->setParent(this); atr->setTrack(track()); score()->undoAddElement(atr); return atr; } return 0; }