Skip to content

Commit

Permalink
Merge pull request musescore#16242 from softcat477/fix-copy-text
Browse files Browse the repository at this point in the history
Fix musescore#16146, Copy-paste plain text outside MuseScore
  • Loading branch information
RomanPudashkin committed Jul 11, 2023
2 parents e46f075 + 3cc0d60 commit 1db9f40
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 18 deletions.
3 changes: 2 additions & 1 deletion src/engraving/libmscore/textbase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3023,11 +3023,12 @@ void TextBase::editCut(EditData& ed)
void TextBase::editCopy(EditData& ed)
{
//
// store selection as plain text
// store selection as rich and plain text
//
TextEditData* ted = static_cast<TextEditData*>(ed.getData(this).get());
TextCursor* cursor = ted->cursor();
ted->selectedText = cursor->selectedText(true);
ted->selectedPlainText = cursor->selectedText(false);
}

//---------------------------------------------------------
Expand Down
2 changes: 2 additions & 0 deletions src/engraving/libmscore/textedit.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ struct TextEditData : public ElementEditData {
bool deleteText = false;

String selectedText;
String selectedPlainText;
static constexpr const char* mimeRichTextFormat = "application/musescore/richtext";

TextEditData(TextBase* t)
: _textBase(t) {}
Expand Down
43 changes: 26 additions & 17 deletions src/notation/internal/notationinteraction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3463,7 +3463,10 @@ void NotationInteraction::copySelection()
m_editData.element->editCopy(m_editData);
mu::engraving::TextEditData* ted = static_cast<mu::engraving::TextEditData*>(m_editData.getData(m_editData.element).get());
if (!ted->selectedText.isEmpty()) {
QGuiApplication::clipboard()->setText(ted->selectedText);
QMimeData* mimeData = new QMimeData();
mimeData->setData(TextEditData::mimeRichTextFormat, ted->selectedText.toQString().toUtf8());
mimeData->setText(ted->selectedPlainText);
QGuiApplication::clipboard()->setMimeData(mimeData);
}
} else {
QMimeData* mimeData = selection()->mimeData();
Expand Down Expand Up @@ -3535,25 +3538,31 @@ void NotationInteraction::pasteSelection(const Fraction& scale)
startEdit();

if (isTextEditingStarted()) {
QString clipboardText = QGuiApplication::clipboard()->text();
QString textForPaste = clipboardText;
if ((!clipboardText.startsWith('<') || !clipboardText.contains('>')) && m_editData.element->isLyrics()) {
textForPaste = extractSyllable(clipboardText);
}
const QMimeData* mimeData = QApplication::clipboard()->mimeData();
if (mimeData->hasFormat(TextEditData::mimeRichTextFormat)) {
const QString txt = QString::fromUtf8(mimeData->data(TextEditData::mimeRichTextFormat));
toTextBase(m_editData.element)->paste(m_editData, txt);
} else {
QString clipboardText = mimeData->text();
QString textForPaste = clipboardText;
if ((!clipboardText.startsWith('<') || !clipboardText.contains('>')) && m_editData.element->isLyrics()) {
textForPaste = extractSyllable(clipboardText);
}

toTextBase(m_editData.element)->paste(m_editData, textForPaste);
toTextBase(m_editData.element)->paste(m_editData, textForPaste);

if (!textForPaste.isEmpty() && m_editData.element->isLyrics()) {
if (textForPaste.endsWith('-')) {
navigateToNextSyllable();
} else if (textForPaste.endsWith('_')) {
addMelisma();
} else {
navigateToLyrics(false, false, false);
}
if (!textForPaste.isEmpty() && m_editData.element->isLyrics()) {
if (textForPaste.endsWith('-')) {
navigateToNextSyllable();
} else if (textForPaste.endsWith('_')) {
addMelisma();
} else {
navigateToLyrics(false, false, false);
}

QString textForNextPaste = clipboardText.remove(0, clipboardText.indexOf(textForPaste) + textForPaste.size());
QGuiApplication::clipboard()->setText(textForNextPaste);
QString textForNextPaste = clipboardText.remove(0, clipboardText.indexOf(textForPaste) + textForPaste.size());
QGuiApplication::clipboard()->setText(textForNextPaste);
}
}
} else {
const QMimeData* mimeData = QApplication::clipboard()->mimeData();
Expand Down

0 comments on commit 1db9f40

Please sign in to comment.