widget_text_area/
widget_text_area.rs1use {
2 matetui::{
3 ratatui::{
4 backend::CrosstermBackend,
5 crossterm::{
6 event::{self},
7 execute,
8 terminal::{
9 disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen,
10 },
11 },
12 layout::{Constraint, Direction, Layout},
13 Terminal,
14 },
15 widgets::textarea::{Input, Key, TextArea},
16 },
17 ratatui::widgets::{Block, BorderType, Borders, Padding, Paragraph},
18 std::{cmp, io},
19};
20
21fn main() -> io::Result<()> {
22 let stdout = io::stdout();
23 let mut stdout = stdout.lock();
24
25 enable_raw_mode()?;
26 execute!(stdout, EnterAlternateScreen)?;
27 let backend = CrosstermBackend::new(stdout);
28 let mut term = Terminal::new(backend)?;
29
30 let mut textarea = TextArea::default().with_block(
31 Block::default()
32 .borders(Borders::ALL)
33 .border_type(BorderType::Rounded)
34 .title(" Your name ")
35 .padding(Padding::horizontal(1)),
36 );
37
38 loop {
39 term.draw(|f| {
40 const MIN_HEIGHT: usize = 1;
41 let height = cmp::max(textarea.lines().len(), MIN_HEIGHT) as u16 + 2;
42 let layout = Layout::default()
43 .direction(Direction::Vertical)
44 .constraints([Constraint::Length(height), Constraint::Min(1)])
45 .split(f.area());
46
47 f.render_widget(&textarea, layout[0]);
49 f.render_widget(Paragraph::new("Press <Esc> to exit"), layout[1]);
50 })?;
51 match event::read()?.into() {
52 Input { key: Key::Esc, .. }
53 | Input {
54 key: Key::Char('c'),
55 shift: false,
56 ctrl: true,
57 alt: false,
58 }
59 | Input {
60 key: Key::Enter,
61 ctrl: false,
62 shift: false,
63 alt: false,
64 } => break,
65 input => {
66 textarea.input(input);
67 }
68 }
69 }
70
71 disable_raw_mode()?;
72 execute!(term.backend_mut(), LeaveAlternateScreen)?;
73 term.show_cursor()?;
74
75 println!("Lines: {:?}", textarea.lines());
76 Ok(())
77}