]> git.lyx.org Git - lyx.git/commitdiff
Fix bad caret position with horizontal scrolling
authorJean-Marc Lasgouttes <lasgouttes@lyx.org>
Mon, 7 Oct 2019 10:31:20 +0000 (12:31 +0200)
committerJean-Marc Lasgouttes <lasgouttes@lyx.org>
Wed, 16 Oct 2019 14:44:42 +0000 (16:44 +0200)
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 bdf58b77e7bebce6e9554151a909a5ee62be439f)

src/frontends/qt4/GuiWorkArea.cpp
status.23x

index fee3c331a1d92aa3081294e1746588b3fab97731..5ef177dc37fb12bb8f5685f1459d015d90a3ebc1 100644 (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());
 
index 9c1906d9933d16625db3f70cb0f70ce48c739fb9..160126d34a8d25a71430382908ab042e599d9de4 100644 (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