[lyx-cvs] [LyX/master] Fix bad caret position with horizontal scrolling
Jean-Marc Lasgouttes
lasgouttes at lyx.org
Mon Oct 7 10:26:37 UTC 2019
commit bdf58b77e7bebce6e9554151a909a5ee62be439f
Author: Jean-Marc Lasgouttes <lasgouttes at lyx.org>
Date: Mon Oct 7 12:31:20 2019 +0200
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.
---
src/frontends/qt/GuiWorkArea.cpp | 35 +++++++++++++++++------------------
1 files changed, 17 insertions(+), 18 deletions(-)
diff --git a/src/frontends/qt/GuiWorkArea.cpp b/src/frontends/qt/GuiWorkArea.cpp
index 6a7c995..e2772fb 100644
--- a/src/frontends/qt/GuiWorkArea.cpp
+++ b/src/frontends/qt/GuiWorkArea.cpp
@@ -133,26 +133,30 @@ public:
x_(0), caret_width_(0)
{}
- void draw(QPainter & painter)
+ /* Draw he 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 + 1, bot);
+ painter.drawLine(x, bot, x - l + 1, bot);
else
- painter.drawLine(x_, bot, x_ + caret_width_ + r - 1, bot);
+ painter.drawLine(x, bot, x + caret_width_ + r - 1, 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);
}
}
}
@@ -633,11 +637,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);
}
@@ -1340,7 +1339,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());
More information about the lyx-cvs
mailing list