summaryrefslogtreecommitdiff
path: root/src/plugins/fakevim/fakevimhandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/fakevim/fakevimhandler.cpp')
-rw-r--r--src/plugins/fakevim/fakevimhandler.cpp38
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)