Simplify redoParagraph by merging duplicate code

Let breakRow return a boolean indicating whether an additional row is
required (after a newline) and use that to replace the code that added
an extra row when a paragraph ends with a newline.
This commit is contained in:
Jean-Marc Lasgouttes 2016-03-05 23:11:45 +01:00
parent 78eaf8333b
commit 1751626776
2 changed files with 13 additions and 20 deletions

View File

@ -437,6 +437,7 @@ bool TextMetrics::redoParagraph(pit_type const pit)
par.setBeginOfBody(); par.setBeginOfBody();
pos_type first = 0; pos_type first = 0;
size_t row_index = 0; size_t row_index = 0;
bool need_new_row = false;
// maximum pixel width of a row // maximum pixel width of a row
do { do {
if (row_index == pm.rows().size()) if (row_index == pm.rows().size())
@ -444,7 +445,7 @@ bool TextMetrics::redoParagraph(pit_type const pit)
Row & row = pm.rows()[row_index]; Row & row = pm.rows()[row_index];
row.pit(pit); row.pit(pit);
row.pos(first); row.pos(first);
breakRow(row, right_margin, pit); need_new_row = breakRow(row, right_margin, pit);
setRowHeight(row, pit); setRowHeight(row, pit);
row.setChanged(false); row.setChanged(false);
if (row_index || row.endpos() < par.size() if (row_index || row.endpos() < par.size()
@ -468,26 +469,11 @@ bool TextMetrics::redoParagraph(pit_type const pit)
pm.dim().wid = max(pm.dim().wid, row.width()); pm.dim().wid = max(pm.dim().wid, row.width());
pm.dim().des += row.height(); pm.dim().des += row.height();
} while (first < par.size()); } while (first < par.size() || need_new_row);
if (row_index < pm.rows().size()) if (row_index < pm.rows().size())
pm.rows().resize(row_index); pm.rows().resize(row_index);
// Make sure that if a par ends in newline, there is one more row
// under it
if (first > 0 && par.isNewline(first - 1)) {
if (row_index == pm.rows().size())
pm.rows().push_back(Row());
Row & row = pm.rows()[row_index];
row.pos(first);
breakRow(row, right_margin, pit);
setRowHeight(row, pit);
row.setChanged(false);
int const max_row_width = max(dim_.wid, row.width());
computeRowMetrics(pit, row, max_row_width);
pm.dim().des += row.height();
}
pm.dim().asc += pm.rows()[0].ascent(); pm.dim().asc += pm.rows()[0].ascent();
pm.dim().des -= pm.rows()[0].ascent(); pm.dim().des -= pm.rows()[0].ascent();
@ -786,7 +772,7 @@ private:
* very sensitive to small changes :) Note that part of the * very sensitive to small changes :) Note that part of the
* intelligence is also in Row::shortenIfNeeded. * intelligence is also in Row::shortenIfNeeded.
*/ */
void TextMetrics::breakRow(Row & row, int const right_margin, pit_type const pit) const bool TextMetrics::breakRow(Row & row, int const right_margin, pit_type const pit) const
{ {
Paragraph const & par = text_->getPar(pit); Paragraph const & par = text_->getPar(pit);
pos_type const end = par.size(); pos_type const end = par.size();
@ -806,7 +792,10 @@ void TextMetrics::breakRow(Row & row, int const right_margin, pit_type const pit
// the width available for the row. // the width available for the row.
int const width = max_width_ - row.right_margin; int const width = max_width_ - row.right_margin;
ParagraphList const & pars = text_->paragraphs(); if (pos >= end || row.width() > width) {
row.endpos(end);
return need_new_row;
}
#if 0 #if 0
//FIXME: As long as leftMargin() is not correctly implemented for //FIXME: As long as leftMargin() is not correctly implemented for
@ -900,6 +889,7 @@ void TextMetrics::breakRow(Row & row, int const right_margin, pit_type const pit
row.endpos(i); row.endpos(i);
// End of paragraph marker // End of paragraph marker
ParagraphList const & pars = text_->paragraphs();
if (lyxrc.paragraph_markers && !need_new_row if (lyxrc.paragraph_markers && !need_new_row
&& i == end && size_type(pit + 1) < pars.size()) { && i == end && size_type(pit + 1) < pars.size()) {
// add a virtual element for the end-of-paragraph // add a virtual element for the end-of-paragraph
@ -921,6 +911,8 @@ void TextMetrics::breakRow(Row & row, int const right_margin, pit_type const pit
// make sure that the RTL elements are in reverse ordering // make sure that the RTL elements are in reverse ordering
row.reverseRTL(is_rtl); row.reverseRTL(is_rtl);
//LYXERR0("breakrow: row is " << row); //LYXERR0("breakrow: row is " << row);
return need_new_row;
} }

View File

@ -131,7 +131,8 @@ private:
/// sets row.end to the pos value *after* which a row should break. /// sets row.end to the pos value *after* which a row should break.
/// for example, the pos after which isNewLine(pos) == true /// for example, the pos after which isNewLine(pos) == true
void breakRow(Row & row, int right_margin, pit_type const pit) const; /// \return true when another row is required (after a newline)
bool breakRow(Row & row, int right_margin, pit_type const pit) const;
// Expand the alignment of row \param row in paragraph \param par // Expand the alignment of row \param row in paragraph \param par
LyXAlignment getAlign(Paragraph const & par, Row const & row) const; LyXAlignment getAlign(Paragraph const & par, Row const & row) const;