Skip to content

Commit 3cc0d60

Browse files
committed
Fix musescore#16146, Copy-paste plain text outside MuseScore
- Put plain text and rich text to the clipboard with different MIME types. - use the default text/plain when pasting outside of musescore - use the custom application/musescore/richtext when pasting inside musescore
1 parent 33139dc commit 3cc0d60

File tree

3 files changed

+30
-18
lines changed

3 files changed

+30
-18
lines changed

src/engraving/libmscore/textbase.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3021,11 +3021,12 @@ void TextBase::editCut(EditData& ed)
30213021
void TextBase::editCopy(EditData& ed)
30223022
{
30233023
//
3024-
// store selection as plain text
3024+
// store selection as rich and plain text
30253025
//
30263026
TextEditData* ted = static_cast<TextEditData*>(ed.getData(this).get());
30273027
TextCursor* cursor = ted->cursor();
30283028
ted->selectedText = cursor->selectedText(true);
3029+
ted->selectedPlainText = cursor->selectedText(false);
30293030
}
30303031

30313032
//---------------------------------------------------------

src/engraving/libmscore/textedit.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ struct TextEditData : public ElementEditData {
4545
bool deleteText = false;
4646

4747
String selectedText;
48+
String selectedPlainText;
49+
static constexpr const char* mimeRichTextFormat = "application/musescore/richtext";
4850

4951
TextEditData(TextBase* t)
5052
: _textBase(t) {}

src/notation/internal/notationinteraction.cpp

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3463,7 +3463,10 @@ void NotationInteraction::copySelection()
34633463
m_editData.element->editCopy(m_editData);
34643464
mu::engraving::TextEditData* ted = static_cast<mu::engraving::TextEditData*>(m_editData.getData(m_editData.element).get());
34653465
if (!ted->selectedText.isEmpty()) {
3466-
QGuiApplication::clipboard()->setText(ted->selectedText);
3466+
QMimeData* mimeData = new QMimeData();
3467+
mimeData->setData(TextEditData::mimeRichTextFormat, ted->selectedText.toQString().toUtf8());
3468+
mimeData->setText(ted->selectedPlainText);
3469+
QGuiApplication::clipboard()->setMimeData(mimeData);
34673470
}
34683471
} else {
34693472
QMimeData* mimeData = selection()->mimeData();
@@ -3535,25 +3538,31 @@ void NotationInteraction::pasteSelection(const Fraction& scale)
35353538
startEdit();
35363539

35373540
if (isTextEditingStarted()) {
3538-
QString clipboardText = QGuiApplication::clipboard()->text();
3539-
QString textForPaste = clipboardText;
3540-
if ((!clipboardText.startsWith('<') || !clipboardText.contains('>')) && m_editData.element->isLyrics()) {
3541-
textForPaste = extractSyllable(clipboardText);
3542-
}
3541+
const QMimeData* mimeData = QApplication::clipboard()->mimeData();
3542+
if (mimeData->hasFormat(TextEditData::mimeRichTextFormat)) {
3543+
const QString txt = QString::fromUtf8(mimeData->data(TextEditData::mimeRichTextFormat));
3544+
toTextBase(m_editData.element)->paste(m_editData, txt);
3545+
} else {
3546+
QString clipboardText = mimeData->text();
3547+
QString textForPaste = clipboardText;
3548+
if ((!clipboardText.startsWith('<') || !clipboardText.contains('>')) && m_editData.element->isLyrics()) {
3549+
textForPaste = extractSyllable(clipboardText);
3550+
}
35433551

3544-
toTextBase(m_editData.element)->paste(m_editData, textForPaste);
3552+
toTextBase(m_editData.element)->paste(m_editData, textForPaste);
35453553

3546-
if (!textForPaste.isEmpty() && m_editData.element->isLyrics()) {
3547-
if (textForPaste.endsWith('-')) {
3548-
navigateToNextSyllable();
3549-
} else if (textForPaste.endsWith('_')) {
3550-
addMelisma();
3551-
} else {
3552-
navigateToLyrics(false, false, false);
3553-
}
3554+
if (!textForPaste.isEmpty() && m_editData.element->isLyrics()) {
3555+
if (textForPaste.endsWith('-')) {
3556+
navigateToNextSyllable();
3557+
} else if (textForPaste.endsWith('_')) {
3558+
addMelisma();
3559+
} else {
3560+
navigateToLyrics(false, false, false);
3561+
}
35543562

3555-
QString textForNextPaste = clipboardText.remove(0, clipboardText.indexOf(textForPaste) + textForPaste.size());
3556-
QGuiApplication::clipboard()->setText(textForNextPaste);
3563+
QString textForNextPaste = clipboardText.remove(0, clipboardText.indexOf(textForPaste) + textForPaste.size());
3564+
QGuiApplication::clipboard()->setText(textForNextPaste);
3565+
}
35573566
}
35583567
} else {
35593568
const QMimeData* mimeData = QApplication::clipboard()->mimeData();

0 commit comments

Comments
 (0)