]> git.lyx.org Git - lyx.git/blobdiff - src/BufferView.cpp
typo
[lyx.git] / src / BufferView.cpp
index ba8c768ca4b1d0120eae5a35b54fd45b57b2f2f8..0aad452fd0f2a4c04088922a3f1fe7278180ab0d 100644 (file)
@@ -239,8 +239,7 @@ struct BufferView::Private
                last_inset_(0), clickable_inset_(false),
                mouse_position_cache_(),
                bookmark_edit_position_(-1), gui_(0),
-               horiz_scroll_offset_(0),
-               caret_ascent_(0), caret_descent_(0)
+               horiz_scroll_offset_(0)
        {
                xsel_cache_.set = false;
        }
@@ -253,6 +252,9 @@ struct BufferView::Private
        Update::flags update_flags_;
        ///
        CoordCache coord_cache_;
+       ///
+       typedef map<MathData const *, MathRow> MathRows;
+       MathRows math_rows_;
 
        /// Estimated average par height for scrollbar.
        int wh_;
@@ -316,12 +318,6 @@ struct BufferView::Private
        /// a slice pointing to the start of the row where the cursor
        /// is (at last draw time)
        CursorSlice current_row_slice_;
-
-       // The vertical size of the blinking caret. Only used for math
-       // Using it for text could be bad when undo restores the cursor
-       // current font, since the caret size could become wrong.
-       int caret_ascent_;
-       int caret_descent_;
 };
 
 
@@ -349,9 +345,10 @@ BufferView::~BufferView()
        // That is to say, if a cursor is in a nested inset, it will be
        // restore to the left of the top level inset.
        LastFilePosSection::FilePos fp;
+       fp.file = buffer_.fileName();
        fp.pit = d->cursor_.bottom().pit();
        fp.pos = d->cursor_.bottom().pos();
-       theSession().lastFilePos().save(buffer_.fileName(), fp);
+       theSession().lastFilePos().save(fp);
 
        if (d->last_inset_)
                d->last_inset_->setMouseHover(this, false);
@@ -437,6 +434,20 @@ CoordCache const & BufferView::coordCache() const
 }
 
 
+MathRow const & BufferView::mathRow(MathData const * cell) const
+{
+       auto it = d->math_rows_.find(cell);
+       LATTEST(it != d->math_rows_.end());
+       return it->second;
+}
+
+
+void BufferView::setMathRow(MathData const * cell, MathRow const & mrow)
+{
+       d->math_rows_[cell] = mrow;
+}
+
+
 Buffer & BufferView::buffer()
 {
        return buffer_;
@@ -2778,6 +2789,7 @@ void BufferView::updateMetrics(Update::flags & update_flags)
 
        // Clear out the position cache in case of full screen redraw,
        d->coord_cache_.clear();
+       d->math_rows_.clear();
 
        // Clear out paragraph metrics to avoid having invalid metrics
        // in the cache from paragraphs not relayouted below
@@ -3013,20 +3025,14 @@ bool BufferView::paragraphVisible(DocIterator const & dit) const
 }
 
 
-void BufferView::setCaretAscentDescent(int asc, int des)
-{
-       d->caret_ascent_ = asc;
-       d->caret_descent_ = des;
-}
-
-
 void BufferView::caretPosAndHeight(Point & p, int & h) const
 {
        int asc, des;
        Cursor const & cur = cursor();
        if (cur.inMathed()) {
-               asc = d->caret_ascent_;
-               des = d->caret_descent_;
+               MathRow const & mrow = mathRow(&cur.cell());
+               asc = mrow.caret_ascent;
+               des = mrow.caret_descent;
        } else {
                Font const font = cur.real_current_font;
                frontend::FontMetrics const & fm = theFontMetrics(font);
@@ -3039,11 +3045,16 @@ void BufferView::caretPosAndHeight(Point & p, int & h) const
 }
 
 
-bool BufferView::cursorInView(Point const & p, int h) const
+bool BufferView::caretInView() const
 {
-       Cursor const & cur = cursor();
+       if (!paragraphVisible(cursor()))
+               return false;
+       Point p;
+       int h;
+       caretPosAndHeight(p, h);
+
        // does the cursor touch the screen ?
-       if (p.y_ + h < 0 || p.y_ >= workHeight() || !paragraphVisible(cur))
+       if (p.y_ + h < 0 || p.y_ >= workHeight())
                return false;
        return true;
 }
@@ -3174,7 +3185,6 @@ void BufferView::draw(frontend::Painter & pain, bool paint_caret)
                // however, the different coordinates of insets and paragraphs
                // needs to be updated.
                LYXERR(Debug::PAINTING, "Strategy: NoScreenUpdate");
-               pi.full_repaint = false;
                if (pain.isNull()) {
                        pi.full_repaint = true;
                        tm.draw(pi, 0, y);