From 8e7d0c2002bdc69c95f3a43f7c78d13fe47ce5f3 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Fri, 27 Jan 2017 16:09:03 +0100 Subject: [PATCH] Fix flushing of row that was cut after an hyphen When using Qt stuff in breakAt, it may happen that the row is broken after an hyphen (whereas the old code would only consider spaces). The fact that we abuse the Row::right_boundary() property to detect when a row should be flushed broke justification when a row is cut at an hyphen. Fix this by introducing a new Row::flushed() property and set it as needed. --- src/Row.cpp | 2 +- src/Row.h | 8 +++++++- src/TextMetrics.cpp | 14 +++++++++----- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/Row.cpp b/src/Row.cpp index 16ce90d473..53f04ddb03 100644 --- a/src/Row.cpp +++ b/src/Row.cpp @@ -164,7 +164,7 @@ Row::Row() sel_beg(-1), sel_end(-1), begin_margin_sel(false), end_margin_sel(false), changed_(false), crc_(0), - pit_(0), pos_(0), end_(0), right_boundary_(false) + pit_(0), pos_(0), end_(0), right_boundary_(false), flushed_(false) {} diff --git a/src/Row.h b/src/Row.h index 220449947a..961b6ebb98 100644 --- a/src/Row.h +++ b/src/Row.h @@ -171,6 +171,10 @@ public: void right_boundary(bool b) { right_boundary_ = b; } /// bool right_boundary() const { return right_boundary_; } + /// + void flushed(bool b) { flushed_ = b; } + /// + bool flushed() const { return flushed_; } /// Dimension const & dimension() const { return dim_; } @@ -310,8 +314,10 @@ private: pos_type pos_; /// one behind last pos covered by this row pos_type end_; - // Is there is a boundary at the end of the row (display inset...) + // Is there a boundary at the end of the row (display inset...) bool right_boundary_; + // Shall the row be flushed when it is supposed to be justified? + bool flushed_; /// Row dimension. Dimension dim_; }; diff --git a/src/TextMetrics.cpp b/src/TextMetrics.cpp index 96c2fb52bd..65d9424a9f 100644 --- a/src/TextMetrics.cpp +++ b/src/TextMetrics.cpp @@ -561,8 +561,7 @@ LyXAlignment TextMetrics::getAlign(Paragraph const & par, Row const & row) const // not justify stuff, then don't stretch. // A forced block alignment can only be overridden the 'no // justification on screen' setting. - if (((row.right_boundary() || row.endpos() == par.size()) - && !forced_block) + if ((row.flushed() && !forced_block) || !bv_->buffer().params().justification) align = text_->isRTL(par) ? LYX_ALIGN_RIGHT : LYX_ALIGN_LEFT; } @@ -911,7 +910,7 @@ bool TextMetrics::breakRow(Row & row, int const right_margin) const && inset->display()) || (!row.empty() && row.back().inset && row.back().inset->display())) { - row.right_boundary(true); + row.flushed(true); need_new_row = par.isNewline(i); ++i; break; @@ -943,8 +942,13 @@ bool TextMetrics::breakRow(Row & row, int const right_margin) const // of success, reset indication that the row was broken abruptly. int const next_width = max_width_ - leftMargin(max_width_, row.pit(), row.endpos()) - rightMargin(row.pit()); - if (row.shortenIfNeeded(body_pos, width, next_width)) - row.right_boundary(!row.empty() && row.back().endpos == row.endpos()); + + row.shortenIfNeeded(body_pos, width, next_width); + row.right_boundary(!row.empty() && row.endpos() < end + && row.back().endpos == row.endpos()); + // Last row in paragraph is flushed + if (row.endpos() == end) + row.flushed(true); // make sure that the RTL elements are in reverse ordering row.reverseRTL(is_rtl); -- 2.39.5