Fix bad caret position with horizontal scrolling

Horizontal scrolling used to be taken into account when updating caret
geometry. This is wrong since it may have changed when time comes to
draw the caret. This leads to a situation where the first apparition
of the caret is at a wrong place.

Now the extra horizontal offset is used at drawing time.

Fixes bug #11603.

(cherry picked from commit bdf58b77e7)
This commit is contained in:
Jean-Marc Lasgouttes 2019-10-07 12:31:20 +02:00
parent fe426c2db8
commit 7c35081d0c
2 changed files with 19 additions and 18 deletions

View File

@ -133,26 +133,30 @@ public:
x_(0), caret_width_(0)
{}
void draw(QPainter & painter)
/* Draw the caret. Parameter \c horiz_offset is not 0 when there
* has been horizontal scrolling in current row
*/
void draw(QPainter & painter, int horiz_offset)
{
if (!rect_.isValid())
return;
int y = rect_.top();
int l = x_ - rect_.left();
int r = rect_.right() - x_;
int bot = rect_.bottom();
int const x = x_ - horiz_offset;
int const y = rect_.top();
int const l = x_ - rect_.left();
int const r = rect_.right() - x_;
int const bot = rect_.bottom();
// draw vertical line
painter.fillRect(x_, y, caret_width_, rect_.height(), color_);
painter.fillRect(x, y, caret_width_, rect_.height(), color_);
// draw RTL/LTR indication
painter.setPen(color_);
if (l_shape_) {
if (rtl_)
painter.drawLine(x_, bot, x_ - l, bot);
painter.drawLine(x, bot, x - l, bot);
else
painter.drawLine(x_, bot, x_ + caret_width_ + r, bot);
painter.drawLine(x, bot, x + caret_width_ + r, bot);
}
// draw completion triangle
@ -160,11 +164,11 @@ public:
int m = y + rect_.height() / 2;
int d = TabIndicatorWidth - 1;
if (rtl_) {
painter.drawLine(x_ - 1, m - d, x_ - 1 - d, m);
painter.drawLine(x_ - 1, m + d, x_ - 1 - d, m);
painter.drawLine(x - 1, m - d, x - 1 - d, m);
painter.drawLine(x - 1, m + d, x - 1 - d, m);
} else {
painter.drawLine(x_ + caret_width_, m - d, x_ + caret_width_ + d, m);
painter.drawLine(x_ + caret_width_, m + d, x_ + caret_width_ + d, m);
painter.drawLine(x + caret_width_, m - d, x + caret_width_ + d, m);
painter.drawLine(x + caret_width_, m + d, x + caret_width_ + d, m);
}
}
}
@ -621,11 +625,6 @@ void GuiWorkArea::Private::updateCaretGeometry()
&& !completer_->inlineVisible();
caret_visible_ = true;
//int cur_x = buffer_view_->getPos(cur).x_;
// We may have decided to slide the cursor row so that caret
// is visible.
point.x_ -= buffer_view_->horizScrollOffset();
caret_->update(point.x_, point.y_, h, l_shape, isrtl, completable);
}
@ -1293,7 +1292,7 @@ void GuiWorkArea::paintEvent(QPaintEvent * ev)
// and the caret
if (d->caret_visible_)
d->caret_->draw(pain);
d->caret_->draw(pain, d->buffer_view_->horizScrollOffset());
d->updateScreen(ev->rect());

View File

@ -146,6 +146,8 @@ What's new
- Enable dissolve in undefined Flex inset context menu (bug 8650).
- Fix bad caret position when row scrolls horizontally (bug 11603).
* INTERNALS