pub struct Text<'a> {
pub lines: Vec<Line<'a>>,
pub style: Style,
pub alignment: Option<Alignment>,
}Expand description
A string split over one or more lines.
Text is used wherever text is displayed in the terminal and represents one or more Lines
of text. When a Text is rendered, each line is rendered as a single line of text from top to
bottom of the area. The text can be styled and aligned.
§Constructor Methods
Text::rawcreates aText(potentially multiple lines) with no style.Text::styledcreates aText(potentially multiple lines) with a style.Text::defaultcreates aTextwith empty content and the default style.
§Conversion Methods
Text::fromcreates aTextfrom aString.Text::fromcreates aTextfrom a&str.Text::fromcreates aTextfrom aCow<str>.Text::fromcreates aTextfrom aSpan.Text::fromcreates aTextfrom aLine.Text::fromcreates aTextfrom aVec<Line>.Text::from_itercreates aTextfrom an iterator of items that can be converted intoLine.
§Setter Methods
These methods are fluent setters. They return a Text with the property set.
Text::stylesets the style of thisText.Text::alignmentsets the alignment for thisText.Text::left_alignedsets the alignment toAlignment::Left.Text::centeredsets the alignment toAlignment::Center.Text::right_alignedsets the alignment toAlignment::Right.
§Iteration Methods
Text::iterreturns an iterator over the lines of the text.Text::iter_mutreturns an iterator that allows modifying each line.Text::into_iterreturns an iterator over the lines of the text.
§Other Methods
Text::widthreturns the max width of all the lines.Text::heightreturns the height.Text::patch_stylepatches the style of thisText, adding modifiers from the given style.Text::reset_styleresets the style of theText.Text::push_lineadds a line to the text.Text::push_spanadds a span to the last line of the text.
§Examples
§Creating Text
A Text, like a Line, can be constructed using one of the many From implementations or
via the Text::raw and Text::styled methods. Helpfully, Text also implements
core::iter::Extend which enables the concatenation of several Text blocks.
use std::{borrow::Cow, iter};
use ratatui::prelude::*;
let style = Style::new().yellow().italic();
let text = Text::raw("The first line\nThe second line").style(style);
let text = Text::styled("The first line\nThe second line", style);
let text = Text::styled(
"The first line\nThe second line",
(Color::Yellow, Modifier::ITALIC),
);
let text = Text::from("The first line\nThe second line");
let text = Text::from(String::from("The first line\nThe second line"));
let text = Text::from(Cow::Borrowed("The first line\nThe second line"));
let text = Text::from(Span::styled("The first line\nThe second line", style));
let text = Text::from(Line::from("The first line"));
let text = Text::from(vec![
Line::from("The first line"),
Line::from("The second line"),
]);
let text = Text::from_iter(iter::once("The first line").chain(iter::once("The second line")));
let mut text = Text::default();
text.extend(vec![
Line::from("The first line"),
Line::from("The second line"),
]);
text.extend(Text::from("The third line\nThe fourth line"));§Styling Text
The text’s Style is used by the rendering widget to determine how to style the text. Each
Line in the text will be styled with the Style of the text, and then with its own
Style. Text also implements Styled which means you can use the methods of the
Stylize trait.
let text = Text::from("The first line\nThe second line").style(Style::new().yellow().italic());
let text = Text::from("The first line\nThe second line")
.yellow()
.italic();
let text = Text::from(vec![
Line::from("The first line").yellow(),
Line::from("The second line").yellow(),
])
.italic();§Aligning Text
The text’s Alignment can be set using Text::alignment or the related helper methods.
Lines composing the text can also be individually aligned with Line::alignment.
let text = Text::from("The first line\nThe second line").alignment(Alignment::Right);
let text = Text::from("The first line\nThe second line").right_aligned();
let text = Text::from(vec![
Line::from("The first line").left_aligned(),
Line::from("The second line").right_aligned(),
Line::from("The third line"),
])
.centered();§Rendering Text
Text implements the Widget trait, which means it can be rendered to a Buffer or to a
Frame.
// within another widget's `render` method:
let text = Text::from("The first line\nThe second line");
text.render(area, buf);
// within a terminal.draw closure:
let text = Text::from("The first line\nThe second line");
frame.render_widget(text, area);§Rendering Text with a Paragraph Widget
Usually apps will use the Paragraph widget instead of rendering a Text directly as it
provides more functionality.
let text = Text::from("The first line\nThe second line");
let paragraph = Paragraph::new(text)
.wrap(Wrap { trim: true })
.scroll((1, 1))
.render(area, buf);Fields§
§lines: Vec<Line<'a>>The lines that make up this piece of text.
style: StyleThe style of this text.
alignment: Option<Alignment>The alignment of this text.
Implementations§
source§impl<'a> Text<'a>
impl<'a> Text<'a>
sourcepub fn raw<T>(content: T) -> Self
pub fn raw<T>(content: T) -> Self
Create some text (potentially multiple lines) with no style.
§Examples
Text::raw("The first line\nThe second line");
Text::raw(String::from("The first line\nThe second line"));sourcepub fn styled<T, S>(content: T, style: S) -> Self
pub fn styled<T, S>(content: T, style: S) -> Self
Create some text (potentially multiple lines) with a style.
style accepts any type that is convertible to Style (e.g. Style, Color, or
your own type that implements Into<Style>).
§Examples
let style = Style::default()
.fg(Color::Yellow)
.add_modifier(Modifier::ITALIC);
Text::styled("The first line\nThe second line", style);
Text::styled(String::from("The first line\nThe second line"), style);sourcepub fn width(&self) -> usize
pub fn width(&self) -> usize
Returns the max width of all the lines.
§Examples
let text = Text::from("The first line\nThe second line");
assert_eq!(15, text.width());sourcepub fn height(&self) -> usize
pub fn height(&self) -> usize
Returns the height.
§Examples
let text = Text::from("The first line\nThe second line");
assert_eq!(2, text.height());sourcepub fn style<S: Into<Style>>(self, style: S) -> Self
pub fn style<S: Into<Style>>(self, style: S) -> Self
Sets the style of this text.
Defaults to Style::default().
Note: This field was added in v0.26.0. Prior to that, the style of a text was determined
only by the style of each Line contained in the line. For this reason, this field may
not be supported by all widgets (outside of the ratatui crate itself).
style accepts any type that is convertible to Style (e.g. Style, Color, or
your own type that implements Into<Style>).
§Examples
let mut line = Text::from("foo").style(Style::new().red());sourcepub fn patch_style<S: Into<Style>>(self, style: S) -> Self
pub fn patch_style<S: Into<Style>>(self, style: S) -> Self
Patches the style of this Text, adding modifiers from the given style.
This is useful for when you want to apply a style to a text that already has some styling.
In contrast to Text::style, this method will not overwrite the existing style, but
instead will add the given style’s modifiers to this text’s style.
Text also implements Styled which means you can use the methods of the Stylize
trait.
style accepts any type that is convertible to Style (e.g. Style, Color, or
your own type that implements Into<Style>).
This is a fluent setter method which must be chained or used as it consumes self
§Examples
let raw_text = Text::styled("The first line\nThe second line", Modifier::ITALIC);
let styled_text = Text::styled(
String::from("The first line\nThe second line"),
(Color::Yellow, Modifier::ITALIC),
);
assert_ne!(raw_text, styled_text);
let raw_text = raw_text.patch_style(Color::Yellow);
assert_eq!(raw_text, styled_text);Examples found in repository?
202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273
fn ui(f: &mut Frame, app: &App) {
let vertical = Layout::vertical([
Constraint::Length(1),
Constraint::Length(3),
Constraint::Min(1),
]);
let [help_area, input_area, messages_area] = vertical.areas(f.size());
let (msg, style) = match app.input_mode {
InputMode::Normal => (
vec![
"Press ".into(),
"q".bold(),
" to exit, ".into(),
"e".bold(),
" to start editing.".bold(),
],
Style::default().add_modifier(Modifier::RAPID_BLINK),
),
InputMode::Editing => (
vec![
"Press ".into(),
"Esc".bold(),
" to stop editing, ".into(),
"Enter".bold(),
" to record the message".into(),
],
Style::default(),
),
};
let text = Text::from(Line::from(msg)).patch_style(style);
let help_message = Paragraph::new(text);
f.render_widget(help_message, help_area);
let input = Paragraph::new(app.input.as_str())
.style(match app.input_mode {
InputMode::Normal => Style::default(),
InputMode::Editing => Style::default().fg(Color::Yellow),
})
.block(Block::bordered().title("Input"));
f.render_widget(input, input_area);
match app.input_mode {
InputMode::Normal =>
// Hide the cursor. `Frame` does this by default, so we don't need to do anything here
{}
InputMode::Editing => {
// Make the cursor visible and ask ratatui to put it at the specified coordinates after
// rendering
#[allow(clippy::cast_possible_truncation)]
f.set_cursor(
// Draw the cursor at the current position in the input field.
// This position is can be controlled via the left and right arrow key
input_area.x + app.character_index as u16 + 1,
// Move one line down, from the border to the input line
input_area.y + 1,
);
}
}
let messages: Vec<ListItem> = app
.messages
.iter()
.enumerate()
.map(|(i, m)| {
let content = Line::from(Span::raw(format!("{i}: {m}")));
ListItem::new(content)
})
.collect();
let messages = List::new(messages).block(Block::bordered().title("Messages"));
f.render_widget(messages, messages_area);
}sourcepub fn reset_style(self) -> Self
pub fn reset_style(self) -> Self
Resets the style of the Text.
Equivalent to calling patch_style(Style::reset()).
This is a fluent setter method which must be chained or used as it consumes self
§Examples
let text = Text::styled(
"The first line\nThe second line",
(Color::Yellow, Modifier::ITALIC),
);
let text = text.reset_style();
assert_eq!(Style::reset(), text.style);sourcepub fn alignment(self, alignment: Alignment) -> Self
pub fn alignment(self, alignment: Alignment) -> Self
Sets the alignment for this text.
Defaults to: None, meaning the alignment is determined by the rendering widget.
Setting the alignment of a Text generally overrides the alignment of its
parent Widget.
Alignment can be set individually on each line to override this text’s alignment.
§Examples
Set alignment to the whole text.
let mut text = Text::from("Hi, what's up?");
assert_eq!(None, text.alignment);
assert_eq!(
Some(Alignment::Right),
text.alignment(Alignment::Right).alignment
)Set a default alignment and override it on a per line basis.
let text = Text::from(vec![
Line::from("left").alignment(Alignment::Left),
Line::from("default"),
Line::from("default"),
Line::from("right").alignment(Alignment::Right),
])
.alignment(Alignment::Center);Will render the following
left
default
default
right
sourcepub fn left_aligned(self) -> Self
pub fn left_aligned(self) -> Self
Left-aligns the whole text.
Convenience shortcut for Text::alignment(Alignment::Left).
Setting the alignment of a Text generally overrides the alignment of its
parent Widget, with the default alignment being inherited from the parent.
Alignment can be set individually on each line to override this text’s alignment.
§Examples
let text = Text::from("Hi, what's up?").left_aligned();sourcepub fn centered(self) -> Self
pub fn centered(self) -> Self
Center-aligns the whole text.
Convenience shortcut for Text::alignment(Alignment::Center).
Setting the alignment of a Text generally overrides the alignment of its
parent Widget, with the default alignment being inherited from the parent.
Alignment can be set individually on each line to override this text’s alignment.
§Examples
let text = Text::from("Hi, what's up?").centered();sourcepub fn right_aligned(self) -> Self
pub fn right_aligned(self) -> Self
Right-aligns the whole text.
Convenience shortcut for Text::alignment(Alignment::Right).
Setting the alignment of a Text generally overrides the alignment of its
parent Widget, with the default alignment being inherited from the parent.
Alignment can be set individually on each line to override this text’s alignment.
§Examples
let text = Text::from("Hi, what's up?").right_aligned();sourcepub fn iter_mut(&mut self) -> IterMut<'_, Line<'a>>
pub fn iter_mut(&mut self) -> IterMut<'_, Line<'a>>
Returns an iterator that allows modifying each line.
sourcepub fn push_line<T: Into<Line<'a>>>(&mut self, line: T)
pub fn push_line<T: Into<Line<'a>>>(&mut self, line: T)
Adds a line to the text.
line can be any type that can be converted into a Line. For example, you can pass a
&str, a String, a Span, or a Line.
§Examples
let mut text = Text::from("Hello, world!");
text.push_line(Line::from("How are you?"));
text.push_line(Span::from("How are you?"));
text.push_line("How are you?");sourcepub fn push_span<T: Into<Span<'a>>>(&mut self, span: T)
pub fn push_span<T: Into<Span<'a>>>(&mut self, span: T)
Adds a span to the last line of the text.
span can be any type that is convertible into a Span. For example, you can pass a
&str, a String, or a Span.
§Examples
let mut text = Text::from("Hello, world!");
text.push_span(Span::from("How are you?"));
text.push_span("How are you?");Trait Implementations§
source§impl<'a, T> Extend<T> for Text<'a>
impl<'a, T> Extend<T> for Text<'a>
source§fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I)
fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I)
source§fn extend_one(&mut self, item: A)
fn extend_one(&mut self, item: A)
extend_one)source§fn extend_reserve(&mut self, additional: usize)
fn extend_reserve(&mut self, additional: usize)
extend_one)source§impl<'a, T> FromIterator<T> for Text<'a>
impl<'a, T> FromIterator<T> for Text<'a>
source§fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self
fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self
source§impl<'a> IntoIterator for &'a Text<'a>
impl<'a> IntoIterator for &'a Text<'a>
source§impl<'a> IntoIterator for &'a mut Text<'a>
impl<'a> IntoIterator for &'a mut Text<'a>
source§impl<'a> IntoIterator for Text<'a>
impl<'a> IntoIterator for Text<'a>
source§impl<'a> PartialEq for Text<'a>
impl<'a> PartialEq for Text<'a>
source§impl WidgetRef for Text<'_>
impl WidgetRef for Text<'_>
source§fn render_ref(&self, area: Rect, buf: &mut Buffer)
fn render_ref(&self, area: Rect, buf: &mut Buffer)
unstable-widget-ref only.impl<'a> Eq for Text<'a>
impl<'a> StructuralPartialEq for Text<'a>
Auto Trait Implementations§
impl<'a> Freeze for Text<'a>
impl<'a> RefUnwindSafe for Text<'a>
impl<'a> Send for Text<'a>
impl<'a> Sync for Text<'a>
impl<'a> Unpin for Text<'a>
impl<'a> UnwindSafe for Text<'a>
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moresource§impl<'a, T, U> Stylize<'a, T> for Uwhere
U: Styled<Item = T>,
impl<'a, T, U> Stylize<'a, T> for Uwhere
U: Styled<Item = T>,
fn bg(self, color: Color) -> T
fn fg<S>(self, color: S) -> T
fn add_modifier(self, modifier: Modifier) -> T
fn remove_modifier(self, modifier: Modifier) -> T
fn reset(self) -> T
source§fn on_magenta(self) -> T
fn on_magenta(self) -> T
magenta.source§fn on_dark_gray(self) -> T
fn on_dark_gray(self) -> T
dark_gray.source§fn on_light_red(self) -> T
fn on_light_red(self) -> T
light_red.source§fn light_green(self) -> T
fn light_green(self) -> T
light_green.source§fn on_light_green(self) -> T
fn on_light_green(self) -> T
light_green.source§fn light_yellow(self) -> T
fn light_yellow(self) -> T
light_yellow.source§fn on_light_yellow(self) -> T
fn on_light_yellow(self) -> T
light_yellow.source§fn light_blue(self) -> T
fn light_blue(self) -> T
light_blue.source§fn on_light_blue(self) -> T
fn on_light_blue(self) -> T
light_blue.source§fn light_magenta(self) -> T
fn light_magenta(self) -> T
light_magenta.source§fn on_light_magenta(self) -> T
fn on_light_magenta(self) -> T
light_magenta.source§fn light_cyan(self) -> T
fn light_cyan(self) -> T
light_cyan.source§fn on_light_cyan(self) -> T
fn on_light_cyan(self) -> T
light_cyan.source§fn not_italic(self) -> T
fn not_italic(self) -> T
ITALIC modifier.source§fn underlined(self) -> T
fn underlined(self) -> T
UNDERLINED modifier.source§fn not_underlined(self) -> T
fn not_underlined(self) -> T
UNDERLINED modifier.source§fn slow_blink(self) -> T
fn slow_blink(self) -> T
SLOW_BLINK modifier.source§fn not_slow_blink(self) -> T
fn not_slow_blink(self) -> T
SLOW_BLINK modifier.source§fn rapid_blink(self) -> T
fn rapid_blink(self) -> T
RAPID_BLINK modifier.source§fn not_rapid_blink(self) -> T
fn not_rapid_blink(self) -> T
RAPID_BLINK modifier.source§fn not_reversed(self) -> T
fn not_reversed(self) -> T
REVERSED modifier.HIDDEN modifier.HIDDEN modifier.source§fn crossed_out(self) -> T
fn crossed_out(self) -> T
CROSSED_OUT modifier.source§fn not_crossed_out(self) -> T
fn not_crossed_out(self) -> T
CROSSED_OUT modifier.source§impl<T> ToCompactString for Twhere
T: Display,
impl<T> ToCompactString for Twhere
T: Display,
source§fn to_compact_string(&self) -> CompactString
fn to_compact_string(&self) -> CompactString
CompactString. Read more