From 4858bb3bb68aac142815b530a017e3776d1c7c11 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Sat, 11 Nov 2017 11:57:39 +0100 Subject: [PATCH] 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. --- 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 db1bd2883c..20ff63e22a 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 498fd07d7f..a2e77fbfb4 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 2dc76664a9..85f450edc6 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 0c5d8f4934..2c647786b5 100644 --- a/src/TextMetrics.cpp +++ b/src/TextMetrics.cpp @@ -972,6 +972,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()) @@ -1945,7 +1949,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()) -- 2.39.5