}
-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();
}
// 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();
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();
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
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) {