mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-12-22 05:16:21 +00:00
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:
parent
dd45c67468
commit
4858bb3bb6
@ -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;
|
||||
|
@ -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_;
|
||||
};
|
||||
|
||||
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user