From dc7c4c37b61496327fa46da1eab2a61a33b8598e Mon Sep 17 00:00:00 2001 From: Yousef Khadadeh Date: Fri, 3 Oct 2025 07:52:25 +0300 Subject: [PATCH] Moving between words in text boxes works in browsers as well --- src/CollabTextBox/CollabTextBox.cpp | 35 ++++++++++++++++++----------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/src/CollabTextBox/CollabTextBox.cpp b/src/CollabTextBox/CollabTextBox.cpp index efa8ac1..e5e2ae5 100644 --- a/src/CollabTextBox/CollabTextBox.cpp +++ b/src/CollabTextBox/CollabTextBox.cpp @@ -411,7 +411,7 @@ TextPosition Editor::move(Movement move, TextPosition pos) const { { for(;;) { TextPosition prevCharPos = this->move(Movement::kLeft, pos); - if(prevCharPos != TextPosition{0, 0} && std::isspace(fLines[prevCharPos.fParagraphIndex].fText[prevCharPos.fTextByteIndex])) + if(prevCharPos != TextPosition{0, 0} && prevCharPos.fTextByteIndex != fLines[prevCharPos.fParagraphIndex].fText.size() && std::isspace(fLines[prevCharPos.fParagraphIndex].fText[prevCharPos.fTextByteIndex])) pos = prevCharPos; else break; @@ -422,25 +422,34 @@ TextPosition Editor::move(Movement move, TextPosition pos) const { break; } - const std::vector& words = fLines[pos.fParagraphIndex].fWordBoundaries; - assert(words.size() == fLines[pos.fParagraphIndex].fText.size()); - do { - --pos.fTextByteIndex; - } while (pos.fTextByteIndex > 0 && !words[pos.fTextByteIndex]); + for(;;) { + TextPosition prevCharPos = this->move(Movement::kLeft, pos); + const std::string& text = fLines[prevCharPos.fParagraphIndex].fText; + if(prevCharPos == TextPosition{0, 0}) { + pos = prevCharPos; + break; + } + else if(prevCharPos.fTextByteIndex != text.size() && !std::isspace(text[prevCharPos.fTextByteIndex])) + pos = prevCharPos; + else + break; + } } break; case Movement::kWordRight: { const std::string& text = fLines[pos.fParagraphIndex].fText; - if (pos.fTextByteIndex == text.size()) { + if(pos.fTextByteIndex == text.size()) pos = this->move(Movement::kRight, pos); - break; + else { + for(;;) { + const std::string& text = fLines[pos.fParagraphIndex].fText; + if(pos.fTextByteIndex != text.size() && !std::isspace(text[pos.fTextByteIndex])) + pos = this->move(Movement::kRight, pos); + else + break; + } } - const std::vector& words = fLines[pos.fParagraphIndex].fWordBoundaries; - assert(words.size() == text.size()); - do { - ++pos.fTextByteIndex; - } while (pos.fTextByteIndex < text.size() && !words[pos.fTextByteIndex]); for(;;) { const std::string& text = fLines[pos.fParagraphIndex].fText;