commit ed9e7d41f5823eea682d3a0f405e8e287e8bd8dd Author: Juergen Spitzmueller <sp...@lyx.org> Date: Thu Sep 14 19:26:20 2023 +0200
Do not paste deleted text with CT on (#12900) --- src/CutAndPaste.cpp | 42 +++++++++++++++++++++++++----------------- 1 files changed, 25 insertions(+), 17 deletions(-) diff --git a/src/CutAndPaste.cpp b/src/CutAndPaste.cpp index 5e9a84a..fde103a 100644 --- a/src/CutAndPaste.cpp +++ b/src/CutAndPaste.cpp @@ -109,6 +109,21 @@ struct PasteReturnValue { bool needupdate; }; + +/// return true if the whole ParagraphList is deleted +static bool isFullyDeleted(ParagraphList const & pars) +{ + pit_type const pars_size = static_cast<pit_type>(pars.size()); + + // check all paragraphs + for (pit_type pit = 0; pit < pars_size; ++pit) { + if (!pars[pit].empty()) // prevent assertion failure + if (!pars[pit].isDeleted(0, pars[pit].size())) + return false; + } + return true; +} + PasteReturnValue pasteSelectionHelper(DocIterator const & cur, ParagraphList const & parlist, DocumentClassConstPtr oldDocClass, cap::BranchAction branchAction, @@ -279,12 +294,20 @@ pasteSelectionHelper(DocIterator const & cur, ParagraphList const & parlist, } if (lyxrc.ct_markup_copied) { - // Only change to inserted if ct is active, + // Only remove deleted text and change + // the rest to inserted if ct is active, // otherwise leave markup as is - if (buffer.params().track_changes) + if (buffer.params().track_changes) { + if (!isFullyDeleted(insertion)) + tmpbuf->acceptChanges(0, tmpbuf->size()); + else + tmpbuf->rejectChanges(0, tmpbuf->size()); tmpbuf->setChange(Change(Change::INSERTED)); + } } else // Resolve all markup to inserted or unchanged + // Deleted text has already been removed on copy + // (copySelectionHelper) tmpbuf->setChange(Change(buffer.params().track_changes ? Change::INSERTED : Change::UNCHANGED)); } @@ -667,21 +690,6 @@ void putClipboard(ParagraphList const & paragraphs, } -/// return true if the whole ParagraphList is deleted -static bool isFullyDeleted(ParagraphList const & pars) -{ - pit_type const pars_size = static_cast<pit_type>(pars.size()); - - // check all paragraphs - for (pit_type pit = 0; pit < pars_size; ++pit) { - if (!pars[pit].empty()) // prevent assertion failure - if (!pars[pit].isDeleted(0, pars[pit].size())) - return false; - } - return true; -} - - void copySelectionHelper(Buffer const & buf, Text const & text, pit_type startpit, pit_type endpit, int start, int end, DocumentClassConstPtr dc, CutStack & cutstack) -- lyx-cvs mailing list lyx-cvs@lists.lyx.org http://lists.lyx.org/mailman/listinfo/lyx-cvs