commit 96fee0ed7acdd9d757d59b126f07631176e2d96f
Author: Jean-Marc Lasgouttes <lasgout...@lyx.org>
Date:   Mon Feb 29 16:05:06 2016 +0100

    Move some horizontal scrolling code from TextMetrics to BufferView
    
    It is better to have all the code in the same place, and it will avoid code 
duplication later.

diff --git a/src/BufferView.cpp b/src/BufferView.cpp
index 1daee5c..9708a08 100644
--- a/src/BufferView.cpp
+++ b/src/BufferView.cpp
@@ -2914,15 +2914,26 @@ int BufferView::horizScrollOffset() const
 }
 
 
-CursorSlice const & BufferView::currentRowSlice() const
-{
-       return d->current_row_slice_;
+int BufferView::horizScrollOffset(Text const * text,
+                                  pit_type pit, pos_type pos) const
+{
+       // Is this a row that is currently scrolled?
+       if (!d->current_row_slice_.empty()
+           && &text->inset() == d->current_row_slice_.inset().asInsetText()
+           && pit ==  d->current_row_slice_.pit()
+           && pos ==  d->current_row_slice_.pos())
+               return d->horiz_scroll_offset_;
+       return 0;
 }
 
 
-CursorSlice const & BufferView::lastRowSlice() const
+bool BufferView::hadHorizScrollOffset(Text const * text,
+                                      pit_type pit, pos_type pos) const
 {
-       return d->last_row_slice_;
+       return !d->last_row_slice_.empty()
+              && &text->inset() == d->last_row_slice_.inset().asInsetText()
+              && pit ==  d->last_row_slice_.pit()
+              && pos ==  d->last_row_slice_.pos();
 }
 
 
diff --git a/src/BufferView.h b/src/BufferView.h
index 31b6e94..f57801f 100644
--- a/src/BufferView.h
+++ b/src/BufferView.h
@@ -125,12 +125,15 @@ public:
        // Returns the amount of horizontal scrolling applied to the
        // top-level row where the cursor lies
        int horizScrollOffset() const;
-
-       // Points to the top-level row where the cursor lies (during draw).
-       CursorSlice const & currentRowSlice() const;
-
-       // Points to the top-level row where the cursor lied at last draw event.
-       CursorSlice const & lastRowSlice() const;
+       // Returns the amount of horizontal scrolling applied to the
+       // row of text starting at (pit, pos)
+       int horizScrollOffset(Text const * text,
+                             pit_type pit, pos_type pos) const;
+
+       // Returns true if the row of text starting at (pit, pos) was scrolled
+       // at the last draw event.
+       bool hadHorizScrollOffset(Text const * text,
+                              pit_type pit, pos_type pos) const;
 
        /// reset the scrollbar to reflect current view position.
        void updateScrollbar();
diff --git a/src/TextMetrics.cpp b/src/TextMetrics.cpp
index e69ffe9..80ee0aa 100644
--- a/src/TextMetrics.cpp
+++ b/src/TextMetrics.cpp
@@ -1113,14 +1113,8 @@ pos_type TextMetrics::getPosNearX(Row const & row, int & 
x,
        int const xo = origin_.x_;
        x -= xo;
 
-       int offset = 0;
-       CursorSlice rowSlice(const_cast<InsetText &>(text_->inset()));
-       rowSlice.pit() = row.pit();
-       rowSlice.pos() = row.pos();
-
        // Adapt to cursor row scroll offset if applicable.
-       if (bv_->currentRowSlice() == rowSlice)
-               offset = bv_->horizScrollOffset();
+       int const offset = bv_->horizScrollOffset(text_, row.pit(), row.pos());
        x += offset;
 
        pos_type pos = row.pos();
@@ -1908,26 +1902,18 @@ void TextMetrics::drawParagraph(PainterInfo & pi, 
pit_type const pit, int const
        for (size_t i = 0; i != nrows; ++i) {
 
                Row const & row = pm.rows()[i];
-               int row_x = x;
+               // Adapt to cursor row scroll offset if applicable.
+               int row_x = x - bv_->horizScrollOffset(text_, pit, row.pos());
                if (i)
                        y += row.ascent();
 
-               CursorSlice rowSlice(const_cast<InsetText &>(text_->inset()));
-               rowSlice.pit() = pit;
-               rowSlice.pos() = row.pos();
+               RowPainter rp(pi, *text_, pit, row, row_x, y);
 
                bool const inside = (y + row.descent() >= 0
                        && y - row.ascent() < ww);
-
-               // Adapt to cursor row scroll offset if applicable.
-               if (bv_->currentRowSlice() == rowSlice)
-                       row_x -= bv_->horizScrollOffset();
-
                // It is not needed to draw on screen if we are not inside.
                pi.pain.setDrawingEnabled(inside && original_drawing_state);
 
-               RowPainter rp(pi, *text_, pit, row, row_x, y);
-
                if (selection)
                        row.setSelectionAndMargins(sel_beg_par, sel_end_par);
                else
@@ -1946,7 +1932,7 @@ void TextMetrics::drawParagraph(PainterInfo & pi, 
pit_type const pit, int const
                if (pi.pain.isDrawingEnabled())
                        row.setCrc(pm.computeRowSignature(row, bparams));
                bool row_has_changed = row.changed()
-                       || rowSlice == bv_->lastRowSlice();
+                       || bv_->hadHorizScrollOffset(text_, pit, row.pos());
 
                // Take this opportunity to spellcheck the row contents.
                if (row_has_changed && pi.do_spellcheck && 
lyxrc.spellcheck_continuously) {

Reply via email to