diff --git a/src/engraving/libmscore/textbase.cpp b/src/engraving/libmscore/textbase.cpp index f8c179357afb..0b35d2f21efb 100644 --- a/src/engraving/libmscore/textbase.cpp +++ b/src/engraving/libmscore/textbase.cpp @@ -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(ed.getData(this).get()); TextCursor* cursor = ted->cursor(); ted->selectedText = cursor->selectedText(true); + ted->selectedPlainText = cursor->selectedText(false); } //--------------------------------------------------------- diff --git a/src/engraving/libmscore/textedit.h b/src/engraving/libmscore/textedit.h index 82d055124d22..627f1a820fc2 100644 --- a/src/engraving/libmscore/textedit.h +++ b/src/engraving/libmscore/textedit.h @@ -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) {} diff --git a/src/notation/internal/notationinteraction.cpp b/src/notation/internal/notationinteraction.cpp index b0a2560312f1..ffde79890a99 100644 --- a/src/notation/internal/notationinteraction.cpp +++ b/src/notation/internal/notationinteraction.cpp @@ -3463,7 +3463,10 @@ void NotationInteraction::copySelection() m_editData.element->editCopy(m_editData); mu::engraving::TextEditData* ted = static_cast(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(); @@ -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();