void ScoreView::lyricsEndEdit() { Lyrics* lyrics = (Lyrics*)editObject; int endTick = lyrics->segment()->tick(); // search previous lyric: int verse = lyrics->no(); int staffIdx = lyrics->staffIdx(); // search previous lyric Lyrics* oldLyrics = 0; Segment* segment = lyrics->segment(); while (segment) { const QList<Lyrics*>* nll = segment->lyricsList(staffIdx); if (nll) { oldLyrics = nll->value(verse); if (oldLyrics) break; } segment = segment->prev1(Segment::SegChordRest | Segment::SegGrace); } // if (lyrics->isEmpty() && origL->isEmpty()) if (lyrics->isEmpty()) lyrics->parent()->remove(lyrics); else { if (oldLyrics && oldLyrics->syllabic() == Lyrics::END) { if (oldLyrics->endTick() >= endTick) oldLyrics->setTicks(0); } } }
void ScoreView::lyricsUnderscore() { Lyrics* lyrics = static_cast<Lyrics*>(editObject); int track = lyrics->track(); int staffIdx = lyrics->staffIdx(); Segment* segment = lyrics->segment(); int verse = lyrics->no(); int endTick = segment->tick(); endEdit(); // search next chord Segment* nextSegment = segment; while ((nextSegment = nextSegment->next1(Segment::SegChordRest | Segment::SegGrace))) { Element* el = nextSegment->element(track); if (el && el->type() == Element::CHORD) break; } // search previous lyric Lyrics* oldLyrics = 0; while (segment) { const QList<Lyrics*>* nll = segment->lyricsList(staffIdx); if (nll) { oldLyrics = nll->value(verse); if (oldLyrics) break; } segment = segment->prev1(Segment::SegChordRest | Segment::SegGrace); } if (nextSegment == 0) { if (oldLyrics) { switch(oldLyrics->syllabic()) { case Lyrics::SINGLE: case Lyrics::END: break; default: oldLyrics->setSyllabic(Lyrics::END); break; } if (oldLyrics->segment()->tick() < endTick) oldLyrics->setTicks(endTick - oldLyrics->segment()->tick()); } return; } _score->startCmd(); const QList<Lyrics*>* ll = nextSegment->lyricsList(staffIdx); lyrics = ll->value(verse); bool newLyrics = (lyrics == 0); if (!lyrics) { lyrics = new Lyrics(_score); lyrics->setTrack(track); lyrics->setParent(nextSegment->element(track)); lyrics->setNo(verse); } lyrics->setSyllabic(Lyrics::SINGLE); if (oldLyrics) { switch(oldLyrics->syllabic()) { case Lyrics::SINGLE: case Lyrics::END: break; default: oldLyrics->setSyllabic(Lyrics::END); break; } if (oldLyrics->segment()->tick() < endTick) oldLyrics->setTicks(endTick - oldLyrics->segment()->tick()); } if (newLyrics) _score->undoAddElement(lyrics); _score->select(lyrics, SELECT_SINGLE, 0); startEdit(lyrics, -1); mscore->changeState(mscoreState()); adjustCanvasPosition(lyrics, false); ((Lyrics*)editObject)->moveCursorToEnd(); _score->setLayoutAll(true); _score->end2(); _score->end1(); }