MoveRight fixes. Fixed moving through tabs and words.
diff --git a/TextEditor.cpp b/TextEditor.cpp index 5ab356b..6953027 100644 --- a/TextEditor.cpp +++ b/TextEditor.cpp
@@ -482,10 +482,11 @@ cindex = 0; ++at.mLine; skip = false; + isword = false; } } - return Coordinates(std::max(0, (int)mLines.size() - 1), 0); + return at; } int TextEditor::GetCharacterIndex(const Coordinates& aCoordinates) const @@ -1622,23 +1623,29 @@ { auto oldPos = mState.mCursorPosition; - if (mLines.empty()) + if (mLines.empty() || oldPos.mLine >= mLines.size()) return; + auto cindex = GetCharacterIndex(mState.mCursorPosition); while (aAmount-- > 0) { - auto chars = GetLineMaxColumn(mState.mCursorPosition.mLine); - if (mState.mCursorPosition.mColumn >= chars) + auto lindex = mState.mCursorPosition.mLine; + auto& line = mLines[lindex]; + + if (cindex >= line.size()) { if (mState.mCursorPosition.mLine < mLines.size() - 1) { mState.mCursorPosition.mLine = std::max(0, std::min((int)mLines.size() - 1, mState.mCursorPosition.mLine + 1)); mState.mCursorPosition.mColumn = 0; } + else + return; } else { - mState.mCursorPosition.mColumn = std::max(0, std::min(chars, mState.mCursorPosition.mColumn + 1)); + cindex += UTF8CharLength(line[cindex].mChar); + mState.mCursorPosition = Coordinates(lindex, GetCharacterColumn(lindex, cindex)); if (aWordMode) mState.mCursorPosition = FindNextWord(mState.mCursorPosition); }