From: Jean-Marc Lasgouttes Date: Thu, 24 May 2018 09:10:25 +0000 (+0200) Subject: Set caret height correctly for cells inside math rows X-Git-Tag: lyx-2.4.0dev-acb2ca7b~3404 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=a3868e40a40853bf3500ec4b3fb1a152f846464c;p=features.git Set caret height correctly for cells inside math rows 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. --- diff --git a/src/mathed/MathData.cpp b/src/mathed/MathData.cpp index 482d50636c..07decba9e5 100644 --- a/src/mathed/MathData.cpp +++ b/src/mathed/MathData.cpp @@ -259,6 +259,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); @@ -273,7 +280,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); @@ -289,8 +296,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 efa581c414..7099e64643 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;