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 4858bb3bb6)
This commit is contained in:
Jean-Marc Lasgouttes 2017-11-11 11:57:39 +01:00
parent 4ecbff0019
commit d2e15bd189
4 changed files with 17 additions and 14 deletions

View File

@ -164,7 +164,8 @@ Row::Row()
begin_margin_sel(false), end_margin_sel(false), begin_margin_sel(false), end_margin_sel(false),
changed_(false), crc_(0), changed_(false), crc_(0),
pit_(0), pos_(0), end_(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) if (elt.final)
return; return;
elt.final = true; elt.final = true;
if (elt.change.changed())
changebar_ = true;
if (elt.type == STRING) { if (elt.type == STRING) {
dim_.wid -= elt.dim.wid; dim_.wid -= elt.dim.wid;

View File

@ -266,6 +266,11 @@ public:
void reverseRTL(bool rtl_par); void reverseRTL(bool rtl_par);
/// ///
bool isRTL() const { return rtl_; } 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. /// Find row element that contains \c pos, and compute x offset.
const_iterator const findElement(pos_type pos, bool boundary, double & x) const; const_iterator const findElement(pos_type pos, bool boundary, double & x) const;
@ -326,6 +331,8 @@ private:
Dimension dim_; Dimension dim_;
/// true when this row lives in a right-to-left paragraph /// true when this row lives in a right-to-left paragraph
bool rtl_; bool rtl_;
/// true when a changebar should be drawn in the margin
bool changebar_;
}; };

View File

@ -247,18 +247,6 @@ void RowPainter::paintChange(Row::Element const & e) const
void RowPainter::paintChangeBar() 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_) int const height = tm_.isLastRow(row_)
? row_.ascent() ? row_.ascent()
: row_.height(); : row_.height();

View File

@ -964,6 +964,10 @@ bool TextMetrics::breakRow(Row & row, int const right_margin) const
row.addVirtual(end, docstring(1, char_type(0x00B6)), f, Change()); 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 // if the row is too large, try to cut at last separator. In case
// of success, reset indication that the row was broken abruptly. // of success, reset indication that the row was broken abruptly.
int const next_width = max_width_ - leftMargin(row.pit(), row.endpos()) 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.paintSelection();
rp.paintAppendix(); rp.paintAppendix();
rp.paintDepthBar(); rp.paintDepthBar();
rp.paintChangeBar(); if (row.needsChangeBar())
rp.paintChangeBar();
if (i == 0 && !row.isRTL()) if (i == 0 && !row.isRTL())
rp.paintFirst(); rp.paintFirst();
if (i == nrows - 1 && row.isRTL()) if (i == nrows - 1 && row.isRTL())