diff options
Diffstat (limited to 'src/plugins/fakevim/fakevimhandler.cpp')
-rw-r--r-- | src/plugins/fakevim/fakevimhandler.cpp | 38 |
1 files changed, 21 insertions, 17 deletions
diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp index d06d99cd53..59a65c0ac2 100644 --- a/src/plugins/fakevim/fakevimhandler.cpp +++ b/src/plugins/fakevim/fakevimhandler.cpp @@ -2056,22 +2056,23 @@ FakeVimHandler::Private::GlobalData FakeVimHandler::Private::g; FakeVimHandler::Private::Private(FakeVimHandler *parent, QWidget *widget) { - //static PythonHighlighterRules pythonRules; q = parent; m_textedit = qobject_cast<QTextEdit *>(widget); m_plaintextedit = qobject_cast<QPlainTextEdit *>(widget); + + init(); + if (editor()) { connect(EDITOR(document()), SIGNAL(contentsChange(int,int,int)), SLOT(onContentsChanged(int,int,int))); connect(EDITOR(document()), SIGNAL(undoCommandAdded()), SLOT(onUndoCommandAdded())); m_lastRevision = revision(); } - //new Highlighter(document(), &pythonRules); - init(); } void FakeVimHandler::Private::init() { + m_inFakeVim = false; m_findStartPosition = -1; m_visualBlockInsert = false; m_fakeEnd = false; @@ -2315,10 +2316,6 @@ void FakeVimHandler::Private::setupWidget() enterFakeVim(); resetCommandMode(); - if (m_textedit) - m_textedit->setLineWrapMode(QTextEdit::NoWrap); - else if (m_plaintextedit) - m_plaintextedit->setLineWrapMode(QPlainTextEdit::NoWrap); m_wasReadOnly = EDITOR(isReadOnly()); updateEditor(); @@ -6471,19 +6468,22 @@ int FakeVimHandler::Private::linesInDocument() const void FakeVimHandler::Private::scrollToLine(int line) { - const QTextCursor tc = EDITOR(textCursor()); - // Don't scroll if the line is already at the top. updateFirstVisibleLine(); if (line == m_firstVisibleLine) return; + const QTextCursor tc = m_cursor; + QTextCursor tc2 = tc; tc2.setPosition(document()->lastBlock().position()); EDITOR(setTextCursor(tc2)); 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(ensureCursorVisible()); @@ -6497,7 +6497,7 @@ void FakeVimHandler::Private::scrollToLine(int line) void FakeVimHandler::Private::updateFirstVisibleLine() { const QTextCursor tc = EDITOR(cursorForPosition(QPoint(0,0))); - m_firstVisibleLine = tc.block().firstLineNumber(); + m_firstVisibleLine = lineForPosition(tc.position()) - 1; } int FakeVimHandler::Private::firstVisibleLine() const @@ -6507,9 +6507,9 @@ int FakeVimHandler::Private::firstVisibleLine() const int FakeVimHandler::Private::lastVisibleLine() const { - const QTextBlock block = - document()->findBlockByLineNumber(m_firstVisibleLine + linesOnScreen()); - return block.isValid() ? block.firstLineNumber() : document()->lastBlock().firstLineNumber(); + const int line = m_firstVisibleLine + linesOnScreen(); + const QTextBlock block = document()->findBlockByLineNumber(line); + return block.isValid() ? line : document()->lastBlock().firstLineNumber(); } int FakeVimHandler::Private::lineOnTop(int count) const @@ -6538,7 +6538,7 @@ void FakeVimHandler::Private::updateScrollOffset() if (line < lineOnTop()) scrollToLine(qMax(0, line - windowScrollOffset())); else if (line > lineOnBottom()) - scrollToLine(line - linesOnScreen() + windowScrollOffset() + 1); + scrollToLine(firstVisibleLine() + line - lineOnBottom()); } void FakeVimHandler::Private::alignViewportToCursor(AlignmentFlag align, int line, @@ -7156,8 +7156,12 @@ int FakeVimHandler::Private::lastPositionInLine(int line, bool onlyVisibleLines) int FakeVimHandler::Private::lineForPosition(int pos) const { - QTextBlock block = document()->findBlock(pos); - return lineNumber(block); + const QTextBlock block = document()->findBlock(pos); + 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) |