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.
This commit is contained in:
Jean-Marc Lasgouttes 2017-11-11 11:57:39 +01:00
parent dd45c67468
commit 4858bb3bb6
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),
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;

View File

@ -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_;
};

View File

@ -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();

View File

@ -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,6 +1949,7 @@ void TextMetrics::drawParagraph(PainterInfo & pi, pit_type const pit, int const
rp.paintSelection();
rp.paintAppendix();
rp.paintDepthBar();
if (row.needsChangeBar())
rp.paintChangeBar();
if (i == 0 && !row.isRTL())
rp.paintFirst();