From 8ca5ab3f25fa57c5bd6991eb8c54da80e015d3a3 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Tue, 10 May 2022 12:01:46 +0300 Subject: [PATCH] Support whole-word caret movement in ui::edit --- libs/ui/source/edit.cpp | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/libs/ui/source/edit.cpp b/libs/ui/source/edit.cpp index 4a00c769..56bee447 100644 --- a/libs/ui/source/edit.cpp +++ b/libs/ui/source/edit.cpp @@ -196,19 +196,41 @@ namespace psemek::ui { if (e.key == SDLK_LEFT) { - if (caret_ > 0) + if (ctrl_down_) { - --caret_; + std::size_t start = caret_; + while (start > 0 && std::isspace(text_[start - 1])) --start; + while (start > 0 && !std::isspace(text_[start - 1])) --start; + caret_ = start; reset_caret(); } + else + { + if (caret_ > 0) + { + --caret_; + reset_caret(); + } + } } else if (e.key == SDLK_RIGHT) { - if (caret_ < text_.size()) + if (ctrl_down_) { - ++caret_; + std::size_t end = caret_; + while (end < text_.size() && !std::isspace(text_[end])) ++end; + while (end < text_.size() && std::isspace(text_[end])) ++end; + caret_ = end; reset_caret(); } + else + { + if (caret_ < text_.size()) + { + ++caret_; + reset_caret(); + } + } } else if (e.key == SDLK_HOME) {