From ae28432e623d55fd495f0f456045c2509f1c8383 Mon Sep 17 00:00:00 2001 From: zuu Date: Mon, 10 Sep 2012 18:40:54 +0000 Subject: [PATCH] (svn r24518) -Codechange [FS#5203]: Refactor arrow key text edit movement code (sbr) --- src/textbuf.cpp | 70 +++++++++++++++++++++++++++++++++++++--------- src/textbuf_type.h | 7 +++++ 2 files changed, 64 insertions(+), 13 deletions(-) diff --git a/src/textbuf.cpp b/src/textbuf.cpp index a7e1d83d8f..90fd76266b 100644 --- a/src/textbuf.cpp +++ b/src/textbuf.cpp @@ -151,6 +151,59 @@ bool Textbuf::InsertClipboard() return true; } +/** + * Checks if it is possible to move carret to the left + * @return true if the caret can be moved to the left, otherwise false. + */ +bool Textbuf::CanMoveCaretLeft() +{ + return this->caretpos != 0; +} + +/** + * Moves the caret to the left. + * @pre Ensure that Textbuf::CanMoveCaretLeft returns true + * @return The character under the caret. + */ +WChar Textbuf::MoveCaretLeft() +{ + assert(this->CanMoveCaretLeft()); + + WChar c; + const char *s = Utf8PrevChar(this->buf + this->caretpos); + Utf8Decode(&c, s); + this->caretpos = s - this->buf; + this->caretxoffs -= GetCharacterWidth(FS_NORMAL, c); + + return c; +} + +/** + * Checks if it is possible to move carret to the right + * @return true if the caret can be moved to the right, otherwise false. + */ +bool Textbuf::CanMoveCaretRight() +{ + return this->caretpos < this->bytes - 1; +} + +/** + * Moves the caret to the right. + * @pre Ensure that Textbuf::CanMoveCaretRight returns true + * @return The character under the caret. + */ +WChar Textbuf::MoveCaretRight() +{ + assert(this->CanMoveCaretRight()); + + WChar c; + this->caretpos += (uint16)Utf8Decode(&c, this->buf + this->caretpos); + this->caretxoffs += GetCharacterWidth(FS_NORMAL, c); + + Utf8Decode(&c, this->buf + this->caretpos); + return c; +} + /** * Handle text navigation with arrow keys left/right. * This defines where the caret will blink and the next characer interaction will occur @@ -161,24 +214,15 @@ bool Textbuf::MovePos(int navmode) { switch (navmode) { case WKC_LEFT: - if (this->caretpos != 0) { - WChar c; - const char *s = Utf8PrevChar(this->buf + this->caretpos); - Utf8Decode(&c, s); - this->caretpos = s - this->buf; // -= (this->buf + this->caretpos - s) - this->caretxoffs -= GetCharacterWidth(FS_NORMAL, c); - + if (this->CanMoveCaretLeft()) { + this->MoveCaretLeft(); return true; } break; case WKC_RIGHT: - if (this->caretpos < this->bytes - 1) { - WChar c; - - this->caretpos += (uint16)Utf8Decode(&c, this->buf + this->caretpos); - this->caretxoffs += GetCharacterWidth(FS_NORMAL, c); - + if (this->CanMoveCaretRight()) { + this->MoveCaretRight(); return true; } break; diff --git a/src/textbuf_type.h b/src/textbuf_type.h index 0c4208f530..194c241ad6 100644 --- a/src/textbuf_type.h +++ b/src/textbuf_type.h @@ -12,6 +12,8 @@ #ifndef TEXTBUF_TYPE_H #define TEXTBUF_TYPE_H +#include "string_type.h" + /** Helper/buffer for input fields. */ struct Textbuf { char *buf; ///< buffer in which text is saved @@ -38,6 +40,11 @@ struct Textbuf { private: void DelChar(bool backspace); + bool CanMoveCaretLeft(); + WChar MoveCaretLeft(); + bool CanMoveCaretRight(); + WChar MoveCaretRight(); + }; #endif /* TEXTBUF_TYPE_H */