diff --git a/autotests/src/kateview_test.h b/autotests/src/kateview_test.h --- a/autotests/src/kateview_test.h +++ b/autotests/src/kateview_test.h @@ -41,6 +41,7 @@ void testSelection(); void testKillline(); + void testScrollPastEndOfDocument(); void testFoldFirstLine(); diff --git a/autotests/src/kateview_test.cpp b/autotests/src/kateview_test.cpp --- a/autotests/src/kateview_test.cpp +++ b/autotests/src/kateview_test.cpp @@ -291,6 +291,39 @@ QCOMPARE(doc.text(), QLatin1String("foo\nxxx\n")); } +void KateViewTest::testScrollPastEndOfDocument() +{ + KTextEditor::DocumentPrivate doc; + doc.setText(QStringLiteral("0000000000\n" + "1111111111\n" + "2222222222\n" + "3333333333\n" + "4444444444")); + QCOMPARE(doc.lines(), 5); + + KTextEditor::ViewPrivate *view = new KTextEditor::ViewPrivate(&doc, nullptr); + view->setCursorPosition({ 3, 5 }); + view->resize(400, 300); + view->show(); + + // enable "[x] Scroll past end of document" + view->config()->setScrollPastEnd(true); + QCOMPARE(view->config()->scrollPastEnd(), true); + + // disable dynamic word wrap + view->config()->setDynWordWrap(false); + QCOMPARE(view->config()->dynWordWrap(), false); + + view->scrollDown(); + view->scrollDown(); + view->scrollDown(); + // at this point, only lines 3333333333 and 4444444444 are visible. + view->down(); + QCOMPARE(view->cursorPosition(), KTextEditor::Cursor(4, 5)); + // verify, that only lines 3333333333 and 4444444444 are still visible. + QCOMPARE(view->firstDisplayedLineInternal(KTextEditor::View::RealLine), 3); +} + void KateViewTest::testFoldFirstLine() { QTemporaryFile file("XXXXXX.cpp"); diff --git a/src/view/kateviewinternal.cpp b/src/view/kateviewinternal.cpp --- a/src/view/kateviewinternal.cpp +++ b/src/view/kateviewinternal.cpp @@ -709,7 +709,7 @@ } else if (center && (c < startPos() || c > endPos())) { KTextEditor::Cursor scroll = viewLineOffset(c, -int(linesDisplayed()) / 2); scrollPos(scroll, false, calledExternally); - } else if (c > viewLineOffset(startPos(), linesDisplayed() - m_minLinesVisible - 1)) { + } else if (c.line() > viewLineOffset(startPos(), linesDisplayed() - m_minLinesVisible - 1).line()) { KTextEditor::Cursor scroll = viewLineOffset(c, -(linesDisplayed() - m_minLinesVisible - 1)); scrollPos(scroll, false, calledExternally); } else if (c < viewLineOffset(startPos(), m_minLinesVisible)) {