]> git.lyx.org Git - features.git/blobdiff - src/frontends/qt/GuiWorkArea.cpp
Fix bad caret position with horizontal scrolling
[features.git] / src / frontends / qt / GuiWorkArea.cpp
index 6a7c995da9b3ab4859134d4b399403714f85e598..e2772fbb60686218d4eb855771583c8e66aa43a9 100644 (file)
@@ -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());