From 3cdfa050e59864fa769722b39272a5e4cb32a304 Mon Sep 17 00:00:00 2001 From: rhysd Date: Thu, 9 Jun 2022 00:01:19 +0900 Subject: [PATCH] add first minimal example --- Cargo.toml | 3 +-- examples/minimal.rs | 57 +++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 10 ++++++++ 3 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 examples/minimal.rs diff --git a/Cargo.toml b/Cargo.toml index 8f40cf0..4ca401f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,6 @@ name = "tui-textarea" version = "0.0.0" edition = "2021" -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - [dependencies] +crossterm = "0.23.2" tui = "0.18" diff --git a/examples/minimal.rs b/examples/minimal.rs new file mode 100644 index 0000000..f938a8b --- /dev/null +++ b/examples/minimal.rs @@ -0,0 +1,57 @@ +use crossterm::event::{DisableMouseCapture, EnableMouseCapture, Event, KeyCode}; +use crossterm::terminal::{ + disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen, +}; +use std::io; +use tui::backend::CrosstermBackend; +use tui::layout::{Constraint, Direction, Layout}; +use tui::widgets::{Block, Borders}; +use tui::Terminal; +use tui_textarea::{Input, Key, TextArea}; + +fn main() -> io::Result<()> { + let stdout = io::stdout(); + let mut stdout = stdout.lock(); + enable_raw_mode()?; + crossterm::execute!(stdout, EnterAlternateScreen, EnableMouseCapture)?; + let backend = CrosstermBackend::new(stdout); + let mut term = Terminal::new(backend)?; + + let mut textarea = + TextArea::default().block(Block::default().borders(Borders::ALL).title("EXAMPLE")); + let layout = Layout::default() + .direction(Direction::Vertical) + .constraints([Constraint::Min(1)].as_ref()); + + loop { + term.draw(|f| { + let chunks = layout.split(f.size()); + let widget = textarea.widget(); + f.render_widget(widget, chunks[0]); + })?; + + if let Event::Key(key) = crossterm::event::read()? { + match key.code { + KeyCode::Char(c) => textarea.input(Input { + key: Key::Char(c), + ctrl: false, + }), + KeyCode::Backspace => textarea.input(Input { + key: Key::Backspace, + ctrl: false, + }), + KeyCode::Esc => break, + _ => {} + } + } + } + + disable_raw_mode()?; + crossterm::execute!( + term.backend_mut(), + LeaveAlternateScreen, + DisableMouseCapture + )?; + term.show_cursor()?; + Ok(()) +} diff --git a/src/lib.rs b/src/lib.rs index f5567c1..da0306c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -97,4 +97,14 @@ impl<'a> TextArea<'a> { } p } + + pub fn style(mut self, style: Style) -> Self { + self.style = style; + self + } + + pub fn block(mut self, block: Block<'a>) -> Self { + self.block = Some(block); + self + } }