зеркало из
https://github.com/glebtv/tui-textarea.git
synced 2026-09-03 22:35:50 +03:00
add minimal termion example
Этот коммит содержится в:
@@ -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"]
|
||||
|
||||
65
examples/termion.rs
Обычный файл
65
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<dyn Error>> {
|
||||
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(())
|
||||
}
|
||||
Ссылка в новой задаче
Block a user