commit d2e15bd1893e288f3177dbec15b82b723bfca6a6
Author: Jean-Marc Lasgouttes <lasgout...@lyx.org>
Date:   Sat Nov 11 11:57:39 2017 +0100

    Store change bar information in row element
    
    It is wrong to compute this at paint time. In general, painting a row
    should not require any access to a paragraph object, but we are far
    from there now.
    
    (cherry picked from commit 4858bb3bb68aac142815b530a017e3776d1c7c11)
---
 src/Row.cpp         |    5 ++++-
 src/Row.h           |    7 +++++++
 src/RowPainter.cpp  |   12 ------------
 src/TextMetrics.cpp |    7 ++++++-
 4 files changed, 17 insertions(+), 14 deletions(-)

diff --git a/src/Row.cpp b/src/Row.cpp
index db1bd28..20ff63e 100644
--- a/src/Row.cpp
+++ b/src/Row.cpp
@@ -164,7 +164,8 @@ Row::Row()
          begin_margin_sel(false), end_margin_sel(false),
          changed_(false), crc_(0),
          pit_(0), pos_(0), end_(0),
-         right_boundary_(false), flushed_(false), rtl_(false)
+         right_boundary_(false), flushed_(false), rtl_(false),
+         changebar_(false)
 {}
 
 
@@ -371,6 +372,8 @@ void Row::finalizeLast()
        if (elt.final)
                return;
        elt.final = true;
+       if (elt.change.changed())
+               changebar_ = true;
 
        if (elt.type == STRING) {
                dim_.wid -= elt.dim.wid;
diff --git a/src/Row.h b/src/Row.h
index 498fd07..a2e77fb 100644
--- a/src/Row.h
+++ b/src/Row.h
@@ -266,6 +266,11 @@ public:
        void reverseRTL(bool rtl_par);
        ///
        bool isRTL() const { return rtl_; }
+       ///
+       bool needsChangeBar() const { return changebar_; }
+       ///
+       void needsChangeBar(bool ncb) { changebar_ = ncb; }
+
        /// Find row element that contains \c pos, and compute x offset.
        const_iterator const findElement(pos_type pos, bool boundary, double & 
x) const;
 
@@ -326,6 +331,8 @@ private:
        Dimension dim_;
        /// true when this row lives in a right-to-left paragraph
        bool rtl_;
+       /// true when a changebar should be drawn in the margin
+       bool changebar_;
 };
 
 
diff --git a/src/RowPainter.cpp b/src/RowPainter.cpp
index c4b9034..38bcefa 100644
--- a/src/RowPainter.cpp
+++ b/src/RowPainter.cpp
@@ -247,18 +247,6 @@ void RowPainter::paintChange(Row::Element const & e) const
 
 void RowPainter::paintChangeBar() const
 {
-       pos_type const start = row_.pos();
-       pos_type end = row_.endpos();
-
-       if (par_.size() == end) {
-               // this is the last row of the paragraph;
-               // thus, we must also consider the imaginary end-of-par 
character
-               end++;
-       }
-
-       if (start == end || !par_.isChanged(start, end))
-               return;
-
        int const height = tm_.isLastRow(row_)
                ? row_.ascent()
                : row_.height();
diff --git a/src/TextMetrics.cpp b/src/TextMetrics.cpp
index 325b0b9..cd33f7f 100644
--- a/src/TextMetrics.cpp
+++ b/src/TextMetrics.cpp
@@ -964,6 +964,10 @@ bool TextMetrics::breakRow(Row & row, int const 
right_margin) const
                row.addVirtual(end, docstring(1, char_type(0x00B6)), f, 
Change());
        }
 
+       // Is there a end-of-paragaph change?
+       if (i == end && par.lookupChange(end).changed() && !need_new_row)
+               row.needsChangeBar(true);
+
        // if the row is too large, try to cut at last separator. In case
        // of success, reset indication that the row was broken abruptly.
        int const next_width = max_width_ - leftMargin(row.pit(), row.endpos())
@@ -1937,7 +1941,8 @@ void TextMetrics::drawParagraph(PainterInfo & pi, 
pit_type const pit, int const
                rp.paintSelection();
                rp.paintAppendix();
                rp.paintDepthBar();
-               rp.paintChangeBar();
+               if (row.needsChangeBar())
+                       rp.paintChangeBar();
                if (i == 0 && !row.isRTL())
                        rp.paintFirst();
                if (i == nrows - 1 && row.isRTL())

Reply via email to