The code in
90cfe4ec3 only handled the cells which metrics are
computed directly, and missed those who were linearized inside a MathRow.
To fix this, we use the fact that all the positions in a math row have
the same height and make MathRow::metrics return a boolean indicating
whether it contains a caret for a given bufferview.
Fixes bug #11153.
(cherry picked from commit
a3868e40a40853bf3500ec4b3fb1a152f846464c)
#endif
+bool MathData::hasCaret(BufferView * bv) const
+{
+ Cursor & cur = bv->cursor();
+ return cur.inMathed() && &cur.cell() == this;
+}
+
+
void MathData::metrics(MetricsInfo & mi, Dimension & dim, bool tight) const
{
frontend::FontMetrics const & fm = theFontMetrics(mi.base.font);
sshift_ = xascent / 4;
MathRow mrow(mi, this);
- mrow.metrics(mi, dim);
+ bool has_caret = mrow.metrics(mi, dim);
mrow_cache_[bv] = mrow;
kerning_ = mrow.kerning(bv);
// This is one of the the few points where the drawing font is known,
// so that we can set the caret vertical dimensions.
- Cursor & cur = bv->cursor();
- if (cur.inMathed() && &cur.cell() == this)
+ has_caret |= hasCaret(bv);
+ if (has_caret)
bv->setCaretAscentDescent(min(dim.asc, fm.maxAscent()),
min(dim.des, fm.maxDescent()));
/// Add this array to a math row. Return true if contents got added
bool addToMathRow(MathRow &, MetricsInfo & mi) const;
+ // return true if caret is in this cell in this buffer view
+ bool hasCaret(BufferView * bv) const;
+
/// rebuild cached metrics information
/** When \c tight is true, the height of the cell will be at least
* that of 'x'. Otherwise, it will be the max height of the font.
}
-void MathRow::metrics(MetricsInfo & mi, Dimension & dim)
+bool MathRow::metrics(MetricsInfo & mi, Dimension & dim)
{
+ bool has_caret = false;
+
dim.wid = 0;
// In order to compute the dimension of macros and their
// arguments, it is necessary to keep track of them.
d.wid = e.before + e.after;
e.inset->beforeMetrics();
}
- if (e.ar)
+ if (e.ar) {
dim_arrays.push_back(make_pair(e.ar, Dimension()));
+ has_caret |= e.ar->hasCaret(mi.base.bv);
+ }
break;
case END:
if (e.inset) {
dim.wid += mathed_string_width(font, e.compl_text);
}
LATTEST(dim_insets.empty() && dim_arrays.empty());
+ return has_caret;
}
// compute the spacings.
MathRow(MetricsInfo & mi, MathData const * ar);
- //
- void metrics(MetricsInfo & mi, Dimension & dim);
+ // this returns true if the caret is here
+ bool metrics(MetricsInfo & mi, Dimension & dim);
//
void draw(PainterInfo & pi, int const x, int const y) const;