[LyX/master] Reimplement computation of change tracking status

Jean-Marc Lasgouttes lasgouttes at lyx.org
Sun Jan 12 20:05:12 UTC 2020


commit 4a4ded2297ece7548aa6cbf731e9a90253cdeb63
Author: Jean-Marc Lasgouttes <lasgouttes at lyx.org>
Date:   Sun Jan 12 20:09:41 2020 +0100

    Reimplement computation of change tracking status
    
    This is a reimplementation of 6d4e6aad that is both simpler and more
    complete.
    
    This uses the updateBuffer mechanism to implement a fully working
    version of Inset::isChanged(). Now the function returns true for an
    inset that contains an inset that contains a change, for example.
    
    Moverover Buffer::areChangesPresent() is merely a proxy for
    Buffer::inset().isChanged().
---
 src/Buffer.cpp           |   14 ++++++++++++++
 src/Buffer.h             |    2 +-
 src/insets/InsetText.cpp |   25 +++++++++++++------------
 src/insets/InsetText.h   |    6 +++++-
 4 files changed, 33 insertions(+), 14 deletions(-)

diff --git a/src/Buffer.cpp b/src/Buffer.cpp
index ea04b34..bd3d63e 100644
--- a/src/Buffer.cpp
+++ b/src/Buffer.cpp
@@ -5320,6 +5320,7 @@ void Buffer::updateBuffer(ParIterator & parit, UpdateType utype) const
 
 	depth_type maxdepth = 0;
 	pit_type const lastpit = parit.lastpit();
+	bool changed = false;
 	for ( ; parit.pit() <= lastpit ; ++parit.pit()) {
 		// reduce depth if necessary
 		if (parit->params().depth() > maxdepth) {
@@ -5350,8 +5351,15 @@ void Buffer::updateBuffer(ParIterator & parit, UpdateType utype) const
 		for (auto const & insit : parit->insetList()) {
 			parit.pos() = insit.pos;
 			insit.inset->updateBuffer(parit, utype);
+			changed |= insit.inset->isChanged();
 		}
+
+		// are there changes in this paragraph?
+		changed |= parit->isChanged();
 	}
+
+	// set change indicator for the inset
+	parit.inset().asInsetText()->isChanged(changed);
 }
 
 
@@ -5464,6 +5472,12 @@ int Buffer::charCount(bool with_blanks) const
 }
 
 
+bool Buffer::areChangesPresent() const
+{
+	return inset().isChanged();
+}
+
+
 Buffer::ReadStatus Buffer::reload()
 {
 	setBusy(true);
diff --git a/src/Buffer.h b/src/Buffer.h
index 977d893..0e1ec6b 100644
--- a/src/Buffer.h
+++ b/src/Buffer.h
@@ -775,7 +775,7 @@ public:
 	int charCount(bool with_blanks) const;
 
 	/// FIXME: dummy function for now
-	bool areChangesPresent() const { return true; }
+	bool areChangesPresent() const;
 
 	///
 	void registerBibfiles(docstring_list const & bf) const;
diff --git a/src/insets/InsetText.cpp b/src/insets/InsetText.cpp
index eca69df..f3e33f0 100644
--- a/src/insets/InsetText.cpp
+++ b/src/insets/InsetText.cpp
@@ -79,14 +79,15 @@ using graphics::PreviewLoader;
 /////////////////////////////////////////////////////////////////////
 
 InsetText::InsetText(Buffer * buf, UsePlain type)
-	: Inset(buf), drawFrame_(false), frame_color_(Color_insetframe),
+	: Inset(buf), drawFrame_(false), is_changed_(false), frame_color_(Color_insetframe),
 	text_(this, type == DefaultLayout)
 {
 }
 
 
 InsetText::InsetText(InsetText const & in)
-	: Inset(in), drawFrame_(in.drawFrame_), frame_color_(in.frame_color_),
+	: Inset(in), drawFrame_(in.drawFrame_), is_changed_(in.is_changed_),
+	  frame_color_(in.frame_color_),
 	  text_(this, in.text_)
 {
 }
@@ -410,16 +411,16 @@ void InsetText::fixParagraphsFont()
 }
 
 
-bool InsetText::isChanged() const
-{
-	ParagraphList::const_iterator pit = paragraphs().begin();
-	ParagraphList::const_iterator end = paragraphs().end();
-	for (; pit != end; ++pit) {
-		if (pit->isChanged())
-			return true;
-	}
-	return false;
-}
+// bool InsetText::isChanged() const
+// {
+// 	ParagraphList::const_iterator pit = paragraphs().begin();
+// 	ParagraphList::const_iterator end = paragraphs().end();
+// 	for (; pit != end; ++pit) {
+// 		if (pit->isChanged())
+// 			return true;
+// 	}
+// 	return false;
+// }
 
 
 void InsetText::setChange(Change const & change)
diff --git a/src/insets/InsetText.h b/src/insets/InsetText.h
index fc43ccb..3e535cb 100644
--- a/src/insets/InsetText.h
+++ b/src/insets/InsetText.h
@@ -125,7 +125,9 @@ public:
 	void fixParagraphsFont();
 
 	/// does the inset contain changes ?
-	bool isChanged() const;
+	bool isChanged() const { return is_changed_; }
+	/// this is const because value is mutable
+	void isChanged(bool ic) const { is_changed_ = ic; }
 	/// set the change for the entire inset
 	void setChange(Change const & change);
 	/// accept the changes within the inset
@@ -247,6 +249,8 @@ private:
 	                               TocBackend & backend) const;
 	///
 	bool drawFrame_;
+	/// true if the inset contains change
+	mutable bool is_changed_;
 	///
 	ColorCode frame_color_;
 	///


More information about the lyx-cvs mailing list