TextField

Represent a control where you can add/modify a text:

To create a textfield use TextField::new method (with 3 parameters: a caption, a layout and initialization flags).

let tx = TextField::new("some text", Layout::new("x:10,y:5,w:15"),textfield::Flags::None);

or the macro textfield!

let tx1 = textfield!("text='some text',x:10,y:5,w:15");
let tx2 = textfield!("some_text,x:10,y:5,w:15");

A textfield supports all common parameters (as they are described in Instantiate via Macros section). Besides them, the following named parameters are also accepted:

Parameter nameTypePositional parameterPurpose
text or captionStringYes (first postional parameter)The caption (text) from a text field. If ommited an empty string will be considered as the caption of the textfield.
flagsListNoTextField initialization flags that control how Enter is process, if the textfield is readonly, etc

A textfield supports the following initialization flags:

  • textfield::Type::Readonly or Readonly (for macro initialization) - thils will allow you to view or copy the text but not to modify it
  • textfield::Type::ProcessEnter or ProcessEnter (for macro initialization) - by default the Enter key is not processed by this control. However, if this flag is being used, Enter key is being captured and when pressed the TextFieldEvents::on_validate(...) method is being called.
  • textfield::Type::DisableAutoSelectOnFocus or DisableAutoSelectOnFocus (for macro initialization) - by default, a textfield will automatically select its content when it receives the focus. This behavior can be disabled by adding this flag to the initialization flags.

Some examples that uses these paramateres:

let no_auto_focus = textfield!("caption='no auto focus',x:10,y:5,w:15,flags:DisableAutoSelectOnFocus");
let read_only = textfield!("text='a read only text',x=9,y:1,align:center,w:9,flags: ReadOnly");
let expty_text = textfield!("x:1,y:1,w:10");

Events

To intercept events from a textfield, the following trait has to be implemented to the Window that processes the event loop:

pub trait TextFieldEvents {
    fn on_validate(&mut self, handle: Handle<TextField>, text: &str) -> EventProcessStatus {...}
}

Methods

Besides the Common methods for all Controls a textfield also has the following aditional methods:

MethodPurpose
set_text(...)Set the new text for a textfield.
text()Returns the current text from a textfield
is_readonly()Returns true if the current textfield is in a readonly state (was created with the readonlu flag) or false otherwise

Key association

The following keys are processed by a TextField control if it has focus:

KeyPurpose
Left, Right, Up, DownNavigate through the text from the textfield
Shift+{Left,Right,Up,Down}Selects part of the text textfield
Ctrl+LeftMoves to the begining of the previous word
Shift+Ctrl+LeftSelects the text from the begining of the previous word until the current position
Ctrl+RightMoves to the begining of the next word
Shift+Ctrl+RightSelects the text from current postion until the start of the next word
HomeMove to the begining of the text
Shift+HomeSelects the text from the beging of the text until the current position
EndMoves to the end of the text
Shift + EndSelects the text from current position until the end of the text
DeleteDeletes the current character. If a selection exists, it deletes it first
BackspaceDeletes the previous charactr. If a selection exists, it deletes it first
Ctrl+ASelects the entire text
Ctrl+UConverts the current selection to lower case. If no selection is present the curent word will be selected and then converted to lowercase
Ctrl+Shift+UConverts the current selection to upper case. If no selection is present the curent word will be selected and then converted to uppercase
Ctrl+C or Ctrl+InsertCopy the current selection to clipboard
Ctrl+V or Shift+InsertPaste the text from the clipboard (if any) to current position
Ctrl+X or Shift+DeleteIf a selection is present, it copies it into the clipboard and then delets it (acts like a Cut command)
EnterOnly if the flag textfield::Type::ProcessEnter is present will trigger a call to TextFieldEvents::on_validate(...)

Aditionally, al printable characters can be used to insert / modify or edit the current text.

Mouse actions

Mouse cursor can be used to select the text. Aditionally, a double click over a word will select it.

Example

The following code creates multiple text fields with both unicode and regular text.

use appcui::prelude::*;

fn main() -> Result<(), appcui::system::Error> {
    let mut app = App::new().build()?;
    let mut w = Window::new("Title", Layout::new("d:c,w:40,h:11"), window::Flags::None);
    w.add(textfield!("text:'I ❤️ Rust Language',x:1,y:1,w:36,h:1"));
    w.add(textfield!("'Read only text',x:1,y:3,w:36,h:1, flags: Readonly"));
    w.add(textfield!("Inactive,x:1,y:5,w:36,h:1,enable: false"));
    w.add(textfield!("'No auto selection',x:1,y:7,w:36,h:1, flags: DisableAutoSelectOnFocus"));
    a.add_window(w);
    a.run();
    Ok(())
}