FiguredBass* Score::addFiguredBass() { Element* el = selection().element(); if (el == 0 || (el->type() != NOTE && el->type() != FIGURED_BASS)) { QMessageBox::information(0, QMessageBox::tr("MuseScore:"), QMessageBox::tr("No note or figured bass selected:\n" "Please select a single note or figured bass and retry operation\n"), QMessageBox::Ok, QMessageBox::NoButton); return 0; } ChordRest* cr; if (el->type() == NOTE) cr = static_cast<Note*>(el)->chord(); else if (el->type() == FIGURED_BASS) cr = static_cast<FiguredBass*>(el)->chordRest(); else return 0; QList<Lyrics*> ll = cr->lyricsList(); int no = ll.size(); FiguredBass* fb = new FiguredBass(this); fb->setTrack(cr->track()); fb->setParent(cr); fb->setNo(no); undoAddElement(fb); select(fb, SELECT_SINGLE, 0); return fb; }
Element* ChordRest::drop(const DropData& data) { Element* e = data.element; Measure* m = measure(); switch (e->type()) { case Element::Type::BREATH: { Breath* b = static_cast<Breath*>(e); b->setTrack(staffIdx() * VOICES); // TODO: insert automatically in all staves? Segment* seg = m->undoGetSegment(Segment::Type::Breath, tick()); b->setParent(seg); score()->undoAddElement(b); } return e; case Element::Type::BAR_LINE: { BarLine* bl = static_cast<BarLine*>(e); bl->setTrack(staffIdx() * VOICES); if (tick() == m->tick()) return m->drop(data); Segment* seg = m->undoGetSegment(Segment::Type::BarLine, tick()); bl->setParent(seg); score()->undoAddElement(bl); } return e; case Element::Type::CLEF: score()->cmdInsertClef(static_cast<Clef*>(e), this); break; case Element::Type::TEMPO_TEXT: { TempoText* tt = static_cast<TempoText*>(e); tt->setParent(segment()); TextStyleType st = tt->textStyleType(); tt->setTextStyleType(st); score()->undoAddElement(tt); } return e; case Element::Type::DYNAMIC: { Dynamic* d = static_cast<Dynamic*>(e); d->setTrack(track()); TextStyleType st = d->textStyleType(); d->setTextStyleType(st); d->setParent(segment()); score()->undoAddElement(d); } return e; case Element::Type::FRET_DIAGRAM: case Element::Type::SYMBOL: e->setTrack(track()); e->setParent(segment()); score()->undoAddElement(e); return e; case Element::Type::NOTE: { Note* note = static_cast<Note*>(e); NoteVal nval; nval.pitch = note->pitch(); nval.headGroup = note->headGroup(); nval.fret = note->fret(); nval.string = note->string(); score()->setNoteRest(segment(), track(), nval, data.duration, MScore::Direction::AUTO); delete e; } break; case Element::Type::HARMONY: static_cast<Harmony*>(e)->render(); // fall through case Element::Type::TEXT: case Element::Type::STAFF_TEXT: case Element::Type::STAFF_STATE: case Element::Type::INSTRUMENT_CHANGE: case Element::Type::REHEARSAL_MARK: e->setParent(segment()); e->setTrack((track() / VOICES) * VOICES); { Text* f = static_cast<Text*>(e); TextStyleType st = f->textStyleType(); if (st >= TextStyleType::DEFAULT) f->setTextStyleType(st); } score()->undoAddElement(e); return e; case Element::Type::FIGURED_BASS: { bool bNew; FiguredBass * fb = static_cast<FiguredBass *>(e); fb->setParent( segment() ); fb->setTrack( (track() / VOICES) * VOICES ); fb->setTicks( duration().ticks() ); fb->setOnNote(true); FiguredBass::addFiguredBassToSegment(segment(), fb->track(), fb->ticks(), &bNew); if (bNew) score()->undoAddElement(e); return e; } case Element::Type::IMAGE: e->setParent(segment()); score()->undoAddElement(e); return e; case Element::Type::ICON: { switch(static_cast<Icon*>(e)->iconType()) { case IconType::SBEAM: score()->undoChangeProperty(this, P_ID::BEAM_MODE, int(Beam::Mode::BEGIN)); break; case IconType::MBEAM: score()->undoChangeProperty(this, P_ID::BEAM_MODE, int(Beam::Mode::MID)); break; case IconType::NBEAM: score()->undoChangeProperty(this, P_ID::BEAM_MODE, int(Beam::Mode::NONE)); break; case IconType::BEAM32: score()->undoChangeProperty(this, P_ID::BEAM_MODE, int(Beam::Mode::BEGIN32)); break; case IconType::BEAM64: score()->undoChangeProperty(this, P_ID::BEAM_MODE, int(Beam::Mode::BEGIN64)); break; case IconType::AUTOBEAM: score()->undoChangeProperty(this, P_ID::BEAM_MODE, int(Beam::Mode::AUTO)); break; default: break; } } delete e; break; default: qDebug("cannot drop %s", e->name()); delete e; return 0; } return 0; }