]> git.lyx.org Git - features.git/commitdiff
Fix some row breaking problems with large insets
authorJean-Marc Lasgouttes <lasgouttes@lyx.org>
Thu, 23 Jul 2015 09:59:51 +0000 (11:59 +0200)
committerJean-Marc Lasgouttes <lasgouttes@lyx.org>
Mon, 24 Aug 2015 12:09:19 +0000 (14:09 +0200)
When a row is too large due to a wide inset, it does not make sense to
break text before if the problem is the same in the next row.
Therefore give up breaking in this case.

Note that this was explicitely taken care of in the old-world
rowBreakPoint code.

Fixes bug #9691.

src/Row.cpp

index a61e19f9f13004cbae3a3f986e1b4aefaf7e2d33..7108c3c2adbef72248d28803f93b8a0397c4ab08 100644 (file)
@@ -404,7 +404,8 @@ void Row::shortenIfNeeded(pos_type const keep, int const w)
        ++cit_brk;
        while (cit_brk != beg) {
                --cit_brk;
-               Element & brk = *cit_brk;
+               // 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)
                        continue;
@@ -415,6 +416,15 @@ void Row::shortenIfNeeded(pos_type const keep, int const w)
                 *   break-up.
                 */
                if (brk.breakAt(min(w - wid_brk, brk.dim.wid - 2), false)) {
+                       /* 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
+                        * next row. Thus breaking does not help.
+                        */
+                       if (wid_brk + cit_brk->dim.wid < w
+                           && dim_.wid - (wid_brk + brk.dim.wid) >= w) {
+                               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
@@ -424,6 +434,7 @@ void Row::shortenIfNeeded(pos_type const keep, int const w)
                         */
                        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.
                        elements_.erase(cit_brk + 1, end);