OpenTTD Source 20241224-master-gf74b0cf984
|
Helper/buffer for input fields. More...
#include <textbuf_type.h>
Public Member Functions | |
Textbuf (uint16_t max_bytes, uint16_t max_chars=UINT16_MAX) | |
Initialize the textbuffer by supplying it the buffer to write into and the maximum length of this buffer. | |
void | Assign (StringID string) |
Render a string into the textbuffer. | |
void | Assign (const std::string_view text) |
Copy a string into the textbuffer. | |
void | DeleteAll () |
Delete every character in the textbuffer. | |
bool | InsertClipboard () |
Insert a chunk of text from the clipboard onto the textbuffer. | |
bool | InsertChar (char32_t key) |
Insert a character to a textbuffer. | |
bool | InsertString (const char *str, bool marked, const char *caret=nullptr, const char *insert_location=nullptr, const char *replacement_end=nullptr) |
Insert a string into the text buffer. | |
bool | DeleteChar (uint16_t keycode) |
Delete a character from a textbuffer, either with 'Delete' or 'Backspace' The character is delete from the position the caret is at. | |
bool | MovePos (uint16_t keycode) |
Handle text navigation with arrow keys left/right. | |
HandleKeyPressResult | HandleKeyPress (char32_t key, uint16_t keycode) |
bool | HandleCaret () |
Handle the flashing of the caret. | |
void | UpdateSize () |
Update Textbuf type with its actual physical character and screenlength Get the count of characters in the string as well as the width in pixels. | |
void | DiscardMarkedText (bool update=true) |
Discard any marked text. | |
const char * | GetText () const |
Get the current text. | |
Data Fields | |
CharSetFilter | afilter |
Allowed characters. | |
char *const | buf |
buffer in which text is saved | |
uint16_t | max_bytes |
the maximum size of the buffer in bytes (including terminating '\0') | |
uint16_t | max_chars |
the maximum size of the buffer in characters (including terminating '\0') | |
uint16_t | bytes |
the current size of the string in bytes (including terminating '\0') | |
uint16_t | chars |
the current size of the string in characters (including terminating '\0') | |
uint16_t | pixels |
the current size of the string in pixels | |
bool | caret |
is the caret ("_") visible or not | |
uint16_t | caretpos |
the current position of the caret in the buffer, in bytes | |
uint16_t | caretxoffs |
the current position of the caret in pixels | |
uint16_t | markpos |
the start position of the marked area in the buffer, in bytes | |
uint16_t | markend |
the end position of the marked area in the buffer, in bytes | |
uint16_t | markxoffs |
the start position of the marked area in pixels | |
uint16_t | marklength |
the length of the marked area in pixels | |
Private Member Functions | |
bool | CanDelChar (bool backspace) |
Checks if it is possible to delete a character. | |
bool | MovePrev (StringIterator::IterType what) |
Move to previous character position. | |
bool | MoveNext (StringIterator::IterType what) |
Move to next character position. | |
void | DeleteText (uint16_t from, uint16_t to, bool update) |
Delete a part of the text. | |
void | UpdateStringIter () |
Update the character iter after the text has changed. | |
void | UpdateWidth () |
Update pixel width of the text. | |
void | UpdateCaretPosition () |
Update pixel position of the caret. | |
void | UpdateMarkedText () |
Update pixel positions of the marked text area. | |
Private Attributes | |
std::unique_ptr< StringIterator > | char_iter |
Helper/buffer for input fields.
Definition at line 30 of file textbuf_type.h.
|
explicit |
Initialize the textbuffer by supplying it the buffer to write into and the maximum length of this buffer.
max_bytes | maximum size in bytes, including terminating '\0' |
max_chars | maximum size in chars, including terminating '\0' |
Definition at line 409 of file textbuf.cpp.
References afilter, caret, CS_ALPHANUMERAL, DeleteAll(), max_bytes, and max_chars.
Textbuf::~Textbuf | ( | ) |
Definition at line 422 of file textbuf.cpp.
void Textbuf::Assign | ( | const std::string_view | text | ) |
Copy a string into the textbuffer.
text | Source. |
Definition at line 440 of file textbuf.cpp.
References buf, bytes, max_bytes, max_chars, StrMakeValidInPlace(), SVS_NONE, UpdateSize(), Utf8PrevChar(), and Utf8StringLength().
void Textbuf::Assign | ( | StringID | string | ) |
Render a string into the textbuffer.
string | String |
Definition at line 431 of file textbuf.cpp.
References Assign(), and GetString().
Referenced by Assign(), SaveLoadWindow::GenerateFileName(), IConsoleHistoryNavigate(), SaveLoadWindow::OnClick(), SavePresetWindow::OnClick(), OskWindow::OnClick(), SavePresetWindow::SavePresetWindow(), and ScriptDebugWindow::ScriptDebugWindow().
|
private |
Checks if it is possible to delete a character.
backspace | if set, delete the character before the caret, otherwise, delete the character after it. |
Definition at line 40 of file textbuf.cpp.
References bytes, and caretpos.
Referenced by DeleteChar().
void Textbuf::DeleteAll | ( | ) |
Delete every character in the textbuffer.
Definition at line 114 of file textbuf.cpp.
References buf, bytes, caretpos, caretxoffs, chars, markend, marklength, markpos, markxoffs, max_bytes, pixels, and UpdateStringIter().
Referenced by Window::HandleEditBoxKey(), IConsoleHistoryNavigate(), QueryStringWindow::OnClick(), and Textbuf().
bool Textbuf::DeleteChar | ( | uint16_t | keycode | ) |
Delete a character from a textbuffer, either with 'Delete' or 'Backspace' The character is delete from the position the caret is at.
keycode | Type of deletion, either WKC_BACKSPACE or WKC_DELETE |
Definition at line 51 of file textbuf.cpp.
References buf, bytes, CanDelChar(), caretpos, chars, StringIterator::ITER_CHARACTER, StringIterator::ITER_WORD, UpdateCaretPosition(), UpdateMarkedText(), UpdateStringIter(), UpdateWidth(), Utf8Decode(), and Utf8PrevChar().
Referenced by OskWindow::OnClick().
|
private |
Delete a part of the text.
from | Start of the text to delete. |
to | End of the text to delete. |
update | Set to true if the internal state should be updated. |
Definition at line 237 of file textbuf.cpp.
References buf, bytes, caretpos, chars, markend, markpos, UpdateCaretPosition(), UpdateMarkedText(), and UpdateStringIter().
Referenced by DiscardMarkedText(), and InsertString().
void Textbuf::DiscardMarkedText | ( | bool | update = true | ) |
Discard any marked text.
update | Set to true if the internal state should be updated. |
Definition at line 278 of file textbuf.cpp.
References DeleteText(), markend, marklength, markpos, and markxoffs.
Referenced by InsertString().
const char * Textbuf::GetText | ( | ) | const |
Get the current text.
Definition at line 290 of file textbuf.cpp.
References buf.
bool Textbuf::HandleCaret | ( | ) |
Handle the flashing of the caret.
Definition at line 489 of file textbuf.cpp.
References caret.
Referenced by IConsoleWindow::OnMouseLoop().
HandleKeyPressResult Textbuf::HandleKeyPress | ( | char32_t | key, |
uint16_t | keycode | ||
) |
Definition at line 501 of file textbuf.cpp.
bool Textbuf::InsertChar | ( | char32_t | key | ) |
Insert a character to a textbuffer.
If maxwidth of the Textbuf is zero, we don't care about the visual-length but only about the physical length of the string
key | Character to be inserted |
Definition at line 130 of file textbuf.cpp.
References buf, bytes, caretpos, chars, max_bytes, max_chars, UpdateCaretPosition(), UpdateMarkedText(), UpdateStringIter(), UpdateWidth(), Utf8CharLen(), and Utf8Encode().
Referenced by OskWindow::OnClick().
bool Textbuf::InsertClipboard | ( | ) |
Insert a chunk of text from the clipboard onto the textbuffer.
Get TEXT clipboard and append this up to the maximum length (either absolute or screenlength). If maxlength is zero, we don't care about the screenlength but only about the physical length of the string
Definition at line 223 of file textbuf.cpp.
References GetClipboardContents(), and InsertString().
bool Textbuf::InsertString | ( | const char * | str, |
bool | marked, | ||
const char * | caret = nullptr , |
||
const char * | insert_location = nullptr , |
||
const char * | replacement_end = nullptr |
||
) |
Insert a string into the text buffer.
If maxwidth of the Textbuf is zero, we don't care about the visual-length but only about the physical length of the string.
str | String to insert. |
marked | Replace the currently marked text with the new text. |
caret | Move the caret to this point in the insertion string. |
insert_location | Position at which to insert the string. |
replacement_end | Replace all characters from #insert_location up to this location with the new string. |
Definition at line 160 of file textbuf.cpp.
References afilter, buf, bytes, caret, caretpos, chars, DeleteText(), DiscardMarkedText(), IsValidChar(), markend, marklength, markpos, max_bytes, max_chars, UpdateCaretPosition(), UpdateMarkedText(), UpdateStringIter(), UpdateWidth(), and Utf8CharLen().
Referenced by InsertClipboard(), Window::InsertTextString(), and IConsoleWindow::InsertTextString().
|
private |
Move to next character position.
what | Move ITER_CHARACTER or ITER_WORD. |
Definition at line 351 of file textbuf.cpp.
References bytes, caretpos, StringIterator::END, and UpdateCaretPosition().
Referenced by MovePos().
bool Textbuf::MovePos | ( | uint16_t | keycode | ) |
Handle text navigation with arrow keys left/right.
This defines where the caret will blink and the next character interaction will occur
keycode | Direction in which navigation occurs (WKC_CTRL |) WKC_LEFT, (WKC_CTRL |) WKC_RIGHT, WKC_END, WKC_HOME |
Definition at line 369 of file textbuf.cpp.
References _current_text_dir, bytes, caretpos, StringIterator::ITER_CHARACTER, StringIterator::ITER_WORD, MoveNext(), MovePrev(), TD_LTR, and UpdateCaretPosition().
Referenced by OskWindow::OnClick().
|
private |
Move to previous character position.
what | Move ITER_CHARACTER or ITER_WORD. |
Definition at line 334 of file textbuf.cpp.
References caretpos, StringIterator::END, and UpdateCaretPosition().
Referenced by MovePos().
|
private |
Update pixel position of the caret.
Definition at line 310 of file textbuf.cpp.
References _current_text_dir, buf, caretpos, caretxoffs, FS_NORMAL, GetCharPosInString(), and TD_LTR.
Referenced by DeleteChar(), DeleteText(), InsertChar(), InsertString(), MoveNext(), MovePos(), MovePrev(), and UpdateSize().
|
private |
Update pixel positions of the marked text area.
Definition at line 317 of file textbuf.cpp.
References buf, FS_NORMAL, GetCharPosInString(), markend, marklength, markpos, and markxoffs.
Referenced by DeleteChar(), DeleteText(), InsertChar(), InsertString(), and UpdateSize().
void Textbuf::UpdateSize | ( | ) |
Update Textbuf type with its actual physical character and screenlength Get the count of characters in the string as well as the width in pixels.
Useful when copying in a larger amount of text at once
Definition at line 463 of file textbuf.cpp.
References buf, bytes, caretpos, chars, max_bytes, max_chars, UpdateCaretPosition(), UpdateMarkedText(), UpdateStringIter(), UpdateWidth(), and Utf8CharLen().
Referenced by Assign(), and Window::UpdateQueryStringSize().
|
private |
Update the character iter after the text has changed.
Definition at line 296 of file textbuf.cpp.
References buf, caretpos, and StringIterator::END.
Referenced by DeleteAll(), DeleteChar(), DeleteText(), InsertChar(), InsertString(), and UpdateSize().
|
private |
Update pixel width of the text.
Definition at line 304 of file textbuf.cpp.
References buf, FS_NORMAL, GetStringBoundingBox(), and pixels.
Referenced by DeleteChar(), InsertChar(), InsertString(), and UpdateSize().
CharSetFilter Textbuf::afilter |
Allowed characters.
Definition at line 31 of file textbuf_type.h.
Referenced by InsertString(), OskWindow::OnClick(), Textbuf(), and OskWindow::UpdateOskState().
char* const Textbuf::buf |
buffer in which text is saved
Definition at line 32 of file textbuf_type.h.
Referenced by Assign(), NetworkGameWindow::BuildGUINetworkGameList(), DeleteAll(), DeleteChar(), DeleteText(), QueryString::GetBoundingRect(), QueryString::GetCharAtPosition(), GetText(), IConsoleWindow::GetTextBoundingRect(), IConsoleWindow::GetTextCharacterAtPosition(), InsertChar(), InsertString(), NetworkChatWindow::OnClick(), SavePresetWindow::OnClick(), SignWindow::OnClick(), BuildVehicleWindow::OnEditboxChanged(), SaveLoadWindow::OnEditboxChanged(), IndustryDirectoryWindow::OnEditboxChanged(), NetworkContentListWindow::OnEditboxChanged(), NetworkGameWindow::OnEditboxChanged(), PickerWindow::OnEditboxChanged(), ScriptDebugWindow::OnEditboxChanged(), GameSettingsWindow::OnEditboxChanged(), TownDirectoryWindow::OnEditboxChanged(), NewGRFWindow::OnEditboxChanged(), SignListWindow::OnEditboxChanged(), IConsoleWindow::OnKeyPress(), IConsoleWindow::OnPaint(), SaveLoadWindow::OnTimeout(), NetworkContentListWindow::OpenExternalSearch(), UpdateCaretPosition(), UpdateMarkedText(), UpdateOSKOriginalText(), UpdateSize(), UpdateStringIter(), and UpdateWidth().
uint16_t Textbuf::bytes |
the current size of the string in bytes (including terminating '\0')
Definition at line 35 of file textbuf_type.h.
Referenced by Assign(), CanDelChar(), DeleteAll(), DeleteChar(), DeleteText(), Window::HandleEditBoxKey(), InsertChar(), InsertString(), MoveNext(), MovePos(), and UpdateSize().
bool Textbuf::caret |
is the caret ("_") visible or not
Definition at line 38 of file textbuf_type.h.
Referenced by HandleCaret(), InsertString(), IConsoleWindow::OnPaint(), and Textbuf().
uint16_t Textbuf::caretpos |
the current position of the caret in the buffer, in bytes
Definition at line 39 of file textbuf_type.h.
Referenced by CanDelChar(), DeleteAll(), DeleteChar(), DeleteText(), InsertChar(), InsertString(), MoveNext(), MovePos(), MovePrev(), UpdateCaretPosition(), UpdateSize(), and UpdateStringIter().
uint16_t Textbuf::caretxoffs |
the current position of the caret in pixels
Definition at line 40 of file textbuf_type.h.
Referenced by DeleteAll(), IConsoleWindow::GetCaretPosition(), QueryString::GetCaretPosition(), IConsoleWindow::OnPaint(), ScrollEditBoxTextRect(), and UpdateCaretPosition().
|
private |
Definition at line 71 of file textbuf_type.h.
uint16_t Textbuf::chars |
the current size of the string in characters (including terminating '\0')
Definition at line 36 of file textbuf_type.h.
Referenced by DeleteAll(), DeleteChar(), DeleteText(), InsertChar(), InsertString(), and UpdateSize().
uint16_t Textbuf::markend |
the end position of the marked area in the buffer, in bytes
Definition at line 42 of file textbuf_type.h.
Referenced by DeleteAll(), DeleteText(), DiscardMarkedText(), InsertString(), and UpdateMarkedText().
uint16_t Textbuf::marklength |
the length of the marked area in pixels
Definition at line 44 of file textbuf_type.h.
Referenced by DeleteAll(), DiscardMarkedText(), InsertString(), IConsoleWindow::OnPaint(), and UpdateMarkedText().
uint16_t Textbuf::markpos |
the start position of the marked area in the buffer, in bytes
Definition at line 41 of file textbuf_type.h.
Referenced by DeleteAll(), DeleteText(), DiscardMarkedText(), InsertString(), and UpdateMarkedText().
uint16_t Textbuf::markxoffs |
the start position of the marked area in pixels
Definition at line 43 of file textbuf_type.h.
Referenced by DeleteAll(), DiscardMarkedText(), IConsoleWindow::OnPaint(), and UpdateMarkedText().
uint16_t Textbuf::max_bytes |
the maximum size of the buffer in bytes (including terminating '\0')
Definition at line 33 of file textbuf_type.h.
Referenced by Assign(), DeleteAll(), InsertChar(), InsertString(), Textbuf(), and UpdateSize().
uint16_t Textbuf::max_chars |
the maximum size of the buffer in characters (including terminating '\0')
Definition at line 34 of file textbuf_type.h.
Referenced by Assign(), InsertChar(), InsertString(), Textbuf(), and UpdateSize().
uint16_t Textbuf::pixels |
the current size of the string in pixels
Definition at line 37 of file textbuf_type.h.
Referenced by DeleteAll(), IConsoleWindow::GetCaretPosition(), IConsoleWindow::GetTextBoundingRect(), IConsoleWindow::GetTextCharacterAtPosition(), IConsoleWindow::OnPaint(), ScrollEditBoxTextRect(), and UpdateWidth().