Skip to main content

TextArea

Struct TextArea 

Source
pub struct TextArea { /* private fields */ }
Expand description

Multi-line text. Returns the text, lines joined with \n.

Implementations§

Source§

impl TextArea

Source

pub fn new(prompt: impl Into<String>) -> TextArea

Source

pub fn value(self, value: impl AsRef<str>) -> Self

Start with this text, the caret at its end.

Source

pub fn placeholder(self, placeholder: impl Into<String>) -> Self

Dim text shown while the area is empty.

Source

pub fn char_limit(self, chars: usize) -> Self

At most chars characters (grapheme clusters, so 👨‍👩‍👧 or e and a combining accent is one), line breaks included. Text already there beyond it is cut.

Source

pub fn truncate(text: &str, chars: usize) -> &str

The first chars characters of text as the character limit counts them: grapheme clusters, a line break one. Never cuts a cluster.

Source

pub fn rebind(self, action: &str, keys: impl IntoIterator<Item = Key>) -> Self

Make keys do action (in context textarea; see keymap) on this area only; no keys unbinds it.

Source

pub fn emacs_keys(self) -> Self

Emacs’s keys on top of the defaults: Ctrl+F/B/N/P and Alt+F/B move, Ctrl+K, Ctrl+U, Ctrl+W, Alt+D and Alt+Backspace kill onto the buffer’s kill ring, Ctrl+Y yanks the last kill back and Alt+Y swaps it for an older one, Alt+{ and Alt+} move by paragraph. (Ctrl+D still submits unless submit_key moves it.)

use rich_interact::headless::{run, Script};
use rich_interact::TextArea;

let area = TextArea::new("Note").value("one two").emacs_keys();
let script = Script::new().keys("ctrl+a alt+d ctrl+e ctrl+y ctrl+d");
let (outcome, _) = run(area, script, 30, 6);
assert_eq!(outcome.unwrap().value().as_deref(), Some(" twoone"));
Source

pub fn submit_key(self, key: Key) -> Self

The key that submits (default Ctrl+D).

Source

pub fn height(self, rows: usize) -> Self

Rows of text shown (default 5).

Source

pub fn line_numbers(self, on: bool) -> Self

Number the lines.

Source

pub fn theme(self, theme: Theme) -> Self

Source

pub fn text(&self) -> String

The text so far.

Source

pub fn caret(&self) -> (usize, usize)

The caret: (line, character column).

Trait Implementations§

Source§

impl Component for TextArea

Source§

fn prompt( &mut self, io: &mut dyn LineIo, ) -> Result<Option<String>, NotInteractive>

Without a terminal: every line up to the end of input is the text, cut to the character limit. No lines at all answer with the text the area started with.

Source§

type Output = String

Source§

fn handle(&mut self, event: &Event, context: &Context<'_>) -> Flow<String>

Handle one event. Ctrl+C never arrives here: the event loop ends the component with Outcome::Interrupted.
Source§

fn keymap(&self) -> Keymap

The bindings this component has right now, for a help overlay, a shortcut list or status-bar hints to read (see keymap). A container’s include its focused child’s, before its own. The default declares none.
Source§

fn render(&self, context: &Context<'_>) -> View

Render the current state.
Source§

fn default_value(&self) -> Option<String>

The value to return when the terminal is not interactive and the policy asks for defaults. None: there is none.
Source§

fn start(&mut self, context: &Context<'_>) -> Flow<Self::Output>

Called once, before the component is first painted, with the terminal’s size: for work that needs it, such as rendering content at the width. Returning Done or Cancel finishes the component without waiting for an event. The default does nothing.
Source§

fn tick(&self) -> Option<Duration>

How often the component wants Event::Tick, for a spinner or a countdown. None (the default): never.
Source§

fn mouse(&self) -> bool

Whether the component wants mouse events (#476): clicks, drags and the wheel. Off by default, since reporting the mouse takes text selection away from the terminal; a component turns it on when its caller opts in, and run then enables mouse reporting for the session.
Source§

fn focusable(&self) -> bool

Whether the component takes focus in a container: Tab stops on it and keys go to it. The default: yes. A label, or a component that has finished, says no.
Source§

fn focus_step(&mut self, forward: bool) -> bool

Move focus to the next (forward) or previous focus stop inside this component, for Tab and Shift+Tab. false when there is none after the current one, so the container moves on to its next child. The default, for a component that is one stop: false.
Source§

fn focus_enter(&mut self, forward: bool) -> bool

Take focus from outside: at the first stop inside when forward, at the last otherwise. false when nothing in it can take focus. The default: whether the component is focusable.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<C> ComponentExt for C
where C: Component,

Source§

fn map<'a, M>( self, done: impl FnMut(Self::Output) -> Flow<M> + 'a, ) -> Map<'a, Self, M>
where Self: 'a,

Turn this component’s answer into M’s flow: Flow::Done(m) to finish the whole composition with m, Flow::Continue to carry on (the component stays, showing its answer, and focus moves past it). Cancelling cancels the composition unless on_cancel says otherwise.
Source§

fn with_overlays<'a>(self) -> Overlays<'a, Self::Output>
where Self: 'a, Self::Output: 'a,

Wrap this component in Overlays: a command palette, help and a shortcut sheet read from its keymap, and room for a status bar and breadcrumbs.
Source§

fn boxed<'a>(self) -> Child<'a, Self::Output>
where Self: 'a,

Box this component as a Child.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.