mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-12-22 05:16:21 +00:00
New helper method Row::Element::isRTL()
This commit is contained in:
parent
6e3d6ddf7e
commit
8b89709fc9
30
src/Row.cpp
30
src/Row.cpp
@ -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.
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user