diff --git a/Cargo.toml b/Cargo.toml index e543e5c..d8dc91c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -75,6 +75,14 @@ required-features = ["crossterm"] name = "ratatui_minimal" required-features = ["ratatui-crossterm"] +[[example]] +name = "ratatui_placepop" +required-features = ["ratatui-crossterm"] + +[[example]] +name = "placepop" +required-features = ["crossterm"] + [[example]] name = "ratatui_editor" required-features = ["ratatui-crossterm", "search"] diff --git a/examples/placepop.rs b/examples/placepop.rs new file mode 100644 index 0000000..39414a0 --- /dev/null +++ b/examples/placepop.rs @@ -0,0 +1,64 @@ +use crossterm::event::{DisableMouseCapture, EnableMouseCapture}; +use crossterm::terminal::{ + disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen, +}; +use std::io; +use tui::backend::CrosstermBackend; +use tui::layout::Rect; +use tui::style::{Color, Style}; +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(); + textarea.set_block( + Block::default() + .borders(Borders::ALL) + .border_style(Style::default().fg(Color::LightBlue)) + .title("Crossterm Popup Example"), + ); + + let area = Rect { + width: 40, + height: 5, + x: 5, + y: 5, + }; + textarea.set_style(Style::default().fg(Color::Yellow)); + + // set placeholder + + textarea.set_placeholder_style(Style::default()); + textarea.set_placeholder("prompt message".to_string()); + loop { + term.draw(|f| { + f.render_widget(textarea.widget(), area); + })?; + match crossterm::event::read()?.into() { + Input { key: Key::Esc, .. } => break, + input => { + textarea.input(input); + } + } + } + + disable_raw_mode()?; + crossterm::execute!( + term.backend_mut(), + LeaveAlternateScreen, + DisableMouseCapture + )?; + term.show_cursor()?; + + println!("Lines: {:?}", textarea.lines()); + Ok(()) +} diff --git a/examples/ratatui_placepop.rs b/examples/ratatui_placepop.rs new file mode 100644 index 0000000..e29fca0 --- /dev/null +++ b/examples/ratatui_placepop.rs @@ -0,0 +1,62 @@ +use crossterm::event::{DisableMouseCapture, EnableMouseCapture}; +use crossterm::terminal::{ + disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen, +}; +use crossterm_026 as crossterm; +use ratatui::backend::CrosstermBackend; +use ratatui::layout::Rect; +use ratatui::style::{Color, Style}; +use ratatui::widgets::{Block, Borders}; +use ratatui::Terminal; +use std::io; +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(); + textarea.set_block( + Block::default() + .borders(Borders::ALL) + .border_style(Style::default().fg(Color::LightBlue)) + .title("Crossterm Popup Example"), + ); + + let area = Rect { + width: 40, + height: 5, + x: 5, + y: 5, + }; + textarea.set_style(Style::default().fg(Color::Yellow)); + textarea.set_placeholder_style(Style::default()); + textarea.set_placeholder("prompt message".to_string()); + loop { + term.draw(|f| { + f.render_widget(textarea.widget(), area); + })?; + match crossterm::event::read()?.into() { + Input { key: Key::Esc, .. } => break, + input => { + textarea.input(input); + } + } + } + + disable_raw_mode()?; + crossterm::execute!( + term.backend_mut(), + LeaveAlternateScreen, + DisableMouseCapture + )?; + term.show_cursor()?; + + println!("Lines: {:?}", textarea.lines()); + Ok(()) +} diff --git a/examples/single_line.rs b/examples/single_line.rs index 4e7a374..d61899d 100644 --- a/examples/single_line.rs +++ b/examples/single_line.rs @@ -37,6 +37,7 @@ fn main() -> io::Result<()> { let mut textarea = TextArea::default(); textarea.set_cursor_line_style(Style::default()); + textarea.set_placeholder("enter a valid float, eg 1.56".to_string()); let layout = Layout::default().constraints([Constraint::Length(3), Constraint::Min(1)].as_slice()); let mut is_valid = validate(&mut textarea); diff --git a/src/textarea.rs b/src/textarea.rs index 5e14415..bec0296 100644 --- a/src/textarea.rs +++ b/src/textarea.rs @@ -50,6 +50,8 @@ pub struct TextArea<'a> { #[cfg(feature = "search")] search: Search, alignment: Alignment, + pub(crate) placeholder: Option, + pub(crate) placeholder_style: Option