/*! * Reset the number of leading and following spacse. */ void QUSongNote::resetTrailingSpaces(int prefixCount, int suffixCount) { // the simple way if(prefixCount != -1 and suffixCount != -1) { setSyllable(syllable().trimmed()); for(int i = 0; i < prefixCount; i++) _syllable.prepend(" "); for(int i = 0; i < suffixCount; i++) _syllable.append(" "); return; } // the hard way if(prefixCount == -1) { // prefix unchanged for(int i = 0; i < syllable().length(); i++) { if(!syllable().endsWith(" ")) break; _syllable.remove(syllable().length() - 1, 1); } for(int i = 0; i < suffixCount; i++) _syllable.append(" "); } if(suffixCount == -1) { // suffix unchanged for(int i = 0; i < syllable().length(); i++) { if(!syllable().startsWith(" ")) break; _syllable.remove(0, 1); } for(int i = 0; i < prefixCount; i++) _syllable.prepend(" "); } }
void LyricEditDialog::unparse() { // This and SetLyricsCommand::execute() are opposites that will // need to be kept in sync with any changes in one another. (They // should really both be in a common lyric management class.) countVerses(); Composition *comp = m_segment->getComposition(); bool firstNote = true; timeT lastTime = m_segment->getStartTime(); int lastBarNo = comp->getBarNumber(lastTime); std::map<int, bool> haveLyric; QString fragment = QString("[%1] ").arg(lastBarNo + 1); m_skeleton = fragment; m_texts.clear(); for (int v = 0; v < m_verseCount; ++v) { m_texts.push_back(fragment); haveLyric[v] = false; } for (Segment::iterator i = m_segment->begin(); m_segment->isBeforeEndMarker(i); ++i) { bool isNote = (*i)->isa(Note::EventType); bool isLyric = false; if (!isNote) { if ((*i)->isa(Text::EventType)) { std::string textType; if ((*i)->get<String>(Text::TextTypePropertyName, textType) && textType == Text::Lyric) { isLyric = true; } } } else { if ((*i)->has(BaseProperties::TIED_BACKWARD) && (*i)->get<Bool>(BaseProperties::TIED_BACKWARD)) { continue; } } if (!isNote && !isLyric) continue; timeT myTime = (*i)->getNotationAbsoluteTime(); int myBarNo = comp->getBarNumber(myTime); if (myBarNo > lastBarNo) { fragment = ""; while (myBarNo > lastBarNo) { fragment += " /"; ++lastBarNo; } fragment += QString("\n[%1] ").arg(myBarNo + 1); m_skeleton += fragment; for (int v = 0; v < m_verseCount; ++v) m_texts[v] += fragment; } if (isNote) { if ((myTime > lastTime) || firstNote) { m_skeleton += " ."; for (int v = 0; v < m_verseCount; ++v) { if (!haveLyric[v]) m_texts[v] += " ."; haveLyric[v] = false; } lastTime = myTime; firstNote = false; } } if (isLyric) { std::string ssyllable; (*i)->get<String>(Text::TextPropertyName, ssyllable); long verse = 0; (*i)->get<Int>(Text::LyricVersePropertyName, verse); QString syllable(strtoqstr(ssyllable)); syllable.replace(QRegExp("\\s+"), "~"); m_texts[verse] += " " + syllable; haveLyric[verse] = true; } } if (!m_texts.empty()) { m_textEdit->setPlainText(m_texts[0]); } else { m_texts.push_back(m_skeleton); } }