summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzuu <zuu@openttd.org>2012-09-10 18:40:54 +0000
committerzuu <zuu@openttd.org>2012-09-10 18:40:54 +0000
commitae28432e623d55fd495f0f456045c2509f1c8383 (patch)
tree728995bea9ca75caae04d0f89df95e5e176d9fc7
parent0e9dbe6bb6e47e37c6ac7b8aa2f62aacc8e946d1 (diff)
downloadopenttd-ae28432e623d55fd495f0f456045c2509f1c8383.tar.xz
(svn r24518) -Codechange [FS#5203]: Refactor arrow key text edit movement code (sbr)
-rw-r--r--src/textbuf.cpp70
-rw-r--r--src/textbuf_type.h7
2 files changed, 64 insertions, 13 deletions
diff --git a/src/textbuf.cpp b/src/textbuf.cpp
index a7e1d83d8..90fd76266 100644
--- a/src/textbuf.cpp
+++ b/src/textbuf.cpp
@@ -152,6 +152,59 @@ bool Textbuf::InsertClipboard()
}
/**
+ * 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
* @param navmode Direction in which navigation occurs WKC_LEFT, WKC_RIGHT, WKC_END, WKC_HOME
@@ -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 0c4208f53..194c241ad 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 */