]> git.lyx.org Git - features.git/commitdiff
New helper method Row::Element::isRTL()
authorJean-Marc Lasgouttes <lasgouttes@lyx.org>
Fri, 18 Sep 2015 14:42:24 +0000 (15:42 +0100)
committerJean-Marc Lasgouttes <lasgouttes@lyx.org>
Mon, 21 Sep 2015 12:03:54 +0000 (14:03 +0200)
src/Row.cpp
src/Row.h
src/RowPainter.cpp
src/TextMetrics.cpp

index 7108c3c2adbef72248d28803f93b8a0397c4ab08..e3e8a3430a177e6982b930903c12704afacc7bec 100644 (file)
@@ -52,18 +52,16 @@ double Row::Element::pos2x(pos_type const i) const
        if (i < pos || i > endpos)
                return 0;
 
-       bool const rtl = font.isVisibleRightToLeft();
-
        double w = 0;
        //handle first the two bounds of the element
        if (i == endpos && type != VIRTUAL
                && !(inset && inset->lyxCode() == SEPARATOR_CODE))
-               w = rtl ? 0 : full_width();
+               w = isRTL() ? 0 : full_width();
        else if (i == pos || type != STRING)
-               w = rtl ? full_width() : 0;
+               w = isRTL() ? full_width() : 0;
        else {
                FontMetrics const & fm = theFontMetrics(font);
-               w = fm.pos2x(str, i - pos, font.isVisibleRightToLeft(), extra);
+               w = fm.pos2x(str, i - pos, isRTL(), extra);
        }
 
        return w;
@@ -73,19 +71,18 @@ double Row::Element::pos2x(pos_type const i) const
 pos_type Row::Element::x2pos(int &x) const
 {
        //lyxerr << "x2pos: x=" << x << " w=" << width() << " " << *this;
-       bool const rtl = font.isVisibleRightToLeft();
        size_t i = 0;
 
        switch (type) {
        case STRING: {
                FontMetrics const & fm = theFontMetrics(font);
-               i = fm.x2pos(str, x, rtl, extra);
+               i = fm.x2pos(str, x, isRTL(), extra);
                break;
        }
        case VIRTUAL:
                // those elements are actually empty (but they have a width)
                i = 0;
-               x = rtl ? int(full_width()) : 0;
+               x = isRTL() ? int(full_width()) : 0;
                break;
        case INSET:
        case SPACE:
@@ -93,10 +90,10 @@ pos_type Row::Element::x2pos(int &x) const
                // the closest side.
                if (x > full_width()) {
                        x = int(full_width());
-                       i = !rtl;
+                       i = !isRTL();
                } else {
                        x = 0;
-                       i = rtl;
+                       i = isRTL();
                }
 
        }
@@ -111,10 +108,9 @@ bool Row::Element::breakAt(int w, bool force)
        if (type != STRING || dim.wid <= w)
                return false;
 
-       bool const rtl = font.isVisibleRightToLeft();
        FontMetrics const & fm = theFontMetrics(font);
        int x = w;
-       if(fm.breakAt(str, x, rtl, force)) {
+       if(fm.breakAt(str, x, isRTL(), force)) {
                dim.wid = x;
                endpos = pos + str.length();
                //lyxerr << "breakAt(" << w << ")  Row element Broken at " << x << "(w(str)=" << fm.width(str) << "): e=" << *this << endl;
@@ -126,13 +122,13 @@ bool Row::Element::breakAt(int w, bool force)
 
 pos_type Row::Element::left_pos() const
 {
-       return font.isVisibleRightToLeft() ? endpos : pos;
+       return isRTL() ? endpos : pos;
 }
 
 
 pos_type Row::Element::right_pos() const
 {
-       return font.isVisibleRightToLeft() ? pos : endpos;
+       return isRTL() ? pos : endpos;
 }
 
 
@@ -217,7 +213,7 @@ bool Row::selection() const
 
 ostream & operator<<(ostream & os, Row::Element const & e)
 {
-       if (e.font.isVisibleRightToLeft())
+       if (e.isRTL())
                os << e.endpos << "<<" << e.pos << " ";
        else
                os << e.pos << ">>" << e.endpos << " ";
@@ -480,9 +476,9 @@ void Row::reverseRTL(bool const rtl_par)
        pos_type const end = elements_.size();
        while (i < end) {
                // gather a sequence of elements with the same direction
-               bool const rtl = elements_[i].font.isVisibleRightToLeft();
+               bool const rtl = elements_[i].isRTL();
                pos_type j = i;
-               while (j < end && elements_[j].font.isVisibleRightToLeft() == rtl)
+               while (j < end && elements_[j].isRTL() == rtl)
                        ++j;
                // if the direction is not the same as the paragraph
                // direction, the sequence has to be reverted.
index 92521ef4baa9ffb8a9e3ffed346cfb560c71c293..c0580c0e69a05328d78172051896283c4949b706 100644 (file)
--- a/src/Row.h
+++ b/src/Row.h
@@ -62,7 +62,7 @@ public:
                          extra(0), font(f), change(ch), final(false) {}
 
                // Return total width of element, including separator overhead
-               double full_width() const { return dim.wid + extra * countSeparators(); };
+               double full_width() const { return dim.wid + extra * countSeparators(); }
                // Return the number of separator in the element (only STRING type)
                int countSeparators() const;
 
@@ -87,6 +87,9 @@ public:
                // Returns the position on right side of the element.
                pos_type right_pos() const;
 
+               //
+               bool isRTL() const { return font.isVisibleRightToLeft(); }
+
                // The kind of row element
                Type type;
                // position of the element in the paragraph
index f54cf2853bb6919e2e7893375d75edbdf600c2ec..81b58a869196347de68131440b010de0efeac193 100644 (file)
@@ -219,10 +219,10 @@ void RowPainter::paintMisspelledMark(double const orig_x,
 
                FontMetrics const & fm = theFontMetrics(e.font);
                int x1 = fm.pos2x(e.str, range.first - e.pos,
-                                 e.font.isVisibleRightToLeft(), e.extra);
+                                 e.isRTL(), e.extra);
                int x2 = fm.pos2x(e.str, min(range.last - e.pos + 1,
                                                                         pos_type(e.str.length())),
-                                                                        e.font.isVisibleRightToLeft(), e.extra);
+                                                                        e.isRTL(), e.extra);
                if (x1 > x2)
                        swap(x1, x2);
 
index b394169fac01ce13c02a67bd72cfaa5836f47af2..fc5e1c5ac5ec0e29856bcfcf7738150487749f03 100644 (file)
@@ -1103,7 +1103,7 @@ pos_type TextMetrics::getPosNearX(Row const & row, int & x,
                 */
                else if (pos == cit->endpos
                         && cit + 1 != row.end()
-                        && cit->font.isVisibleRightToLeft() != (cit + 1)->font.isVisibleRightToLeft())
+                        && cit->isRTL() != (cit + 1)->isRTL())
                        boundary = true;
        }