diff --git a/src/BufferView.cpp b/src/BufferView.cpp index 1daee5c720..9708a08aeb 100644 --- a/src/BufferView.cpp +++ b/src/BufferView.cpp @@ -2914,15 +2914,26 @@ int BufferView::horizScrollOffset() const } -CursorSlice const & BufferView::currentRowSlice() const +int BufferView::horizScrollOffset(Text const * text, + pit_type pit, pos_type pos) const { - return d->current_row_slice_; + // 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 31b6e94fc4..f57801f6a3 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; + // 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; - // 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 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 e69ffe9c22..80ee0aac7f 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(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(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) {