]> git.lyx.org Git - features.git/commitdiff
Set caret height correctly for cells inside math rows
authorJean-Marc Lasgouttes <lasgouttes@lyx.org>
Thu, 24 May 2018 09:10:25 +0000 (11:10 +0200)
committerJean-Marc Lasgouttes <lasgouttes@lyx.org>
Thu, 24 May 2018 12:47:08 +0000 (14:47 +0200)
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.

src/mathed/MathData.cpp
src/mathed/MathData.h
src/mathed/MathRow.cpp
src/mathed/MathRow.h

index 482d50636c0143f862f1ddfe6c6975bd7174d291..07decba9e5d26f4f66079e127a61e208ba017b18 100644 (file)
@@ -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()));
 
index efa581c4142de17569828dbfed772033c2454f5d..7099e64643affd4a7df3300350dc61105bd08005 100644 (file)
@@ -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.
index 91631496949df892e6e9d3166a4a92858c5aee8d..c2b1a00a430d8b9c435a023cf9365ba6affea090 100644 (file)
@@ -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;
 }
 
 
index de63ec965ff7a4442191cd044e28be11a07edce4..cb4c8614cd38f5993cc31a8821ce5cf501634724 100644 (file)
@@ -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;