2023-11-27 04:18:46 +01:00
|
|
|
extern crate cgmath;
|
2023-11-26 22:09:03 +01:00
|
|
|
extern crate nested;
|
|
|
|
extern crate nested_tty;
|
2023-11-27 04:18:46 +01:00
|
|
|
extern crate r3vi;
|
2023-11-26 22:09:03 +01:00
|
|
|
extern crate termion;
|
|
|
|
|
|
|
|
use {
|
|
|
|
cgmath::Vector2,
|
2023-11-27 04:18:46 +01:00
|
|
|
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>,
|
2023-11-27 04:18:46 +01:00
|
|
|
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`
|
|
|
|
*/
|
2023-11-27 04:18:46 +01:00
|
|
|
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-27 04:18:46 +01:00
|
|
|
|
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
|
|
|
|
*/
|
2023-11-27 04:18:46 +01:00
|
|
|
async_std::task::spawn(update_loop(term_port.clone(), portmutex.clone()));
|
2023-11-26 22:09:03 +01:00
|
|
|
|
2023-11-27 04:18:46 +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());
|
|
|
|
|
2023-11-27 04:18:46 +01:00
|
|
|
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")
|
2023-11-27 04:18:46 +01:00
|
|
|
.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!");
|
|
|
|
}
|