[LyX/master] Add pref to keep ct markup on copy/paste

Juergen Spitzmueller spitz at lyx.org
Mon Jan 13 14:04:32 UTC 2020


commit 5fc2662b1301a8e04db0fa8695e06b363c1de60e
Author: Juergen Spitzmueller <spitz at lyx.org>
Date:   Mon Jan 13 15:20:48 2020 +0100

    Add pref to keep ct markup on copy/paste
    
    Fixes #10278, #10128
---
 lib/RELEASE-NOTES                 |    3 +
 lib/doc/UserGuide.lyx             |   29 +++++++++++--
 lib/doc/de/UserGuide.lyx          |   24 +++++++++++-
 lib/scripts/prefs2prefs_prefs.py  |    7 +++-
 src/CutAndPaste.cpp               |   35 +++++++++++------
 src/LyXRC.cpp                     |   18 ++++++++-
 src/LyXRC.h                       |    3 +
 src/Text.cpp                      |    5 +-
 src/frontends/qt/GuiPrefs.cpp     |    4 ++
 src/frontends/qt/ui/PrefEditUi.ui |   77 +++++++++++++++++++++----------------
 10 files changed, 150 insertions(+), 55 deletions(-)

diff --git a/lib/RELEASE-NOTES b/lib/RELEASE-NOTES
index 30e2948..3fa80ab 100644
--- a/lib/RELEASE-NOTES
+++ b/lib/RELEASE-NOTES
@@ -35,6 +35,9 @@
 * \ct_additions_underlined true|false: determines whether additions in change tracking
   are underlined in the workarea (default: true).
 
+* \ct_markup_copied true|false: determines whether change tracking markup should be
+  preserved on copy/paste (default: false).
+
 
 !!!The following pref variables were changed in 2.4:
 
diff --git a/lib/doc/UserGuide.lyx b/lib/doc/UserGuide.lyx
index a514d0c..3ee3df4 100644
--- a/lib/doc/UserGuide.lyx
+++ b/lib/doc/UserGuide.lyx
@@ -1,5 +1,5 @@
 #LyX 2.4 created this file. For more info see https://www.lyx.org/
-\lyxformat 591
+\lyxformat 592
 \begin_document
 \begin_header
 \save_transient_properties true
@@ -8485,14 +8485,12 @@ Verbatim
 \end_layout
 
 \begin_layout Verbatim
-
 This is Verbatim.
 \end_layout
 
 \begin_layout Verbatim
 \noindent
 \align block
-
 The following 2 lines are empty:
 \end_layout
 
@@ -8505,7 +8503,6 @@ The following 2 lines are empty:
 \end_layout
 
 \begin_layout Verbatim
-
 Almost everything is allowed in Verbatim:"%&$§#~'`
 \backslash
 }][{|
@@ -8529,7 +8526,6 @@ Verbatim
 \end_layout
 
 \begin_layout Verbatim*
-
 This is Verbatim*.
 \end_layout
 
@@ -48920,6 +48916,29 @@ Ctrl+arrow key
 \family default
  the cursor jumps from the end of a word to the end of the next word.
  Normally it jumps from the beginning to the beginning.
+\change_inserted -712698321 1578924606
+
+\end_layout
+
+\begin_layout Standard
+
+\change_inserted -712698321 1578924785
+The option 
+\family sans
+Keep change tracking markup on copy and paste
+\family default
+ is for users who don't want tracked changes to be dissolved on copy and
+ paste operations (i.
+\begin_inset space \thinspace{}
+\end_inset
+
+e., inserted as new text with the deletions removed).
+ If this is checked, the change-tracked text will be copied and pasted as
+ is, independent if changes are currently tracked or not.
+ This also applies to wrapping to\SpecialChar breakableslash
+dissolving from insets.
+\change_unchanged
+
 \end_layout
 
 \begin_layout Standard
diff --git a/lib/doc/de/UserGuide.lyx b/lib/doc/de/UserGuide.lyx
index 4d74e2e..408ca50 100644
--- a/lib/doc/de/UserGuide.lyx
+++ b/lib/doc/de/UserGuide.lyx
@@ -1,5 +1,5 @@
 #LyX 2.4 created this file. For more info see https://www.lyx.org/
-\lyxformat 591
+\lyxformat 592
 \begin_document
 \begin_header
 \save_transient_properties true
@@ -8638,10 +8638,12 @@ Unformatiert
 \end_layout
 
 \begin_layout Verbatim
+
 Dies ist Unformatiert.
 \end_layout
 
 \begin_layout Verbatim
+
 Die folgenden 2 Zeilen sind leer:
 \end_layout
 
@@ -8654,6 +8656,7 @@ Die folgenden 2 Zeilen sind leer:
 \end_layout
 
 \begin_layout Verbatim
+
 Fast alles ist in Unformatiert erlaubt:"%&$§#~'`
 \backslash
 }][{|
@@ -8677,6 +8680,7 @@ Unformatiert
 \end_layout
 
 \begin_layout Verbatim*
+
 Dies ist Unformatiert*.
 \end_layout
 
@@ -46117,6 +46121,24 @@ Cursornavigation zwischen Wörtern im Mac-Stil
 \begin_layout Standard
 Die Option 
 \family sans
+Änderungsmarkierungen beim Kopieren und Einfügen behalten
+\family default
+ können Sie auswählen, wenn Sie nicht möchten, dass verfolgte Änderungen
+ beim Kopieren und Einfügen aufgelöst werden (d.
+\begin_inset space \thinspace{}
+\end_inset
+
+h., dass als gelöscht markierter Text entfernt und alles andere als neu eingefügt
+ wird).
+ Wenn dies ausgewählt ist, wird der kopierte Text mit den Markierungen eingefügt
+, unabhängig davon, ob Änderungen gerade verfolgt werden oder nicht.
+ Das betrifft auch das Umwandeln von Text in\SpecialChar breakableslash
+von Einfügungen.
+\end_layout
+
+\begin_layout Standard
+Die Option 
+\family sans
 Absatzlayouts alphabetisch sortieren
 \family default
  sortiert die Einträge im pull-down Menü der Absatzumgebungen.
diff --git a/lib/scripts/prefs2prefs_prefs.py b/lib/scripts/prefs2prefs_prefs.py
index 1eac80c..6bbb8ac 100644
--- a/lib/scripts/prefs2prefs_prefs.py
+++ b/lib/scripts/prefs2prefs_prefs.py
@@ -125,6 +125,10 @@
 #   Add ct_additions_underlined.
 #   No convergence necessary.
 
+# Incremented to format 32, by spitz
+#   Add ct_markup_copied.
+#   No convergence necessary.
+
 # NOTE: The format should also be updated in LYXRC.cpp and
 # in configure.py.
 
@@ -474,5 +478,6 @@ conversions = [
 	[ 28, [remove_date_insert_format]],
 	[ 29, [remove_use_pixmap_cache]],
 	[ 30, []],
-	[ 31, []]
+	[ 31, []],
+	[ 32, []]
 ]
diff --git a/src/CutAndPaste.cpp b/src/CutAndPaste.cpp
index 4101933..8e0a72d 100644
--- a/src/CutAndPaste.cpp
+++ b/src/CutAndPaste.cpp
@@ -287,8 +287,9 @@ pasteSelectionHelper(DocIterator const & cur, ParagraphList const & parlist,
 					tmpbuf->eraseChar(i--, false);
 		}
 
-		tmpbuf->setChange(Change(buffer.params().track_changes ?
-					 Change::INSERTED : Change::UNCHANGED));
+		if (lyxrc.ct_markup_copied)
+			tmpbuf->setChange(Change(buffer.params().track_changes ?
+						 Change::INSERTED : Change::UNCHANGED));
 	}
 
 	bool const empty = pars[pit].empty();
@@ -606,7 +607,8 @@ Buffer * copyToTempBuffer(ParagraphList const & paragraphs, DocumentClassConstPt
 
 
 void putClipboard(ParagraphList const & paragraphs,
-	DocumentClassConstPtr docclass, docstring const & plaintext)
+		  DocumentClassConstPtr docclass, docstring const & plaintext,
+		  BufferParams const bp)
 {
 	Buffer * buffer = copyToTempBuffer(paragraphs, docclass);
 	if (!buffer) // already asserted in copyToTempBuffer()
@@ -617,6 +619,12 @@ void putClipboard(ParagraphList const & paragraphs,
 	// applications, the number that can parse it should go up in the future.
 	buffer->params().html_math_output = BufferParams::MathML;
 
+	if (lyxrc.ct_markup_copied) {
+		// Copy authors to the params. We need those pointers.
+		for (Author const & a : bp.authors())
+			buffer->params().authors().record(a);
+	}
+
 	// Make sure MarkAsExporting is deleted before buffer is
 	{
 		// The Buffer is being used to export. This is necessary so that the
@@ -711,10 +719,12 @@ void copySelectionHelper(Buffer const & buf, Text const & text,
 
 	// do not copy text (also nested in insets) which is marked as
 	// deleted, unless the whole selection was deleted
-	if (!isFullyDeleted(copy_pars))
-		acceptChanges(copy_pars, buf.params());
-	else
-		rejectChanges(copy_pars, buf.params());
+	if (!lyxrc.ct_markup_copied) {
+		if (!isFullyDeleted(copy_pars))
+			acceptChanges(copy_pars, buf.params());
+		else
+			rejectChanges(copy_pars, buf.params());
+	}
 
 
 	// do some final cleanup now, to make sure that the paragraphs
@@ -950,7 +960,7 @@ void cutSelectionHelper(Cursor & cur, CutStack & cuts, bool realcut, bool putcli
 			// Even if there is no selection.
 			if (putclip)
 				putClipboard(cuts[0].first, cuts[0].second,
-				             cur.selectionAsString(true, true));
+				             cur.selectionAsString(true, true), bp);
 		}
 
 		if (begpit != endpit)
@@ -1027,7 +1037,7 @@ void copyInset(Cursor const & cur, Inset * inset, docstring const & plaintext)
 	theCuts.push(make_pair(pars, bp.documentClassPtr()));
 
 	// stuff the selection onto the X clipboard, from an explicit copy request
-	putClipboard(theCuts[0].first, theCuts[0].second, plaintext);
+	putClipboard(theCuts[0].first, theCuts[0].second, plaintext, bp);
 }
 
 
@@ -1110,7 +1120,8 @@ void copySelection(Cursor const & cur, docstring const & plaintext)
 	}
 
 	// stuff the selection onto the X clipboard, from an explicit copy request
-	putClipboard(theCuts[0].first, theCuts[0].second, plaintext);
+	putClipboard(theCuts[0].first, theCuts[0].second, plaintext,
+			cur.buffer()->params());
 }
 
 
@@ -1162,8 +1173,8 @@ docstring selection(size_t sel_index, DocumentClassConstPtr docclass)
 
 
 void pasteParagraphList(Cursor & cur, ParagraphList const & parlist,
-						DocumentClassConstPtr docclass, ErrorList & errorList,
-						cap::BranchAction branchAction)
+			DocumentClassConstPtr docclass, ErrorList & errorList,
+			cap::BranchAction branchAction)
 {
 	if (cur.inTexted()) {
 		Text * text = cur.text();
diff --git a/src/LyXRC.cpp b/src/LyXRC.cpp
index 7b7b262..f7c085c 100644
--- a/src/LyXRC.cpp
+++ b/src/LyXRC.cpp
@@ -61,7 +61,7 @@ namespace {
 
 // The format should also be updated in configure.py, and conversion code
 // should be added to prefs2prefs_prefs.py.
-static unsigned int const LYXRC_FILEFORMAT = 31; // lasgouttes: add \ct_additions_underlined
+static unsigned int const LYXRC_FILEFORMAT = 32; // spitz: add \ct_markup_copied
 // when adding something to this array keep it sorted!
 LexerKeyword lyxrcTags[] = {
 	{ "\\accept_compound", LyXRC::RC_ACCEPT_COMPOUND },
@@ -93,6 +93,7 @@ LexerKeyword lyxrcTags[] = {
 	{ "\\converter_cache_maxage", LyXRC::RC_CONVERTER_CACHE_MAXAGE },
 	{ "\\copier", LyXRC::RC_COPIER },
 	{ "\\ct_additions_underlined", LyXRC::RC_CT_ADDITIONS_UNDERLINED },
+	{ "\\ct_markup_copied", LyXRC::RC_CT_MARKUP_COPIED },
 	{ "\\cursor_follows_scrollbar", LyXRC::RC_CURSOR_FOLLOWS_SCROLLBAR },
 	{ "\\cursor_width", LyXRC::RC_CURSOR_WIDTH },
 	{ "\\def_file", LyXRC::RC_DEFFILE },
@@ -676,6 +677,10 @@ LyXRC::ReturnValues LyXRC::read(Lexer & lexrc, bool check_format)
 			lexrc >> ct_additions_underlined;
 			break;
 
+		case RC_CT_MARKUP_COPIED:
+			lexrc >> ct_markup_copied;
+			break;
+
 		case RC_CURSOR_FOLLOWS_SCROLLBAR:
 			lexrc >> cursor_follows_scrollbar;
 			break;
@@ -1601,6 +1606,16 @@ void LyXRC::write(ostream & os, bool ignore_system_lyxrc, string const & name) c
 		if (tag != RC_LAST)
 			break;
 		// fall through
+	case RC_CT_MARKUP_COPIED:
+		if (ignore_system_lyxrc ||
+		    ct_markup_copied
+		    != system_lyxrc.ct_markup_copied) {
+			os << "\\ct_markup_copied "
+			   << convert<string>(ct_markup_copied) << '\n';
+		}
+		if (tag != RC_LAST)
+			break;
+		// fall through
 	case RC_CURSOR_FOLLOWS_SCROLLBAR:
 		if (ignore_system_lyxrc ||
 		    cursor_follows_scrollbar
@@ -2771,6 +2786,7 @@ void actOnUpdatedPrefs(LyXRC const & lyxrc_orig, LyXRC const & lyxrc_new)
 	case LyXRC::RC_CONVERTER_CACHE_MAXAGE:
 	case LyXRC::RC_COPIER:
 	case LyXRC::RC_CT_ADDITIONS_UNDERLINED:
+	case LyXRC::RC_CT_MARKUP_COPIED:
 	case LyXRC::RC_CURSOR_FOLLOWS_SCROLLBAR:
 	case LyXRC::RC_SCROLL_BELOW_DOCUMENT:
 	case LyXRC::RC_GUI_LANGUAGE:
diff --git a/src/LyXRC.h b/src/LyXRC.h
index 1ae79b0..ed7511a 100644
--- a/src/LyXRC.h
+++ b/src/LyXRC.h
@@ -67,6 +67,7 @@ public:
 		RC_CONVERTER_CACHE_MAXAGE,
 		RC_COPIER,
 		RC_CT_ADDITIONS_UNDERLINED,
+		RC_CT_MARKUP_COPIED,
 		RC_CURSOR_FOLLOWS_SCROLLBAR,
 		RC_CURSOR_WIDTH,
 		RC_DEFAULT_DECIMAL_SEP,
@@ -422,6 +423,8 @@ public:
 	///
 	bool ct_additions_underlined = true;
 	///
+	bool ct_markup_copied = false;
+	///
 	bool scroll_below_document = false;
 	///
 	enum MacroEditStyle {
diff --git a/src/Text.cpp b/src/Text.cpp
index b29e002..dc29638 100644
--- a/src/Text.cpp
+++ b/src/Text.cpp
@@ -1813,8 +1813,9 @@ bool Text::dissolveInset(Cursor & cur)
 		// but we'll try the cheaper solution here.
 		cur.buffer()->clearReferenceCache();
 
-		// Do not revive deleted text
-		lyx::acceptChanges(plist, b.params());
+		if (!lyxrc.ct_markup_copied)
+			// Do not revive deleted text
+			lyx::acceptChanges(plist, b.params());
 
 		// ERT paragraphs have the Language latex_language.
 		// This is invalid outside of ERT, so we need to
diff --git a/src/frontends/qt/GuiPrefs.cpp b/src/frontends/qt/GuiPrefs.cpp
index abd9ff4..6ba54e3 100644
--- a/src/frontends/qt/GuiPrefs.cpp
+++ b/src/frontends/qt/GuiPrefs.cpp
@@ -2746,6 +2746,8 @@ PrefEdit::PrefEdit(GuiPreferences * form)
 		this, SIGNAL(changed()));
 	connect(macLikeCursorMovementCB, SIGNAL(clicked()),
 		this, SIGNAL(changed()));
+	connect(copyCTMarkupCB, SIGNAL(clicked()),
+		this, SIGNAL(changed()));
 	connect(sortEnvironmentsCB, SIGNAL(clicked()),
 		this, SIGNAL(changed()));
 	connect(groupEnvironmentsCB, SIGNAL(clicked()),
@@ -2776,6 +2778,7 @@ void PrefEdit::applyRC(LyXRC & rc) const
 	rc.cursor_follows_scrollbar = cursorFollowsCB->isChecked();
 	rc.scroll_below_document = scrollBelowCB->isChecked();
 	rc.mac_like_cursor_movement = macLikeCursorMovementCB->isChecked();
+	rc.ct_markup_copied = copyCTMarkupCB->isChecked();
 	rc.sort_layouts = sortEnvironmentsCB->isChecked();
 	rc.group_layouts = groupEnvironmentsCB->isChecked();
 	switch (macroEditStyleCO->currentIndex()) {
@@ -2799,6 +2802,7 @@ void PrefEdit::updateRC(LyXRC const & rc)
 	cursorFollowsCB->setChecked(rc.cursor_follows_scrollbar);
 	scrollBelowCB->setChecked(rc.scroll_below_document);
 	macLikeCursorMovementCB->setChecked(rc.mac_like_cursor_movement);
+	copyCTMarkupCB->setChecked(rc.ct_markup_copied);
 	sortEnvironmentsCB->setChecked(rc.sort_layouts);
 	groupEnvironmentsCB->setChecked(rc.group_layouts);
 	macroEditStyleCO->setCurrentIndex(rc.macro_edit_style);
diff --git a/src/frontends/qt/ui/PrefEditUi.ui b/src/frontends/qt/ui/PrefEditUi.ui
index 2db2dd6..69aa6f5 100644
--- a/src/frontends/qt/ui/PrefEditUi.ui
+++ b/src/frontends/qt/ui/PrefEditUi.ui
@@ -1,3 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
 <ui version="4.0">
  <class>PrefEditUi</class>
  <widget class="QWidget" name="PrefEditUi">
@@ -5,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>385</width>
-    <height>435</height>
+    <width>494</width>
+    <height>583</height>
    </rect>
   </property>
   <property name="sizePolicy">
@@ -31,6 +32,33 @@
       <bool>true</bool>
      </property>
      <layout class="QGridLayout" name="gridLayout">
+      <item row="2" column="0" colspan="2">
+       <widget class="QCheckBox" name="scrollBelowCB">
+        <property name="text">
+         <string>Scroll &below end of document</string>
+        </property>
+       </widget>
+      </item>
+      <item row="5" column="0" colspan="2">
+       <widget class="QCheckBox" name="sortEnvironmentsCB">
+        <property name="text">
+         <string>Sort &environments alphabetically</string>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="1" colspan="2">
+       <spacer name="horizontalSpacer_3">
+        <property name="orientation">
+         <enum>Qt::Horizontal</enum>
+        </property>
+        <property name="sizeHint" stdset="0">
+         <size>
+          <width>200</width>
+          <height>20</height>
+         </size>
+        </property>
+       </spacer>
+      </item>
       <item row="0" column="0">
        <widget class="QCheckBox" name="cursorFollowsCB">
         <property name="text">
@@ -71,23 +99,23 @@
         </item>
        </layout>
       </item>
-      <item row="1" column="1" colspan="2">
-       <spacer name="horizontalSpacer_3">
+      <item row="7" column="2">
+       <spacer name="horizontalSpacer">
         <property name="orientation">
          <enum>Qt::Horizontal</enum>
         </property>
         <property name="sizeHint" stdset="0">
          <size>
-          <width>200</width>
+          <width>40</width>
           <height>20</height>
          </size>
         </property>
        </spacer>
       </item>
-      <item row="2" column="0" colspan="2">
-       <widget class="QCheckBox" name="scrollBelowCB">
+      <item row="6" column="0" colspan="2">
+       <widget class="QCheckBox" name="groupEnvironmentsCB">
         <property name="text">
-         <string>Scroll &below end of document</string>
+         <string>&Group environments by their category</string>
         </property>
        </widget>
       </item>
@@ -101,21 +129,7 @@
         </property>
        </widget>
       </item>
-      <item row="4" column="0" colspan="2">
-       <widget class="QCheckBox" name="sortEnvironmentsCB">
-        <property name="text">
-         <string>Sort &environments alphabetically</string>
-        </property>
-       </widget>
-      </item>
-      <item row="5" column="0" colspan="2">
-       <widget class="QCheckBox" name="groupEnvironmentsCB">
-        <property name="text">
-         <string>&Group environments by their category</string>
-        </property>
-       </widget>
-      </item>
-      <item row="6" column="0" colspan="2">
+      <item row="7" column="0" colspan="2">
        <widget class="QComboBox" name="macroEditStyleCO">
         <item>
          <property name="text">
@@ -134,18 +148,15 @@
         </item>
        </widget>
       </item>
-      <item row="6" column="2">
-       <spacer name="horizontalSpacer">
-        <property name="orientation">
-         <enum>Qt::Horizontal</enum>
+      <item row="4" column="0">
+       <widget class="QCheckBox" name="copyCTMarkupCB">
+        <property name="toolTip">
+         <string>If this is checked, deleted and added text in change tracking mde will not be resolved on copy/paste operations and when moving content from/to insets</string>
         </property>
-        <property name="sizeHint" stdset="0">
-         <size>
-          <width>40</width>
-          <height>20</height>
-         </size>
+        <property name="text">
+         <string>&Keep change tracking markup on copy and paste</string>
         </property>
-       </spacer>
+       </widget>
       </item>
      </layout>
     </widget>


More information about the lyx-cvs mailing list