lib-nested/examples/tty-01-hello/src/main.rs

86 lines
2.3 KiB
Rust
Raw Normal View History

extern crate cgmath;
2023-11-26 22:09:03 +01:00
extern crate nested;
extern crate nested_tty;
extern crate r3vi;
2023-11-26 22:09:03 +01:00
extern crate termion;
use {
cgmath::Vector2,
nested::reprTree::Context,
nested_tty::{Terminal, TerminalCompositor, TerminalEvent, TerminalStyle, TerminalView},
r3vi::view::{port::UpdateTask, ViewPort},
std::sync::{Arc, RwLock},
2023-11-26 22:09:03 +01:00
termion::event::{Event, Key},
};
/* this task handles all terminal events (e.g. key press, resize)
*/
pub async fn event_loop(
mut term: Terminal,
term_port: ViewPort<dyn TerminalView>,
portmutex: Arc<RwLock<()>>,
2023-11-26 22:09:03 +01:00
) {
loop {
let ev = term.next_event().await;
let _l = portmutex.write().unwrap();
if ev == TerminalEvent::Input(Event::Key(Key::Ctrl('d'))) {
break;
}
term_port.update();
}
}
/* this task will continuously pull forward
* all notifications which are influencing
* the view in `term_port`
*/
pub async fn update_loop(term_port: ViewPort<dyn TerminalView>, portmutex: Arc<RwLock<()>>) {
2023-11-26 22:09:03 +01:00
loop {
{
let _l = portmutex.write().unwrap();
term_port.update();
}
async_std::task::sleep(std::time::Duration::from_millis(500)).await;
}
}
#[async_std::main]
async fn main() {
/* initialize our terminal
*/
let term_port = ViewPort::new();
2023-11-26 22:09:03 +01:00
let mut term = Terminal::new(term_port.outer());
let term_writer = term.get_writer();
let portmutex = Arc::new(RwLock::new(()));
/* spawn event-handling & updating tasks
*/
async_std::task::spawn(update_loop(term_port.clone(), portmutex.clone()));
2023-11-26 22:09:03 +01:00
async_std::task::spawn(event_loop(term, term_port.clone(), portmutex.clone()));
2023-11-26 22:09:03 +01:00
/* populate the view in `term_port`
*/
let compositor = TerminalCompositor::new(term_port.inner());
compositor
.write()
.unwrap()
.push(nested_tty::make_label("test").offset(Vector2::new(7, 2)));
2023-11-26 22:09:03 +01:00
compositor.write().unwrap().push(
nested_tty::make_label("Hello World")
.map_item(|p, a| {
a.add_style_back(TerminalStyle::fg_color(((25 * p.x % 255) as u8, 200, 0)))
})
.offset(Vector2::new(5, 3)),
);
2023-11-26 22:09:03 +01:00
/* write the changes in the view of `term_port` to the terminal
*/
term_writer.show().await.expect("output error!");
}