lib-nested/examples/tty-02-node/src/main.rs

154 lines
5.7 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

extern crate cgmath;
extern crate nested;
extern crate nested_tty;
extern crate r3vi;
extern crate termion;
use {
cgmath::Vector2,
nested::{
editors::ObjCommander,
repr_tree::{Context, ReprTree},
edit_tree::{EditTree}
},
nested_tty::{
DisplaySegment, TTYApplication,
TerminalCompositor, TerminalStyle, TerminalView,
TerminalAtom
},
r3vi::{
buffer::{singleton::*, vec::*},
},
std::sync::{Arc, RwLock},
};
#[async_std::main]
async fn main() {
/* setup context & create Editor-Tree
*/
let ctx = Arc::new(RwLock::new(Context::new()));
nested::editors::char::init_ctx( ctx.clone() );
nested::editors::integer::editor::init_ctx( ctx.clone() );
nested::editors::list::init_ctx( ctx.clone() );
let char_type = Context::parse(&ctx, "Char");
let digit_type = Context::parse(&ctx, "<Digit Radix>");
let list_type = Context::parse(&ctx, "<List Item>");
let posint_type = Context::parse(&ctx, "<PosInt Radix>");
let item_tyid = ctx.read().unwrap().get_var_typeid("Item").unwrap();
ctx.write().unwrap().meta_chars.push(',');
ctx.write().unwrap().meta_chars.push('\"');
ctx.write().unwrap().set_edittree_hook(
Arc::new(
move |et: Arc<RwLock<EditTree>>, t: laddertypes::TypeTerm| {
if let Ok(σ) = laddertypes::unify(&t, &char_type.clone()) {
let mut et = et.write().unwrap();
*et = nested_tty::editors::edittree_make_char_view(et.clone());
}
else if let Ok(σ) = laddertypes::unify(&t, &digit_type) {
let mut et = et.write().unwrap();
*et = nested_tty::editors::edittree_make_digit_view(et.clone());
}
else if let Ok(σ) = laddertypes::unify(&t, &posint_type) {
let mut et = et.write().unwrap();
nested_tty::editors::list::PTYListStyle::for_node( &mut *et, ("0d", "", ""));
nested_tty::editors::list::PTYListController::for_node( &mut *et, None, None );
}
else if let Ok(σ) = laddertypes::unify(&t, &list_type) {
let mut et = et.write().unwrap();
let item_type = σ.get( &laddertypes::TypeID::Var(item_tyid) ).unwrap();
if item_type == &char_type {
nested_tty::editors::list::PTYListStyle::for_node( &mut *et, ("\"", "", "\""));
nested_tty::editors::list::PTYListController::for_node( &mut *et, None, Some('\"') );
} else {
nested_tty::editors::list::PTYListStyle::for_node( &mut *et, ("{", ", ", "}"));
nested_tty::editors::list::PTYListController::for_node( &mut *et, Some(','), Some('}') );
}
//*et = nested_tty::editors::edittree_make_list_edit(et.clone());
}
}
)
);
/* structure of Repr-Tree
*
* === Repr-Tree ===
*
* <Digit 10>
* / | \
* / | \
* / | \
* u32 [ EditTree ] Char
* - Editor \
* - Display [ EditTree ]
* / | \ - Editor
* / | \ - Display
* TTY PixelBuf SDF / | \
* / | \
* TTY PixelBuf SDF
*/
let rt_digit = ReprTree::new_arc( Context::parse(&ctx, "<Digit 16>") );
/* add initial representation
* <Digit 16> ~ Char
*/
rt_digit.write().unwrap()
.insert_leaf(
vec![ Context::parse(&ctx, "Char") ].into_iter(),
SingletonBuffer::new('x').get_port().into()
);
/* setup TTY-Display for DigitEditor
*/
let edittree_digit = ctx.read().unwrap().setup_edittree(rt_digit.clone(), r3vi::buffer::singleton::SingletonBuffer::new(0).get_port());
//---
let rt_string = ReprTree::new_arc( Context::parse(&ctx, "<List <List Char>>") );
let edittree = ctx.read().unwrap().setup_edittree(rt_string.clone(), r3vi::buffer::singleton::SingletonBuffer::new(0).get_port());
/* setup terminal
*/
let app = TTYApplication::new({
/* event handler
*/
let ctx = ctx.clone();
let et1 = edittree.clone();
move |ev| {
et1.write().unwrap().send_cmd_obj(ev.to_repr_tree(&ctx));
}
});
/* setup display view routed to `app.port`
*/
let compositor = TerminalCompositor::new(app.port.inner());
// add some views to the display compositor
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, 0)),
);
compositor.write().unwrap().push( edittree_digit.read().unwrap().display_view().offset(Vector2::new(0,2)) );
let label = ctx.read().unwrap().type_term_to_str(&rt_digit.read().unwrap().get_type());
compositor
.write()
.unwrap()
.push(nested_tty::make_label(&label).offset(Vector2::new(0, 1)));
compositor.write().unwrap().push( edittree.read().unwrap().display_view().offset(Vector2::new(0,4)) );
let label = ctx.read().unwrap().type_term_to_str(&rt_string.read().unwrap().get_type());
compositor
.write()
.unwrap()
.push(nested_tty::make_label(&label).offset(Vector2::new(0, 3)));
/* write the changes in the view of `term_port` to the terminal
*/
app.show().await.expect("output error!");
}