]> git.lyx.org Git - features.git/commitdiff
More fixes to cursorX
authorJean-Marc Lasgouttes <lasgouttes@lyx.org>
Fri, 18 Oct 2013 15:55:30 +0000 (17:55 +0200)
committerJean-Marc Lasgouttes <lasgouttes@lyx.org>
Wed, 25 Jun 2014 15:55:30 +0000 (17:55 +0200)
In Row::Element::pos2x, handle the boundaries in a cleaner way.

src/Row.cpp
src/TextMetrics.cpp

index d074d73eb8be059d24cc5393ab265ec2caa8c451..d7940e92e9802548c1df0a0197aa49fd8b97e6fc 100644 (file)
@@ -36,17 +36,23 @@ using frontend::FontMetrics;
 
 double Row::Element::pos2x(pos_type const i) const
 {
+       LASSERT(i >= pos && i <= endpos, return 0);
+
        bool const rtl = font.isVisibleRightToLeft();
 
-       // handle first the two bounds of the element
-       if ((!rtl && pos >= i) || (rtl && endpos <= i))
-               return 0;
-       if ((!rtl && endpos <= i) || (rtl && pos >= i))
-               return width();
+       int w = 0;
+       //handle first the two bounds of the element
+       if (i == pos)
+               w = 0;
+       else if (i == endpos)
+               w = width();
+       else {
+               LASSERT(type == STRING, return 0);
+               FontMetrics const & fm = theFontMetrics(font);
+               // FIXME Avoid caching of metrics there?
+               w = fm.width(str.substr(0, i - pos));
+       }
 
-       FontMetrics const & fm = theFontMetrics(font);
-       // FIXME Avoid caching of metrics there?
-       int const w = fm.width(str.substr(0, i - pos));
        if (rtl)
                return width() - w;
        else
index 85639755859405a294ac723f26896d6b63031694..b8941335bde3b400d335be41bf63f5b4021b5014 100644 (file)
@@ -1613,15 +1613,16 @@ int TextMetrics::cursorX(CursorSlice const & sl,
        double x = row.x;
 
        /**
-        * When boundary is true, position is on the row element (pos, endpos)
+        * When boundary is true, position i is in the row element (pos, endpos)
         * if
-        *    pos < pos <= endpos
+        *    pos < i <= endpos
         * whereas, when boundary is false, the test is
-        *    pos <= pos < endpos
+        *    pos <= i < endpos
         * The correction below allows to handle both cases.
        */
        int const boundary_corr = (boundary && pos) ? -1 : 0;
 
+       //?????
        if (row.empty()
            || (row.begin()->font.isVisibleRightToLeft()
                && pos == row.begin()->endpos))