mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-26 11:16:55 +00:00
Centralize the code that removes trailing spaces from end row element.
Move to Row::Element::rtrim the code in Row::shortenIfNeeded that removes trailing spaces from last element in row, so that it can be called when actually breaking a row. Fixes bug found by Kornel.
This commit is contained in:
parent
6e6976fbc5
commit
ef6dfe18c2
28
src/Row.cpp
28
src/Row.cpp
@ -35,7 +35,6 @@ using namespace std;
|
||||
|
||||
namespace lyx {
|
||||
|
||||
using support::rtrim;
|
||||
using frontend::FontMetrics;
|
||||
|
||||
|
||||
@ -162,6 +161,20 @@ Row::Element Row::Element::splitAt(int w, bool force)
|
||||
}
|
||||
|
||||
|
||||
void Row::Element::rtrim()
|
||||
{
|
||||
if (type != STRING)
|
||||
return;
|
||||
/* This is intended for strings that have been created by splitAt.
|
||||
* They may have trailing spaces, but they are not counted in the
|
||||
* string length (QTextLayout feature, actually). We remove them,
|
||||
* and decrease endpos, since spaces at row break are invisible.
|
||||
*/
|
||||
str = support::rtrim(str);
|
||||
endpos = pos + str.length();
|
||||
}
|
||||
|
||||
|
||||
bool Row::isMarginSelected(bool left, DocIterator const & beg,
|
||||
DocIterator const & end) const
|
||||
{
|
||||
@ -539,14 +552,6 @@ Row::Elements Row::shortenIfNeeded(int const w, int const next_width)
|
||||
break;
|
||||
}
|
||||
end_ = brk.endpos;
|
||||
/* after breakAt, there may be spaces at the end of the
|
||||
* string, but they are not counted in the string length
|
||||
* (QTextLayout feature, actually). We remove them, but do
|
||||
* not change the end of the row, since spaces at row
|
||||
* break are invisible.
|
||||
*/
|
||||
brk.str = rtrim(brk.str);
|
||||
brk.endpos = brk.pos + brk.str.length();
|
||||
*cit_brk = brk;
|
||||
dim_.wid = wid_brk + brk.dim.wid;
|
||||
// If there are other elements, they should be removed.
|
||||
@ -578,11 +583,8 @@ Row::Elements Row::shortenIfNeeded(int const w, int const next_width)
|
||||
* boundary this time.
|
||||
*/
|
||||
Element remainder = cit->splitAt(w - wid, true);
|
||||
if (remainder.isValid()) {
|
||||
if (cit->row_flags & BreakAfter) {
|
||||
end_ = cit->endpos;
|
||||
// See comment above.
|
||||
cit->str = rtrim(cit->str);
|
||||
cit->endpos = cit->pos + cit->str.length();
|
||||
dim_.wid = wid + cit->dim.wid;
|
||||
// If there are other elements, they should be removed.
|
||||
return splitFrom(elements_, next(cit, 1), remainder);
|
||||
|
@ -101,6 +101,8 @@ public:
|
||||
* respects the row breaking rules of characters.
|
||||
*/
|
||||
Element splitAt(int w, bool force);
|
||||
// remove trailing spaces (useful for end of row)
|
||||
void rtrim();
|
||||
|
||||
//
|
||||
bool isRTL() const { return font.isVisibleRightToLeft(); }
|
||||
|
@ -1061,6 +1061,10 @@ Row newRow(TextMetrics const & tm, pit_type pit, pos_type pos, bool is_rtl)
|
||||
void cleanupRow(Row & row, pos_type pos, pos_type real_endpos, bool is_rtl)
|
||||
{
|
||||
row.endpos(pos);
|
||||
// remove trailing spaces on row break
|
||||
if (pos < real_endpos && !row.empty())
|
||||
row.back().rtrim();
|
||||
// boundary exists when there was no space at the end of row
|
||||
row.right_boundary(!row.empty() && pos < real_endpos
|
||||
&& row.back().endpos == pos);
|
||||
// make sure that the RTL elements are in reverse ordering
|
||||
|
Loading…
Reference in New Issue
Block a user