Skip to main content

widget_text_area/
widget_text_area.rs

1use {
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            // Render the textarea
48            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}