diff --git a/Cargo.toml b/Cargo.toml index 233aebd..f584e8f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,12 +5,18 @@ edition = "2021" [features] default = ["crossterm"] +crossterm = ["dep:crossterm", "tui/crossterm"] +termion = ["dep:termion", "tui/termion"] [dependencies] crossterm = { version = "0.23", optional = true } termion = { version = "1.5", optional = true } -tui = "0.18" +tui = { version = "0.18", default-features = false } [[example]] name = "minimal" required-features = ["crossterm"] + +[[example]] +name = "termion" +required-features = ["termion"] diff --git a/examples/termion.rs b/examples/termion.rs new file mode 100644 index 0000000..c74264d --- /dev/null +++ b/examples/termion.rs @@ -0,0 +1,65 @@ +use std::error::Error; +use std::io; +use std::sync::mpsc; +use std::thread; +use std::time::Duration; +use termion::event::Key; +use termion::input::{MouseTerminal, TermRead}; +use termion::raw::IntoRawMode; +use termion::screen::AlternateScreen; +use tui::backend::TermionBackend; +use tui::layout::{Constraint, Direction, Layout}; +use tui::widgets::{Block, Borders}; +use tui::Terminal; +use tui_textarea::TextArea; + +enum Event { + Key(Key), + Tick, +} + +fn main() -> Result<(), Box> { + let stdout = io::stdout().into_raw_mode()?; + let stdout = MouseTerminal::from(stdout); + let stdout = AlternateScreen::from(stdout); + let backend = TermionBackend::new(stdout); + let mut term = Terminal::new(backend)?; + + let events = { + let keys = io::stdin().keys(); + let (tx, rx) = mpsc::channel(); + let keys_tx = tx.clone(); + thread::spawn(move || { + for key in keys.flatten() { + keys_tx.send(Event::Key(key)).unwrap(); + } + }); + thread::spawn(move || loop { + tx.send(Event::Tick).unwrap(); + thread::sleep(Duration::from_millis(100)); + }); + rx + }; + + let mut textarea = TextArea::default(); + textarea.set_block(Block::default().borders(Borders::ALL).title("EXAMPLE")); + let layout = Layout::default() + .direction(Direction::Vertical) + .constraints([Constraint::Min(1)].as_ref()); + + loop { + match events.recv()? { + Event::Key(Key::Esc) => break, + Event::Key(key) => textarea.input(key), + Event::Tick => {} + } + term.draw(|f| { + let chunks = layout.split(f.size()); + let widget = textarea.widget(); + f.render_widget(widget, chunks[0]); + })?; + } + + println!("Lines: {:?}", textarea.lines()); + Ok(()) +}