Changeset - r19587:45b138f61070
[Not reviewed]
master
0 2 0
zuu - 12 years ago 2012-09-10 18:40:54
zuu@openttd.org
(svn r24518) -Codechange [FS#5203]: Refactor arrow key text edit movement code (sbr)
2 files changed with 64 insertions and 13 deletions:
0 comments (0 inline, 0 general)
src/textbuf.cpp
Show inline comments
 
@@ -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;
src/textbuf_type.h
Show inline comments
 
@@ -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 */
0 comments (0 inline, 0 general)