FakeVim: Scrolls correctly if text cursor moves on wrapped lines

Change-Id: I789fc822ad4f60d7e3a39f8231d7d0cb4a78bf70
Reviewed-by: hjk <hjk121@nokiamail.com>
This commit is contained in:
hluk
2013-10-16 18:53:45 +02:00
committed by hjk
parent ad7e12447c
commit 0dba50ee3d

View File

@@ -2316,10 +2316,6 @@ void FakeVimHandler::Private::setupWidget()
enterFakeVim(); enterFakeVim();
resetCommandMode(); resetCommandMode();
if (m_textedit)
m_textedit->setLineWrapMode(QTextEdit::NoWrap);
else if (m_plaintextedit)
m_plaintextedit->setLineWrapMode(QPlainTextEdit::NoWrap);
m_wasReadOnly = EDITOR(isReadOnly()); m_wasReadOnly = EDITOR(isReadOnly());
updateEditor(); updateEditor();
@@ -6471,19 +6467,22 @@ int FakeVimHandler::Private::linesInDocument() const
void FakeVimHandler::Private::scrollToLine(int line) void FakeVimHandler::Private::scrollToLine(int line)
{ {
const QTextCursor tc = EDITOR(textCursor());
// Don't scroll if the line is already at the top. // Don't scroll if the line is already at the top.
updateFirstVisibleLine(); updateFirstVisibleLine();
if (line == m_firstVisibleLine) if (line == m_firstVisibleLine)
return; return;
const QTextCursor tc = m_cursor;
QTextCursor tc2 = tc; QTextCursor tc2 = tc;
tc2.setPosition(document()->lastBlock().position()); tc2.setPosition(document()->lastBlock().position());
EDITOR(setTextCursor(tc2)); EDITOR(setTextCursor(tc2));
EDITOR(ensureCursorVisible()); EDITOR(ensureCursorVisible());
tc2.setPosition(document()->findBlockByLineNumber(line).position()); const QTextBlock block = document()->findBlockByLineNumber(line);
const QTextLine textLine = block.isValid()
? block.layout()->lineAt(line - block.firstLineNumber()) : QTextLine();
tc2.setPosition(block.position() + (textLine.isValid() ? textLine.textStart() : 0));
EDITOR(setTextCursor(tc2)); EDITOR(setTextCursor(tc2));
EDITOR(ensureCursorVisible()); EDITOR(ensureCursorVisible());
@@ -6497,7 +6496,7 @@ void FakeVimHandler::Private::scrollToLine(int line)
void FakeVimHandler::Private::updateFirstVisibleLine() void FakeVimHandler::Private::updateFirstVisibleLine()
{ {
const QTextCursor tc = EDITOR(cursorForPosition(QPoint(0,0))); const QTextCursor tc = EDITOR(cursorForPosition(QPoint(0,0)));
m_firstVisibleLine = tc.block().firstLineNumber(); m_firstVisibleLine = lineForPosition(tc.position()) - 1;
} }
int FakeVimHandler::Private::firstVisibleLine() const int FakeVimHandler::Private::firstVisibleLine() const
@@ -6507,9 +6506,9 @@ int FakeVimHandler::Private::firstVisibleLine() const
int FakeVimHandler::Private::lastVisibleLine() const int FakeVimHandler::Private::lastVisibleLine() const
{ {
const QTextBlock block = const int line = m_firstVisibleLine + linesOnScreen();
document()->findBlockByLineNumber(m_firstVisibleLine + linesOnScreen()); const QTextBlock block = document()->findBlockByLineNumber(line);
return block.isValid() ? block.firstLineNumber() : document()->lastBlock().firstLineNumber(); return block.isValid() ? line : document()->lastBlock().firstLineNumber();
} }
int FakeVimHandler::Private::lineOnTop(int count) const int FakeVimHandler::Private::lineOnTop(int count) const
@@ -6538,7 +6537,7 @@ void FakeVimHandler::Private::updateScrollOffset()
if (line < lineOnTop()) if (line < lineOnTop())
scrollToLine(qMax(0, line - windowScrollOffset())); scrollToLine(qMax(0, line - windowScrollOffset()));
else if (line > lineOnBottom()) else if (line > lineOnBottom())
scrollToLine(line - linesOnScreen() + windowScrollOffset() + 1); scrollToLine(firstVisibleLine() + line - lineOnBottom());
} }
void FakeVimHandler::Private::alignViewportToCursor(AlignmentFlag align, int line, void FakeVimHandler::Private::alignViewportToCursor(AlignmentFlag align, int line,
@@ -7156,8 +7155,12 @@ int FakeVimHandler::Private::lastPositionInLine(int line, bool onlyVisibleLines)
int FakeVimHandler::Private::lineForPosition(int pos) const int FakeVimHandler::Private::lineForPosition(int pos) const
{ {
QTextBlock block = document()->findBlock(pos); const QTextBlock block = document()->findBlock(pos);
return lineNumber(block); if (!block.isValid())
return 0;
const int positionInBlock = pos - block.position();
const int lineNumberInBlock = block.layout()->lineForTextPosition(positionInBlock).lineNumber();
return block.firstLineNumber() + lineNumberInBlock + 1;
} }
void FakeVimHandler::Private::toggleVisualMode(VisualMode visualMode) void FakeVimHandler::Private::toggleVisualMode(VisualMode visualMode)