add hello world example
This commit is contained in:
parent
f8e872acda
commit
ea38b0f9b0
3 changed files with 121 additions and 1 deletions
|
@ -1,6 +1,7 @@
|
||||||
[workspace]
|
[workspace]
|
||||||
members = [
|
members = [
|
||||||
"lib-nested-core",
|
"lib-nested-core",
|
||||||
"lib-nested-tty"
|
"lib-nested-tty",
|
||||||
|
"examples/tty-01-hello"
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
18
examples/tty-01-hello/Cargo.toml
Normal file
18
examples/tty-01-hello/Cargo.toml
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
[package]
|
||||||
|
name = "tty-01-hello"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
r3vi = { path = "../../../lib-r3vi" }
|
||||||
|
nested = { path = "../../lib-nested-core" }
|
||||||
|
nested-tty = { path = "../../lib-nested-tty" }
|
||||||
|
termion = "*"
|
||||||
|
cgmath = "*"
|
||||||
|
|
||||||
|
[dependencies.async-std]
|
||||||
|
version = "1.9.0"
|
||||||
|
features = ["unstable", "attributes"]
|
||||||
|
|
101
examples/tty-01-hello/src/main.rs
Normal file
101
examples/tty-01-hello/src/main.rs
Normal file
|
@ -0,0 +1,101 @@
|
||||||
|
extern crate r3vi;
|
||||||
|
extern crate nested;
|
||||||
|
extern crate nested_tty;
|
||||||
|
extern crate termion;
|
||||||
|
extern crate cgmath;
|
||||||
|
|
||||||
|
use {
|
||||||
|
r3vi::view::{
|
||||||
|
ViewPort,
|
||||||
|
port::UpdateTask
|
||||||
|
},
|
||||||
|
nested::{
|
||||||
|
tree::{NestedNode},
|
||||||
|
type_system::{Context, ReprTree}
|
||||||
|
},
|
||||||
|
nested_tty::{
|
||||||
|
Terminal, TerminalView, TerminalEvent,
|
||||||
|
TerminalStyle,
|
||||||
|
TerminalCompositor
|
||||||
|
},
|
||||||
|
cgmath::Vector2,
|
||||||
|
termion::event::{Event, Key},
|
||||||
|
std::sync::{Arc, RwLock}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* 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<()>>
|
||||||
|
) {
|
||||||
|
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<()>>
|
||||||
|
) {
|
||||||
|
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();
|
||||||
|
|
||||||
|
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()));
|
||||||
|
|
||||||
|
async_std::task::spawn(
|
||||||
|
event_loop(term, term_port.clone(), portmutex.clone()));
|
||||||
|
|
||||||
|
/* 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)));
|
||||||
|
|
||||||
|
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)));
|
||||||
|
|
||||||
|
/* write the changes in the view of `term_port` to the terminal
|
||||||
|
*/
|
||||||
|
term_writer.show().await.expect("output error!");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue