X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FRow.cpp;h=1e9e3eca2bc7fc74a0af3fcf5bc740d00441352b;hb=bcde3d00165789db1e1ef183fab968c091faab8c;hp=1a12e9d695137a7a9d2c691a9193090b07e8c3c9;hpb=66a3d64346332e47252b37dbc0f80158738987dc;p=lyx.git diff --git a/src/Row.cpp b/src/Row.cpp index 1a12e9d695..1e9e3eca2b 100644 --- a/src/Row.cpp +++ b/src/Row.cpp @@ -19,6 +19,7 @@ #include "Row.h" #include "DocIterator.h" +#include "Language.h" #include "frontends/FontMetrics.h" @@ -376,11 +377,8 @@ void Row::finalizeLast() if (elt.type == STRING) { dim_.wid -= elt.dim.wid; - FontMetrics const & fm = theFontMetrics(elt.font); - elt.dim.wid = fm.width(elt.str); + elt.dim.wid = theFontMetrics(elt.font).width(elt.str); dim_.wid += elt.dim.wid; - dim_.asc = fm.maxAscent() + fm.leading(); - dim_.des = fm.maxDescent(); } } @@ -394,6 +392,7 @@ void Row::add(pos_type const pos, Inset const * ins, Dimension const & dim, e.dim = dim; elements_.push_back(e); dim_.wid += dim.wid; + changebar_ |= ins->isChanged(); } @@ -482,7 +481,22 @@ bool Row::shortenIfNeeded(pos_type const keep, int const w, int const next_width // make a copy of the element to work on it. Element brk = *cit_brk; wid_brk -= brk.dim.wid; - if (brk.countSeparators() == 0 || brk.pos < keep) + /* + * Some Asian languages split lines anywhere (no notion of + * word). It seems that QTextLayout is not aware of this fact. + * See for reference: + * https://en.wikipedia.org/wiki/Line_breaking_rules_in_East_Asian_languages + * + * FIXME: Something shall be done about characters which are + * not allowed at the beginning or end of line. + * + * FIXME: hardcoding languages is bad. Put this information in + * `languages' file. + */ + bool const word_wrap = brk.font.language()->wordWrap(); + // When there is text before the body part (think description + // environment), do not try to break. + if (brk.pos < keep) continue; /* We have found a suitable separable element. This is the common case. * Try to break it cleanly (at word boundary) at a length that is both @@ -490,7 +504,7 @@ bool Row::shortenIfNeeded(pos_type const keep, int const w, int const next_width * - shorter than the natural width of the element, in order to enforce * break-up. */ - if (brk.breakAt(min(w - wid_brk, brk.dim.wid - 2), false)) { + if (brk.breakAt(min(w - wid_brk, brk.dim.wid - 2), !word_wrap)) { /* if this element originally did not cause a row overflow * in itself, and the remainder of the row would still be * too large after breaking, then we will have issues in