crossterm_input/
crossterm_input.rs

1use ratatui::crossterm::{
2    cursor::{Hide, Show},
3    event::{read, DisableMouseCapture, EnableMouseCapture, Event, KeyCode, KeyEvent},
4    execute,
5    terminal::{
6        disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen,
7    },
8};
9use std::io::{stdout, Result, Write};
10use tui_input::backend::crossterm as backend;
11use tui_input::backend::crossterm::EventHandler;
12use tui_input::Input;
13
14fn main() -> Result<()> {
15    enable_raw_mode()?;
16    let stdout = stdout();
17    let mut stdout = stdout.lock();
18    execute!(stdout, Hide, EnterAlternateScreen, EnableMouseCapture)?;
19
20    let mut input: Input = "Hello ".into();
21    backend::write(&mut stdout, input.value(), input.cursor(), (0, 0), 15)?;
22    stdout.flush()?;
23
24    loop {
25        let event = read()?;
26
27        if let Event::Key(KeyEvent { code, .. }) = event {
28            match code {
29                KeyCode::Esc | KeyCode::Enter => {
30                    break;
31                }
32                _ => {
33                    if input.handle_event(&event).is_some() {
34                        backend::write(
35                            &mut stdout,
36                            input.value(),
37                            input.cursor(),
38                            (0, 0),
39                            15,
40                        )?;
41                        stdout.flush()?;
42                    }
43                }
44            }
45        }
46    }
47
48    execute!(stdout, Show, LeaveAlternateScreen, DisableMouseCapture)?;
49    disable_raw_mode()?;
50    println!("{}", input);
51    Ok(())
52}