Skip to content

Commit

Permalink
Fix musescore#16146, Copy-paste plain text outside MuseScore
Browse files Browse the repository at this point in the history
- 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
  • Loading branch information
softcat477 committed Jul 6, 2023
1 parent 33139dc commit 3cc0d60
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
Expand Up @@ -3021,11 +3021,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
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
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 3cc0d60

Please sign in to comment.