JMarc's changes to the painting routines seem to have made it very easy
now to implement an oft-requested feature: to be able to hide changes in
the LyX display. The attached patch does this. There is at least one
bug: If an entire paragraph is deleted, it shows as an empty line. I'm
not sure how to fix that.

Note that this patch disables operations on changes (accepting,
rejecting, etc) when changes are not shown. This seems sensible, since
you can't actually see what you are doing. For the same sort of reason,
the Changes TOC is hidden when changes are not shown.

Riki


>From 005c1022cffd8756bb74a649fe94565b0a0974ff Mon Sep 17 00:00:00 2001
From: Richard Kimberly Heck <rikih...@lyx.org>
Date: Wed, 2 May 2018 22:31:57 -0400
Subject: [PATCH] Allow to hide changes in the LyX display.

---
 lib/Makefile.am                        |   2 ++
 lib/images/changes-display.svgz        | Bin 0 -> 3496 bytes
 lib/images/oxygen/changes-display.svgz | Bin 0 -> 6385 bytes
 lib/ui/stdmenus.inc                    |   3 ++-
 lib/ui/stdtoolbars.inc                 |   1 +
 src/Buffer.cpp                         |  13 +++++++++++++
 src/BufferParams.cpp                   |   7 +++++++
 src/BufferParams.h                     |   2 ++
 src/BufferView.cpp                     |   3 ++-
 src/Changes.cpp                        |   2 +-
 src/FuncCode.h                         |   2 ++
 src/LyXAction.cpp                      |   8 ++++++++
 src/RowPainter.cpp                     |  18 ++++++++++++++----
 src/RowPainter.h                       |   3 ++-
 src/Text3.cpp                          |  16 ++++++++++------
 src/TextMetrics.cpp                    |   5 +++++
 16 files changed, 71 insertions(+), 14 deletions(-)
 create mode 100644 lib/images/changes-display.svgz
 create mode 100644 lib/images/oxygen/changes-display.svgz

diff --git a/lib/Makefile.am b/lib/Makefile.am
index 2b3ea9a0d9..67957abd4e 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -445,6 +445,7 @@ dist_images_DATA1X = \
 	images/change-accept.svgz \
 	images/change-next.svgz \
 	images/change-reject.svgz \
+	images/changes-display.svgz \
 	images/changes-merge.svgz \
 	images/changes-output.svgz \
 	images/changes-track.svgz \
@@ -1726,6 +1727,7 @@ dist_imagesoxygen_DATA1X = \
 	images/oxygen/change-accept.svgz \
 	images/oxygen/change-next.svgz \
 	images/oxygen/change-reject.svgz \
+	images/oxygen/changes-display.svgz \
 	images/oxygen/changes-merge.svgz \
 	images/oxygen/changes-output.svgz \
 	images/oxygen/changes-track.svgz \
diff --git a/lib/images/changes-display.svgz b/lib/images/changes-display.svgz
new file mode 100644
index 0000000000000000000000000000000000000000..2127a7da44d396e3bfa71a924199515fc4b55fcf
GIT binary patch
literal 3496
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
W85#YY({{?cSN{dgW90ERIsgDQH@Bw%

literal 0
HcmV?d00001

diff --git a/lib/images/oxygen/changes-display.svgz b/lib/images/oxygen/changes-display.svgz
new file mode 100644
index 0000000000000000000000000000000000000000..2d6bf2693bf8e61c2273b8caf2b5e24ba30e68e9
GIT binary patch
literal 6385
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

literal 0
HcmV?d00001

diff --git a/lib/ui/stdmenus.inc b/lib/ui/stdmenus.inc
index 1bed2393ae..cda6917ab6 100644
--- a/lib/ui/stdmenus.inc
+++ b/lib/ui/stdmenus.inc
@@ -558,7 +558,8 @@ Menuset
 		Item "Reject Change|R" "change-reject"
 		Item "Accept All Changes|c" "all-changes-accept"
 		Item "Reject All Changes|e" "all-changes-reject"
-		Item "Show Changes in Output|S" "changes-output"
+		Item "Show Changes on Screen|S" "changes-display"
+		Item "Show Changes in Output|O" "changes-output"
 	End
 
 #
diff --git a/lib/ui/stdtoolbars.inc b/lib/ui/stdtoolbars.inc
index 54bea8abc9..f1145d9268 100644
--- a/lib/ui/stdtoolbars.inc
+++ b/lib/ui/stdtoolbars.inc
@@ -235,6 +235,7 @@ ToolbarSet
 
 	Toolbar "review" "Review[[Toolbar]]"
 		Item "Track changes" "changes-track"
+		Item "Show changes on screen" "changes-display"
 		Item "Show changes in output" "changes-output"
 		Separator
 		Item "Next change" "change-next"
diff --git a/src/Buffer.cpp b/src/Buffer.cpp
index 043f0cc9a7..1d8f6e105c 100644
--- a/src/Buffer.cpp
+++ b/src/Buffer.cpp
@@ -2623,6 +2623,11 @@ bool Buffer::getStatus(FuncRequest const & cmd, FuncStatus & flag)
 		flag.setOnOff(params().output_changes);
 		break;
 
+	case LFUN_CHANGES_DISPLAY:
+		flag.setEnabled(true);
+		flag.setOnOff(params().display_changes);
+		break;
+
 	case LFUN_BUFFER_TOGGLE_COMPRESSION:
 		flag.setOnOff(params().compressed);
 		break;
@@ -2893,6 +2898,14 @@ void Buffer::dispatch(FuncRequest const & func, DispatchResult & dr)
 		}
 		break;
 
+	case LFUN_CHANGES_DISPLAY:
+		if (params().save_transient_properties)
+			undo().recordUndoBufferParams(CursorData());
+		params().display_changes = !params().display_changes;
+		updateBuffer();
+		changed(true);
+		break;
+
 	case LFUN_BUFFER_TOGGLE_COMPRESSION:
 		// turn compression on/off
 		undo().recordUndoBufferParams(CursorData());
diff --git a/src/BufferParams.cpp b/src/BufferParams.cpp
index 7211f12b83..35c1b3bc2c 100644
--- a/src/BufferParams.cpp
+++ b/src/BufferParams.cpp
@@ -447,6 +447,7 @@ BufferParams::BufferParams()
 	notefontcolor = lyx::rgbFromHexName("#cccccc");
 	boxbgcolor = lyx::rgbFromHexName("#ff0000");
 	compressed = lyxrc.save_compressed;
+	display_changes = true;
 	for (int iter = 0; iter < 4; ++iter) {
 		user_defined_bullet(iter) = ITEMIZE_DEFAULTS[iter];
 		temp_bullet(iter) = ITEMIZE_DEFAULTS[iter];
@@ -927,6 +928,8 @@ string BufferParams::readToken(Lexer & lex, string const & token,
 		lex >> use_indices;
 	} else if (token == "\\tracking_changes") {
 		lex >> track_changes;
+	} else if (token == "\\showing_changes") {
+		lex >> display_changes;
 	} else if (token == "\\output_changes") {
 		lex >> output_changes;
 	} else if (token == "\\branch") {
@@ -1426,6 +1429,10 @@ void BufferParams::writeFile(ostream & os, Buffer const * buf) const
 	   << (save_transient_properties ? convert<string>(track_changes) : "false")
 	   << '\n';
 
+	os << "\\showing_changes "
+	   << (save_transient_properties ? convert<string>(display_changes) : "true")
+	   << '\n';
+
 	os << "\\output_changes "
 	   << (save_transient_properties ? convert<string>(output_changes) : "false")
 	   << '\n';
diff --git a/src/BufferParams.h b/src/BufferParams.h
index bc5c10d194..ad98dcacad 100644
--- a/src/BufferParams.h
+++ b/src/BufferParams.h
@@ -417,6 +417,8 @@ public:
 	 *  This is a transient property.
 	 */
 	bool output_changes;
+	/// whether to show changes on screen
+	bool display_changes;
 	///
 	bool compressed;
 
diff --git a/src/BufferView.cpp b/src/BufferView.cpp
index b8bc705434..9a389d9aa4 100644
--- a/src/BufferView.cpp
+++ b/src/BufferView.cpp
@@ -1176,7 +1176,8 @@ bool BufferView::getStatus(FuncRequest const & cmd, FuncStatus & flag)
 	case LFUN_CHANGE_PREVIOUS:
 	case LFUN_ALL_CHANGES_ACCEPT:
 	case LFUN_ALL_CHANGES_REJECT:
-		flag.setEnabled(buffer_.areChangesPresent());
+		flag.setEnabled(buffer_.params().display_changes &&
+			buffer_.areChangesPresent());
 		break;
 
 	case LFUN_SCREEN_UP:
diff --git a/src/Changes.cpp b/src/Changes.cpp
index b4226582f4..e9d63098f4 100644
--- a/src/Changes.cpp
+++ b/src/Changes.cpp
@@ -480,7 +480,7 @@ void Changes::checkAuthors(AuthorList const & authorList)
 void Changes::addToToc(DocIterator const & cdit, Buffer const & buffer,
                        bool output_active, TocBackend & backend) const
 {
-	if (table_.empty())
+	if (table_.empty() || !buffer.params().display_changes)
 		return;
 
 	shared_ptr<Toc> change_list = backend.toc("change");
diff --git a/src/FuncCode.h b/src/FuncCode.h
index f19a3e6095..376c076ca4 100644
--- a/src/FuncCode.h
+++ b/src/FuncCode.h
@@ -479,6 +479,8 @@ enum FuncCode
 	LFUN_BUFFER_ANONYMIZE,          // sanda, 20180201
 	LFUN_GRAPHICS_UNIFY,            // sanda, 20180207
 	LFUN_MASTER_BUFFER_EXPORT,      // rkh, 20180417
+	LFUN_CHANGES_DISPLAY,           // rkh, 20180502
+	// 375
 	LFUN_LASTACTION                 // end of the table
 };
 
diff --git a/src/LyXAction.cpp b/src/LyXAction.cpp
index 6e7c96a39c..f8c3607fe1 100644
--- a/src/LyXAction.cpp
+++ b/src/LyXAction.cpp
@@ -1015,6 +1015,14 @@ void LyXAction::init()
  */
 		{ LFUN_CELL_SPLIT, "cell-split", Noop, Edit },
 
+/*!
+ * \var lyx::FuncCode lyx::LFUN_CHANGES_DISPLAY
+ * \li Action: Toggles showing of changes on screen.
+ * \li Syntax: changes-display
+ * \li Origin: rkh, 2 May 2018
+ * \endvar
+ */
+		{ LFUN_CHANGES_DISPLAY, "changes-display", Noop, Edit },
 
 /*!
  * \var lyx::FuncCode lyx::LFUN_CHANGES_MERGE
diff --git a/src/RowPainter.cpp b/src/RowPainter.cpp
index f093805213..16663378b7 100644
--- a/src/RowPainter.cpp
+++ b/src/RowPainter.cpp
@@ -222,10 +222,10 @@ void RowPainter::paintStringAndSel(Row::Element const & e) const
 	bool const all_sel = (e.pos >= row_.sel_beg && e.endpos < row_.sel_end)
 		|| pi_.selected;
 
-	if (all_sel || e.change.changed()) {
+	if (all_sel || (displayChanges() && e.change.changed())) {
 		Font copy = e.font;
-		Color const col = e.change.changed() ? e.change.color()
-		                                     : Color_selectiontext;
+		Color const col = displayChanges() && e.change.changed() ? 
+				e.change.color() : Color_selectiontext;
 		copy.fontInfo().setPaintColor(col);
 		pi_.pain.text(int(x_), yo_, e.str, copy, e.extra, e.full_width());
 	} else if (!some_sel) {
@@ -241,12 +241,16 @@ void RowPainter::paintStringAndSel(Row::Element const & e) const
 
 void RowPainter::paintChange(Row::Element const & e) const
 {
-	e.change.paintCue(pi_, x_, yo_, x_ + e.full_width(), e.font.fontInfo());
+	if (displayChanges())
+		e.change.paintCue(pi_, x_, yo_, x_ + e.full_width(), e.font.fontInfo());
 }
 
 
 void RowPainter::paintChangeBar() const
 {
+	if (!displayChanges())
+		return;
+
 	int const height = tm_.isLastRow(row_)
 		? row_.ascent()
 		: row_.height();
@@ -430,6 +434,12 @@ void RowPainter::paintTopLevelLabel() const
 	pi_.pain.text(int(x), yo_ - maxdesc - labeladdon, str, font);
 }
 
+bool RowPainter::displayChanges() const
+{
+	return pi_.base.bv &&
+		pi_.base.bv->buffer().params().display_changes;
+}
+
 
 /** Check if the current paragraph is the last paragraph in a
     proof environment */
diff --git a/src/RowPainter.h b/src/RowPainter.h
index 20febee826..300b9d28c9 100644
--- a/src/RowPainter.h
+++ b/src/RowPainter.h
@@ -71,7 +71,8 @@ private:
 	void paintLabel() const;
 	///
 	void paintTopLevelLabel() const;
-
+	///
+	bool displayChanges() const;
 
 	/// contains painting related information.
 	PainterInfo & pi_;
diff --git a/src/Text3.cpp b/src/Text3.cpp
index 572e4bdd92..4da222d939 100644
--- a/src/Text3.cpp
+++ b/src/Text3.cpp
@@ -3196,12 +3196,16 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
 		// However, without proper optimizations, this will inevitably
 		// result in unacceptable performance - just imagine a user who
 		// wants to select the complete content of a long document.
-		if (!cur.selection())
-			enable = cur.paragraph().isChanged(cur.pos());
-		else
-			// TODO: context-sensitive enabling of LFUN_CHANGE_ACCEPT/REJECT
-			// for selections.
-			enable = true;
+		if (!cur.buffer()->params().display_changes) 
+			enable = false;
+		else {
+			if (!cur.selection())
+				enable = cur.paragraph().isChanged(cur.pos());
+			else
+				// TODO: context-sensitive enabling of LFUN_CHANGE_ACCEPT/REJECT
+				// for selections.
+				enable = true;
+		}
 		break;
 
 	case LFUN_OUTLINE_UP:
diff --git a/src/TextMetrics.cpp b/src/TextMetrics.cpp
index d23c09d29b..65c74de9b1 100644
--- a/src/TextMetrics.cpp
+++ b/src/TextMetrics.cpp
@@ -863,6 +863,11 @@ bool TextMetrics::breakRow(Row & row, int const right_margin) const
 	pos_type i = pos;
 	FontIterator fi = FontIterator(*this, par, row.pit(), pos);
 	while (i < end && (i == pos || row.width() <= width)) {
+		if (par.lookupChange(i).deleted() && 
+		    !bv_->buffer().params().display_changes) {
+			++i;
+			continue;
+		}
 		char_type c = par.getChar(i);
 		// The most special cases are handled first.
 		if (par.isInset(i)) {
-- 
2.14.3

Reply via email to