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 Line
s
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::raw
creates aText
(potentially multiple lines) with no style.Text::styled
creates aText
(potentially multiple lines) with a style.Text::default
creates aText
with empty content and the default style.
§Conversion Methods
Text::from
creates aText
from aString
.Text::from
creates aText
from a&str
.Text::from
creates aText
from aCow<str>
.Text::from
creates aText
from aSpan
.Text::from
creates aText
from aLine
.Text::from
creates aText
from aVec<Line>
.Text::from_iter
creates aText
from 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::style
sets the style of thisText
.Text::alignment
sets the alignment for thisText
.Text::left_aligned
sets the alignment toAlignment::Left
.Text::centered
sets the alignment toAlignment::Center
.Text::right_aligned
sets the alignment toAlignment::Right
.
§Iteration Methods
Text::iter
returns an iterator over the lines of the text.Text::iter_mut
returns an iterator that allows modifying each line.Text::into_iter
returns an iterator over the lines of the text.
§Other Methods
Text::width
returns the max width of all the lines.Text::height
returns the height.Text::patch_style
patches the style of thisText
, adding modifiers from the given style.Text::reset_style
resets the style of theText
.Text::push_line
adds a line to the text.Text::push_span
adds 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: Style
The 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