Changeset - r19590:12a532bc8627
[Not reviewed]
master
0 3 0
zuu - 12 years ago 2012-09-10 18:47:13
zuu@openttd.org
(svn r24521) -Feature [FS#5203]: Ctrl + Backspace/Delete to remove characters up to next word beginning in text edit boxes
3 files changed with 54 insertions and 0 deletions:
0 comments (0 inline, 0 general)
src/misc_gui.cpp
Show inline comments
 
@@ -740,6 +740,7 @@ HandleEditBoxResult QueryString::HandleE
 
			break;
 

	
 
		case WKC_BACKSPACE: case WKC_DELETE:
 
		case WKC_CTRL | WKC_BACKSPACE: case WKC_CTRL | WKC_DELETE:
 
			if (this->text.DeleteChar(keycode)) w->SetWidgetDirty(wid);
 
			break;
 

	
src/textbuf.cpp
Show inline comments
 
@@ -39,6 +39,29 @@ bool Textbuf::CanDelChar(bool backspace)
 
}
 

	
 
/**
 
 * Get the next character that will be removed by DelChar.
 
 * @param backspace if set, delete the character before the caret,
 
 * otherwise, delete the character after it.
 
 * @return the next character that will be removed by DelChar.
 
 * @warning You should ensure Textbuf::CanDelChar returns true before calling this function.
 
 */
 
WChar Textbuf::GetNextDelChar(bool backspace)
 
{
 
	assert(this->CanDelChar(backspace));
 

	
 
	const char *s;
 
	if (backspace) {
 
		s = Utf8PrevChar(this->buf + this->caretpos);
 
	} else {
 
		s = this->buf + this->caretpos;
 
	}
 

	
 
	WChar c;
 
	Utf8Decode(&c, s);
 
	return c;
 
}
 

	
 
/**
 
 * Delete a character at the caret position in a text buf.
 
 * @param backspace if set, delete the character before the caret,
 
 * else delete the character after it.
 
@@ -85,6 +108,35 @@ bool Textbuf::DeleteChar(int delmode)
 
		return false;
 
	}
 

	
 
	if (delmode == (WKC_CTRL | WKC_BACKSPACE) || delmode == (WKC_CTRL | WKC_DELETE)) {
 
		bool backspace = delmode == (WKC_CTRL | WKC_BACKSPACE);
 

	
 
		if (!CanDelChar(backspace)) return false;
 

	
 
		/* Unconditionally delete one char to the left. */
 
		this->DelChar(backspace);
 
		if (!CanDelChar(backspace)) return false;
 
		WChar c = this->GetNextDelChar(backspace);
 

	
 
		/* Backspace: Delete left whitespaces.
 
		 * Delete:    Delete right word.
 
		 */
 
		while (backspace ? IsWhitespace(c) : !IsWhitespace(c)) {
 
			this->DelChar(backspace);
 
			if (!this->CanDelChar(backspace)) return true;
 
			c = this->GetNextDelChar(backspace);
 
		}
 
		/* Backspace: Delete left word.
 
		 * Delete:    Delete right whitespaces.
 
		 */
 
		while (backspace ? !IsWhitespace(c) : IsWhitespace(c)) {
 
			this->DelChar(backspace);
 
			if (!this->CanDelChar(backspace)) return true;
 
			c = this->GetNextDelChar(backspace);
 
		}
 
		return true;
 
	}
 

	
 
	return false;
 
}
 

	
src/textbuf_type.h
Show inline comments
 
@@ -40,6 +40,7 @@ struct Textbuf {
 

	
 
private:
 
	bool CanDelChar(bool backspace);
 
	WChar GetNextDelChar(bool backspace);
 
	void DelChar(bool backspace);
 
	bool CanMoveCaretLeft();
 
	WChar MoveCaretLeft();
0 comments (0 inline, 0 general)