diff --git a/src/mathed/MathData.cpp b/src/mathed/MathData.cpp index 059b8b56b7..4bf7059a84 100644 --- a/src/mathed/MathData.cpp +++ b/src/mathed/MathData.cpp @@ -264,6 +264,13 @@ bool isInside(DocIterator const & it, MathData const & ar, #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); @@ -278,7 +285,7 @@ void MathData::metrics(MetricsInfo & mi, Dimension & dim, bool tight) const 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); @@ -294,8 +301,8 @@ void MathData::metrics(MetricsInfo & mi, Dimension & dim, bool tight) const // 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())); diff --git a/src/mathed/MathData.h b/src/mathed/MathData.h index 93b0f1559a..1b9d8edcbc 100644 --- a/src/mathed/MathData.h +++ b/src/mathed/MathData.h @@ -124,6 +124,9 @@ public: /// 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. diff --git a/src/mathed/MathRow.cpp b/src/mathed/MathRow.cpp index 9163149694..c2b1a00a43 100644 --- a/src/mathed/MathRow.cpp +++ b/src/mathed/MathRow.cpp @@ -234,8 +234,10 @@ int MathRow::after(int i) const } -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. @@ -260,8 +262,10 @@ void MathRow::metrics(MetricsInfo & mi, Dimension & dim) 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) { @@ -310,6 +314,7 @@ void MathRow::metrics(MetricsInfo & mi, Dimension & dim) dim.wid += mathed_string_width(font, e.compl_text); } LATTEST(dim_insets.empty() && dim_arrays.empty()); + return has_caret; } diff --git a/src/mathed/MathRow.h b/src/mathed/MathRow.h index de63ec965f..cb4c8614cd 100644 --- a/src/mathed/MathRow.h +++ b/src/mathed/MathRow.h @@ -110,8 +110,8 @@ public: // 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;