Compare commits
10 commits
97a5b580df
...
73d457ba24
Author | SHA1 | Date | |
---|---|---|---|
73d457ba24 | |||
647a5d77b6 | |||
e46c143dec | |||
0ac4a34743 | |||
863fe95848 | |||
fdf2d60b35 | |||
8471c7a90f | |||
caa0c9a5c0 | |||
668b0b8b96 | |||
47a35f22b7 |
21 changed files with 419 additions and 319 deletions
|
@ -1,11 +1,12 @@
|
||||||
[package]
|
[package]
|
||||||
authors = ["Michael Sippel <micha@fragmental.art>"]
|
authors = ["Michael Sippel <micha@fragmental.art>"]
|
||||||
name = "display_server"
|
name = "display-server-tty"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
nested = { path = "../../nested" }
|
nested = { path = "../lib-nested-core" }
|
||||||
|
nested-tty = { path = "../lib-nested-tty" }
|
||||||
termion = "1.5.5"
|
termion = "1.5.5"
|
||||||
cgmath = { version = "0.18.0", features = ["serde"] }
|
cgmath = { version = "0.18.0", features = ["serde"] }
|
||||||
serde = { version = "1.0", features = ["serde_derive"] }
|
serde = { version = "1.0", features = ["serde_derive"] }
|
||||||
|
|
|
@ -6,6 +6,7 @@ edition = "2021"
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
laddertypes = { path = "../../../lib-laddertypes" }
|
||||||
r3vi = { path = "../../../lib-r3vi" }
|
r3vi = { path = "../../../lib-r3vi" }
|
||||||
nested = { path = "../../lib-nested-core" }
|
nested = { path = "../../lib-nested-core" }
|
||||||
nested-tty = { path = "../../lib-nested-tty" }
|
nested-tty = { path = "../../lib-nested-tty" }
|
||||||
|
|
|
@ -9,11 +9,12 @@ use {
|
||||||
nested::{
|
nested::{
|
||||||
editors::ObjCommander,
|
editors::ObjCommander,
|
||||||
repr_tree::{Context, ReprTree},
|
repr_tree::{Context, ReprTree},
|
||||||
edit_tree::{NestedNode}
|
edit_tree::{EditTree}
|
||||||
},
|
},
|
||||||
nested_tty::{
|
nested_tty::{
|
||||||
DisplaySegment, TTYApplication,
|
DisplaySegment, TTYApplication,
|
||||||
TerminalCompositor, TerminalStyle, TerminalView,
|
TerminalCompositor, TerminalStyle, TerminalView,
|
||||||
|
TerminalAtom
|
||||||
},
|
},
|
||||||
r3vi::{
|
r3vi::{
|
||||||
buffer::{singleton::*, vec::*},
|
buffer::{singleton::*, vec::*},
|
||||||
|
@ -21,112 +22,101 @@ use {
|
||||||
std::sync::{Arc, RwLock},
|
std::sync::{Arc, RwLock},
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
struct ParseDigit { radix: u32 }
|
|
||||||
impl Morphism for ParseDigit {
|
|
||||||
fn new(
|
|
||||||
ctx: &Arc<RwLock<Context>>
|
|
||||||
) -> Self {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
fn setup_projection(&self, repr_tree: Arc<RwLock<ReprTree>>) {
|
|
||||||
if let Some( char_view ) = repr_tree.get_out(Context::parse(&ctx, "Char~")) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
get_morphism( ) -> Morphism {
|
|
||||||
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
#[async_std::main]
|
#[async_std::main]
|
||||||
async fn main() {
|
async fn main() {
|
||||||
/* setup context & create Editor-Tree
|
/* setup context & create Editor-Tree
|
||||||
*/
|
*/
|
||||||
let ctx = Arc::new(RwLock::new(Context::new()));
|
let ctx = Arc::new(RwLock::new(Context::new()));
|
||||||
|
|
||||||
/* Create a Char-Node with editor & view
|
nested::editors::char::init_ctx( ctx.clone() );
|
||||||
*/
|
nested::editors::integer::editor::init_ctx( ctx.clone() );
|
||||||
|
nested::editors::list::init_ctx( ctx.clone() );
|
||||||
|
|
||||||
let mut char_obj = ReprTree::make_leaf(
|
let char_type = Context::parse(&ctx, "Char");
|
||||||
Context::parse(&ctx, "Char"),
|
let digit_type = Context::parse(&ctx, "<Digit Radix>");
|
||||||
SingletonBuffer::new('X').get_port().into()
|
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();
|
||||||
char_obj.insert_branch(
|
|
||||||
Context::parse(&ctx, "EditTree"),
|
ctx.write().unwrap().meta_chars.push(',');
|
||||||
SingletonBuffer::new(
|
ctx.write().unwrap().meta_chars.push('\"');
|
||||||
NestedNode::new()
|
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());
|
||||||
|
}
|
||||||
|
}
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut vec_obj = ReprTree::make_leaf(
|
/* structure of Repr-Tree
|
||||||
Context::parse(&ctx, "<Vec Char>"),
|
*
|
||||||
VecBuffer::new(vec!['a', 'b', 'c']).get_port().into()
|
* === 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()
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut char_edit = Context::new_edit_tree(
|
/* setup TTY-Display for DigitEditor
|
||||||
&ctx,
|
|
||||||
// node type
|
|
||||||
Context::parse(&ctx, "Char"),
|
|
||||||
// depth
|
|
||||||
SingletonBuffer::new(0).get_port(),
|
|
||||||
)
|
|
||||||
.unwrap();
|
|
||||||
*/
|
*/
|
||||||
// add a display view to the node
|
let edittree_digit = ctx.read().unwrap().setup_edittree(rt_digit.clone(), r3vi::buffer::singleton::SingletonBuffer::new(0).get_port());
|
||||||
//node1 = nested_tty::editors::node_make_tty_view(node1);
|
|
||||||
|
|
||||||
/* Create a <List Char>-Node with editor & view
|
//---
|
||||||
*/
|
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());
|
||||||
/*
|
|
||||||
let mut node2 = Context::make_node(
|
|
||||||
&ctx,
|
|
||||||
// node type
|
|
||||||
Context::parse(&ctx, "<List Char>"),
|
|
||||||
// depth
|
|
||||||
SingletonBuffer::new(0).get_port(),
|
|
||||||
)
|
|
||||||
.unwrap();
|
|
||||||
*/
|
|
||||||
// add a display view to the node
|
|
||||||
//node2 = nested_tty::editors::node_make_tty_view(node2);
|
|
||||||
|
|
||||||
/* Create a <List Char>-Node with editor & view
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
let mut node3 = Context::make_node(
|
|
||||||
&ctx,
|
|
||||||
// node type
|
|
||||||
Context::parse(&ctx, "<List <List Char>>"),
|
|
||||||
// depth
|
|
||||||
SingletonBuffer::new(0).get_port(),
|
|
||||||
)
|
|
||||||
.unwrap();
|
|
||||||
*/
|
|
||||||
// add a display view to the node
|
|
||||||
//node3 = nested_tty::editors::node_make_tty_view(node3);
|
|
||||||
|
|
||||||
/* setup terminal
|
/* setup terminal
|
||||||
*/
|
*/
|
||||||
let app = TTYApplication::new({
|
let app = TTYApplication::new({
|
||||||
/* event handler
|
/* event handler
|
||||||
*/
|
*/
|
||||||
|
|
||||||
let ctx = ctx.clone();
|
let ctx = ctx.clone();
|
||||||
// let node1 = node1.clone();
|
let et1 = edittree.clone();
|
||||||
// let node2 = node2.clone();
|
|
||||||
// let node3 = node3.clone();
|
|
||||||
move |ev| {
|
move |ev| {
|
||||||
// let mut node1 = node1.clone();
|
et1.write().unwrap().send_cmd_obj(ev.to_repr_tree(&ctx));
|
||||||
// let mut node2 = node2.clone();
|
|
||||||
// let mut node3 = node3.clone();
|
|
||||||
// node1.send_cmd_obj(ev.to_repr_tree(&ctx));
|
|
||||||
// node2.send_cmd_obj(ev.to_repr_tree(&ctx));
|
|
||||||
// node3.send_cmd_obj(ev.to_repr_tree(&ctx));
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -142,42 +132,22 @@ async fn main() {
|
||||||
})
|
})
|
||||||
.offset(Vector2::new(5, 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(&node1.get_type());
|
let label = ctx.read().unwrap().type_term_to_str(&rt_digit.read().unwrap().get_type());
|
||||||
compositor
|
compositor
|
||||||
.write()
|
.write()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.push(nested_tty::make_label(&label).offset(Vector2::new(0, 2)));
|
.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
|
compositor
|
||||||
.write()
|
.write()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.push(node1.display_view().offset(Vector2::new(15, 2)));
|
.push(nested_tty::make_label(&label).offset(Vector2::new(0, 3)));
|
||||||
*/
|
|
||||||
/*
|
|
||||||
let label2 = ctx.read().unwrap().type_term_to_str(&node2.get_type());
|
|
||||||
compositor
|
|
||||||
.write()
|
|
||||||
.unwrap()
|
|
||||||
.push(nested_tty::make_label(&label2).offset(Vector2::new(0, 3)));
|
|
||||||
|
|
||||||
compositor
|
|
||||||
.write()
|
|
||||||
.unwrap()
|
|
||||||
.push(node2.display_view().offset(Vector2::new(15, 3)));
|
|
||||||
|
|
||||||
|
|
||||||
let label3 = ctx.read().unwrap().type_term_to_str(&node3.get_type());
|
|
||||||
compositor
|
|
||||||
.write()
|
|
||||||
.unwrap()
|
|
||||||
.push(nested_tty::make_label(&label3).offset(Vector2::new(0, 4)));
|
|
||||||
|
|
||||||
compositor
|
|
||||||
.write()
|
|
||||||
.unwrap()
|
|
||||||
.push(node3.display_view().offset(Vector2::new(25, 4)));
|
|
||||||
*/
|
|
||||||
/* write the changes in the view of `term_port` to the terminal
|
/* write the changes in the view of `term_port` to the terminal
|
||||||
*/
|
*/
|
||||||
app.show().await.expect("output error!");
|
app.show().await.expect("output error!");
|
||||||
|
|
|
@ -10,6 +10,6 @@ pub use {
|
||||||
cursor::TreeCursor,
|
cursor::TreeCursor,
|
||||||
nav::{TreeNav, TreeNavResult, TreeHeightOp},
|
nav::{TreeNav, TreeNavResult, TreeHeightOp},
|
||||||
treetype::{TreeType},
|
treetype::{TreeType},
|
||||||
node::NestedNode
|
node::EditTree
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@ use {
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct NestedNodeDisplay {
|
pub struct EdittreeDisplay {
|
||||||
/// display view
|
/// display view
|
||||||
pub view: Arc<RwLock<ReprTree>>,
|
pub view: Arc<RwLock<ReprTree>>,
|
||||||
|
|
||||||
|
@ -26,13 +26,13 @@ pub struct NestedNodeDisplay {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct NestedNodeEdit {
|
pub struct EdittreeControl {
|
||||||
/// abstract editor
|
/// abstract editor
|
||||||
pub editor: SingletonBuffer<
|
pub editor: SingletonBuffer<
|
||||||
Option< Arc<dyn Any + Send + Sync> >
|
Option< Arc<dyn Any + Send + Sync> >
|
||||||
>,
|
>,
|
||||||
|
|
||||||
pub spillbuf: Arc<RwLock< Vec< Arc<RwLock< NestedNode >> > >>,
|
pub spillbuf: Arc<RwLock< Vec< Arc<RwLock< EditTree >> > >>,
|
||||||
|
|
||||||
/// commander & navigation
|
/// commander & navigation
|
||||||
pub cmd: SingletonBuffer<
|
pub cmd: SingletonBuffer<
|
||||||
|
@ -51,26 +51,26 @@ pub struct NestedNodeEdit {
|
||||||
* TODO: rename to EditNode
|
* TODO: rename to EditNode
|
||||||
*/
|
*/
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct NestedNode {
|
pub struct EditTree {
|
||||||
/// context
|
/// context
|
||||||
pub ctx: Arc<RwLock<Context>>,
|
pub ctx: Arc<RwLock<Context>>,
|
||||||
|
|
||||||
/// viewports for terminal display
|
/// viewports for terminal display
|
||||||
pub disp: NestedNodeDisplay,
|
pub disp: EdittreeDisplay,
|
||||||
|
|
||||||
/// editor & commander objects
|
/// editor & commander objects
|
||||||
pub edit: NestedNodeEdit
|
pub ctrl: EdittreeControl
|
||||||
}
|
}
|
||||||
|
|
||||||
impl NestedNode {
|
impl EditTree {
|
||||||
pub fn new(ctx: Arc<RwLock<Context>>, depth: OuterViewPort<dyn SingletonView<Item = usize>>) -> Self {
|
pub fn new(ctx: Arc<RwLock<Context>>, depth: OuterViewPort<dyn SingletonView<Item = usize>>) -> Self {
|
||||||
NestedNode {
|
EditTree {
|
||||||
disp: NestedNodeDisplay {
|
disp: EdittreeDisplay {
|
||||||
view: ReprTree::new_arc(Context::parse(&ctx, "Display")),
|
view: ReprTree::new_arc(Context::parse(&ctx, "Display")),
|
||||||
diag: None,
|
diag: None,
|
||||||
depth,
|
depth,
|
||||||
},
|
},
|
||||||
edit: NestedNodeEdit {
|
ctrl: EdittreeControl {
|
||||||
editor: SingletonBuffer::new(None),
|
editor: SingletonBuffer::new(None),
|
||||||
spillbuf: Arc::new(RwLock::new(Vec::new())),
|
spillbuf: Arc::new(RwLock::new(Vec::new())),
|
||||||
cmd: SingletonBuffer::new(None),
|
cmd: SingletonBuffer::new(None),
|
||||||
|
@ -82,17 +82,17 @@ impl NestedNode {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_editor(mut self, editor: Arc<dyn Any + Send + Sync>) -> Self {
|
pub fn set_editor(mut self, editor: Arc<dyn Any + Send + Sync>) -> Self {
|
||||||
self.edit.editor.set(Some(editor));
|
self.ctrl.editor.set(Some(editor));
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_cmd(mut self, cmd: Arc<RwLock<dyn ObjCommander + Send + Sync>>) -> Self {
|
pub fn set_cmd(mut self, cmd: Arc<RwLock<dyn ObjCommander + Send + Sync>>) -> Self {
|
||||||
self.edit.cmd.set(Some(cmd));
|
self.ctrl.cmd.set(Some(cmd));
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_nav(mut self, nav: Arc<RwLock<dyn TreeNav + Send + Sync>>) -> Self {
|
pub fn set_nav(mut self, nav: Arc<RwLock<dyn TreeNav + Send + Sync>>) -> Self {
|
||||||
self.edit.tree_nav.set(Some(nav));
|
self.ctrl.tree_nav.set(Some(nav));
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -108,7 +108,7 @@ impl NestedNode {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_edit<T: Send + Sync + 'static>(&self) -> Option<Arc<RwLock<T>>> {
|
pub fn get_edit<T: Send + Sync + 'static>(&self) -> Option<Arc<RwLock<T>>> {
|
||||||
if let Some(edit) = self.edit.editor.get() {
|
if let Some(edit) = self.ctrl.editor.get() {
|
||||||
if let Ok(edit) = edit.downcast::<RwLock<T>>() {
|
if let Ok(edit) = edit.downcast::<RwLock<T>>() {
|
||||||
Some(edit)
|
Some(edit)
|
||||||
} else {
|
} else {
|
||||||
|
@ -132,9 +132,9 @@ impl TreeType for NestedNode {
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
impl TreeNav for NestedNode {
|
impl TreeNav for EditTree {
|
||||||
fn get_cursor(&self) -> TreeCursor {
|
fn get_cursor(&self) -> TreeCursor {
|
||||||
if let Some(tn) = self.edit.tree_nav.get() {
|
if let Some(tn) = self.ctrl.tree_nav.get() {
|
||||||
tn.read().unwrap().get_cursor()
|
tn.read().unwrap().get_cursor()
|
||||||
} else {
|
} else {
|
||||||
TreeCursor::default()
|
TreeCursor::default()
|
||||||
|
@ -142,7 +142,7 @@ impl TreeNav for NestedNode {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_addr_view(&self) -> OuterViewPort<dyn SequenceView<Item = isize>> {
|
fn get_addr_view(&self) -> OuterViewPort<dyn SequenceView<Item = isize>> {
|
||||||
if let Some(tn) = self.edit.tree_nav.get() {
|
if let Some(tn) = self.ctrl.tree_nav.get() {
|
||||||
tn.read().unwrap().get_addr_view()
|
tn.read().unwrap().get_addr_view()
|
||||||
} else {
|
} else {
|
||||||
OuterViewPort::default()
|
OuterViewPort::default()
|
||||||
|
@ -150,7 +150,7 @@ impl TreeNav for NestedNode {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_mode_view(&self) -> OuterViewPort<dyn SingletonView<Item = ListCursorMode>> {
|
fn get_mode_view(&self) -> OuterViewPort<dyn SingletonView<Item = ListCursorMode>> {
|
||||||
if let Some(tn) = self.edit.tree_nav.get() {
|
if let Some(tn) = self.ctrl.tree_nav.get() {
|
||||||
tn.read().unwrap().get_mode_view()
|
tn.read().unwrap().get_mode_view()
|
||||||
} else {
|
} else {
|
||||||
OuterViewPort::default()
|
OuterViewPort::default()
|
||||||
|
@ -158,7 +158,7 @@ impl TreeNav for NestedNode {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_cursor_warp(&self) -> TreeCursor {
|
fn get_cursor_warp(&self) -> TreeCursor {
|
||||||
if let Some(tn) = self.edit.tree_nav.get() {
|
if let Some(tn) = self.ctrl.tree_nav.get() {
|
||||||
tn.read().unwrap().get_cursor_warp()
|
tn.read().unwrap().get_cursor_warp()
|
||||||
} else {
|
} else {
|
||||||
TreeCursor::default()
|
TreeCursor::default()
|
||||||
|
@ -166,7 +166,7 @@ impl TreeNav for NestedNode {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_height(&self, op: &TreeHeightOp) -> usize {
|
fn get_height(&self, op: &TreeHeightOp) -> usize {
|
||||||
if let Some(tn) = self.edit.tree_nav.get() {
|
if let Some(tn) = self.ctrl.tree_nav.get() {
|
||||||
tn.read().unwrap().get_height( op )
|
tn.read().unwrap().get_height( op )
|
||||||
} else {
|
} else {
|
||||||
0
|
0
|
||||||
|
@ -174,7 +174,7 @@ impl TreeNav for NestedNode {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn goby(&mut self, direction: Vector2<isize>) -> TreeNavResult {
|
fn goby(&mut self, direction: Vector2<isize>) -> TreeNavResult {
|
||||||
if let Some(tn) = self.edit.tree_nav.get() {
|
if let Some(tn) = self.ctrl.tree_nav.get() {
|
||||||
tn.write().unwrap().goby(direction)
|
tn.write().unwrap().goby(direction)
|
||||||
} else {
|
} else {
|
||||||
TreeNavResult::Exit
|
TreeNavResult::Exit
|
||||||
|
@ -182,7 +182,7 @@ impl TreeNav for NestedNode {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn goto(&mut self, new_cursor: TreeCursor) -> TreeNavResult {
|
fn goto(&mut self, new_cursor: TreeCursor) -> TreeNavResult {
|
||||||
if let Some(tn) = self.edit.tree_nav.get() {
|
if let Some(tn) = self.ctrl.tree_nav.get() {
|
||||||
tn.write().unwrap().goto(new_cursor)
|
tn.write().unwrap().goto(new_cursor)
|
||||||
} else {
|
} else {
|
||||||
TreeNavResult::Exit
|
TreeNavResult::Exit
|
||||||
|
@ -192,7 +192,7 @@ impl TreeNav for NestedNode {
|
||||||
|
|
||||||
use crate::edit_tree::nav::TreeNavCmd;
|
use crate::edit_tree::nav::TreeNavCmd;
|
||||||
|
|
||||||
impl ObjCommander for NestedNode {
|
impl ObjCommander for EditTree {
|
||||||
fn send_cmd_obj(&mut self, cmd_obj: Arc<RwLock<ReprTree>>) -> TreeNavResult {
|
fn send_cmd_obj(&mut self, cmd_obj: Arc<RwLock<ReprTree>>) -> TreeNavResult {
|
||||||
|
|
||||||
if cmd_obj.read().unwrap().get_type() == &Context::parse(&self.ctx, "TreeNavCmd") {
|
if cmd_obj.read().unwrap().get_type() == &Context::parse(&self.ctx, "TreeNavCmd") {
|
||||||
|
@ -211,7 +211,7 @@ impl ObjCommander for NestedNode {
|
||||||
} else {
|
} else {
|
||||||
TreeNavResult::Exit
|
TreeNavResult::Exit
|
||||||
}
|
}
|
||||||
} else if let Some(cmd) = self.edit.cmd.get() {
|
} else if let Some(cmd) = self.ctrl.cmd.get() {
|
||||||
// todo: filter out tree-nav cmds and send them to tree_nav
|
// todo: filter out tree-nav cmds and send them to tree_nav
|
||||||
cmd.write().unwrap().send_cmd_obj(cmd_obj)
|
cmd.write().unwrap().send_cmd_obj(cmd_obj)
|
||||||
} else {
|
} else {
|
||||||
|
@ -221,7 +221,7 @@ impl ObjCommander for NestedNode {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
impl Diagnostics for NestedNode {
|
impl Diagnostics for EditTree {
|
||||||
fn get_msg_port(&self) -> OuterViewPort<dyn SequenceView<Item = Message>> {
|
fn get_msg_port(&self) -> OuterViewPort<dyn SequenceView<Item = Message>> {
|
||||||
self.get_diag()
|
self.get_diag()
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,21 +9,45 @@ use {
|
||||||
laddertypes::{TypeTerm},
|
laddertypes::{TypeTerm},
|
||||||
crate::{
|
crate::{
|
||||||
repr_tree::{Context, ReprTree},
|
repr_tree::{Context, ReprTree},
|
||||||
edit_tree::{NestedNode, TreeNavResult},
|
edit_tree::{EditTree, TreeNavResult},
|
||||||
editors::ObjCommander,
|
editors::ObjCommander,
|
||||||
},
|
},
|
||||||
std::sync::Arc,
|
std::sync::Arc,
|
||||||
std::sync::RwLock
|
std::sync::RwLock
|
||||||
};
|
};
|
||||||
|
|
||||||
pub fn init_ctx( ctx: &mut Context ) {
|
pub fn init_ctx( ctx: Arc<RwLock<Context>> ) {
|
||||||
/*
|
|
||||||
ctx.add_node_ctor(
|
let morphtype =
|
||||||
"Char",
|
crate::repr_tree::MorphismType {
|
||||||
Arc::new(|ctx: Arc<RwLock<Context>>, _ty: TypeTerm, depth: OuterViewPort<dyn SingletonView<Item = usize>>| {
|
src_type: Context::parse(&ctx, "Char"),
|
||||||
Some(CharEditor::new_node(ctx, depth))
|
dst_type: Context::parse(&ctx, "Char~EditTree")
|
||||||
}));
|
};
|
||||||
|
|
||||||
|
ctx.write().unwrap()
|
||||||
|
.morphisms
|
||||||
|
.add_morphism(
|
||||||
|
morphtype,
|
||||||
|
{
|
||||||
|
let ctx = ctx.clone();
|
||||||
|
move |rt, σ| {
|
||||||
|
/* Create EditTree object
|
||||||
*/
|
*/
|
||||||
|
let mut edittree_char = CharEditor::new_edit_tree(
|
||||||
|
ctx.clone(),
|
||||||
|
r3vi::buffer::singleton::SingletonBuffer::<usize>::new(0).get_port()
|
||||||
|
);
|
||||||
|
|
||||||
|
/* Insert EditTree into ReprTree
|
||||||
|
*/
|
||||||
|
let mut rt = rt.write().unwrap();
|
||||||
|
rt.insert_leaf(
|
||||||
|
vec![ Context::parse(&ctx, "EditTree") ].into_iter(),
|
||||||
|
SingletonBuffer::new( Arc::new(RwLock::new( edittree_char )) ).get_port().into()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct CharEditor {
|
pub struct CharEditor {
|
||||||
|
@ -71,19 +95,16 @@ impl CharEditor {
|
||||||
self.get_port().get_view().unwrap().get()
|
self.get_port().get_view().unwrap().get()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn new_node(ctx0: Arc<RwLock<Context>>, depth: OuterViewPort<dyn SingletonView<Item = usize>>) -> NestedNode {
|
pub fn new_edit_tree(
|
||||||
|
ctx0: Arc<RwLock<Context>>,
|
||||||
|
depth: OuterViewPort<dyn SingletonView<Item = usize>>
|
||||||
|
) -> EditTree {
|
||||||
let data = SingletonBuffer::new('\0');
|
let data = SingletonBuffer::new('\0');
|
||||||
let ctx = ctx0.clone();
|
let ctx = ctx0.clone();
|
||||||
let editor = Arc::new(RwLock::new(CharEditor{ ctx, data: data.clone() }));
|
let editor = Arc::new(RwLock::new(CharEditor{ ctx, data: data.clone() }));
|
||||||
|
|
||||||
NestedNode::new(
|
EditTree::new(
|
||||||
ctx0.clone(),
|
ctx0.clone(),
|
||||||
/*
|
|
||||||
ReprTree::new_leaf(
|
|
||||||
ctx0.read().unwrap().type_term_from_str("Char").unwrap(),
|
|
||||||
data.get_port().into()
|
|
||||||
),
|
|
||||||
*/
|
|
||||||
depth
|
depth
|
||||||
)
|
)
|
||||||
.set_cmd( editor.clone() )
|
.set_cmd( editor.clone() )
|
||||||
|
|
|
@ -14,7 +14,7 @@ use {
|
||||||
crate::{
|
crate::{
|
||||||
editors::{list::{ListCmd}, ObjCommander},
|
editors::{list::{ListCmd}, ObjCommander},
|
||||||
repr_tree::{Context, ReprTree},
|
repr_tree::{Context, ReprTree},
|
||||||
edit_tree::{NestedNode, TreeNav, TreeNavResult, TreeCursor, diagnostics::{Message}},
|
edit_tree::{EditTree, TreeNav, TreeNavResult, TreeCursor, diagnostics::{Message}},
|
||||||
},
|
},
|
||||||
std::sync::Arc,
|
std::sync::Arc,
|
||||||
std::sync::RwLock,
|
std::sync::RwLock,
|
||||||
|
@ -22,6 +22,51 @@ use {
|
||||||
cgmath::{Point2}
|
cgmath::{Point2}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
pub fn init_ctx( ctx: Arc<RwLock<Context>> ) {
|
||||||
|
|
||||||
|
// todo: proper scoping of Radix variable
|
||||||
|
ctx.write().unwrap().add_varname("Radix");
|
||||||
|
let morphtype =
|
||||||
|
crate::repr_tree::MorphismType {
|
||||||
|
src_type: Context::parse(&ctx, "<Digit Radix>"),
|
||||||
|
dst_type: Context::parse(&ctx, "<Digit Radix>~EditTree")
|
||||||
|
};
|
||||||
|
|
||||||
|
ctx.write().unwrap()
|
||||||
|
.morphisms
|
||||||
|
.add_morphism(
|
||||||
|
morphtype,
|
||||||
|
{
|
||||||
|
let ctx = ctx.clone();
|
||||||
|
move |rt, σ| {
|
||||||
|
let radix =
|
||||||
|
match σ.get( &laddertypes::TypeID::Var(ctx.read().unwrap().get_var_typeid("Radix").unwrap()) ) {
|
||||||
|
Some(TypeTerm::Num(n)) => *n as u32,
|
||||||
|
_ => 0
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Create EditTree object
|
||||||
|
*/
|
||||||
|
let mut edittree_digit = DigitEditor::new(
|
||||||
|
ctx.clone(),
|
||||||
|
radix
|
||||||
|
).into_node(
|
||||||
|
r3vi::buffer::singleton::SingletonBuffer::<usize>::new(0).get_port()
|
||||||
|
);
|
||||||
|
|
||||||
|
/* Insert EditTree into ReprTree
|
||||||
|
*/
|
||||||
|
let mut rt = rt.write().unwrap();
|
||||||
|
rt.insert_leaf(
|
||||||
|
vec![ Context::parse(&ctx, "EditTree") ].into_iter(),
|
||||||
|
SingletonBuffer::new( Arc::new(RwLock::new(edittree_digit)) ).get_port().into()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>
|
//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>
|
||||||
|
|
||||||
pub struct DigitEditor {
|
pub struct DigitEditor {
|
||||||
|
@ -49,9 +94,7 @@ impl ObjCommander for DigitEditor {
|
||||||
/* in case the character c is not in the range of digit-chars,
|
/* in case the character c is not in the range of digit-chars,
|
||||||
add a message to the diagnostics view
|
add a message to the diagnostics view
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
let message = IndexBuffer::from_iter(vec![
|
let message = IndexBuffer::from_iter(vec![
|
||||||
(Point2::new(1, 0), make_label("invalid digit '")),
|
(Point2::new(1, 0), make_label("invalid digit '")),
|
||||||
(Point2::new(2, 0), make_label(&format!("{}", c))
|
(Point2::new(2, 0), make_label(&format!("{}", c))
|
||||||
|
@ -83,40 +126,39 @@ impl DigitEditor {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn into_node(self, depth: OuterViewPort<dyn SingletonView<Item = usize>>) -> NestedNode {
|
pub fn into_node(self, depth: OuterViewPort<dyn SingletonView<Item = usize>>) -> EditTree {
|
||||||
let data = self.get_data();
|
let data = self.get_data();
|
||||||
let editor = Arc::new(RwLock::new(self));
|
let editor = Arc::new(RwLock::new(self));
|
||||||
let ed = editor.write().unwrap();
|
let ed = editor.write().unwrap();
|
||||||
let r = ed.radix;
|
let r = ed.radix;
|
||||||
|
|
||||||
NestedNode::new(ed.ctx.clone(), /*data,*/ depth)
|
EditTree::new(ed.ctx.clone(), depth)
|
||||||
|
.set_editor(editor.clone())
|
||||||
.set_cmd(editor.clone())
|
.set_cmd(editor.clone())
|
||||||
/*
|
|
||||||
.set_view(
|
|
||||||
ed.data
|
|
||||||
.get_port()
|
|
||||||
.map(move |c| {
|
|
||||||
TerminalAtom::new(
|
|
||||||
c.unwrap_or('?'),
|
|
||||||
if c.unwrap_or('?').to_digit(r).is_some() {
|
|
||||||
TerminalStyle::fg_color((90, 160, 90))
|
|
||||||
} else {
|
|
||||||
//TerminalStyle::bg_color((90, 10, 10))
|
|
||||||
TerminalStyle::fg_color((200, 40, 40))
|
|
||||||
},
|
|
||||||
)
|
|
||||||
})
|
|
||||||
.to_grid()
|
|
||||||
)
|
|
||||||
.set_diag(
|
.set_diag(
|
||||||
ed.msg.get_port().to_sequence()
|
ed.msg.get_port().to_sequence()
|
||||||
)
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn attach_to(&mut self, source: OuterViewPort<dyn SingletonView<Item = u32>>) {
|
||||||
|
/*
|
||||||
|
source.add_observer(
|
||||||
|
Arc::new(NotifyFnObserver::new(|_msg| {
|
||||||
|
self.data.set( source.get() )
|
||||||
|
}))
|
||||||
|
);
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_data_port(&self) -> OuterViewPort<dyn SingletonView<Item = Option<u32>>> {
|
pub fn get_data_port(&self) -> OuterViewPort<dyn SingletonView<Item = Result<u32, char>>> {
|
||||||
let radix = self.radix;
|
let radix = self.radix;
|
||||||
self.data.get_port().map(move |c| c?.to_digit(radix))
|
self.data.get_port().map(move |c|
|
||||||
|
if let Some(d) = c.unwrap_or('?').to_digit(radix) {
|
||||||
|
Ok(d)
|
||||||
|
} else {
|
||||||
|
Err(c.unwrap_or('?'))
|
||||||
|
}
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_type(&self) -> TypeTerm {
|
pub fn get_type(&self) -> TypeTerm {
|
||||||
|
@ -134,10 +176,9 @@ impl DigitEditor {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
pub struct PosIntEditor {
|
pub struct PosIntEditor {
|
||||||
radix: u32,
|
radix: u32,
|
||||||
digits: NestedNode,
|
digits: EditTree,
|
||||||
|
|
||||||
// todo: endianness
|
// todo: endianness
|
||||||
}
|
}
|
||||||
|
@ -179,7 +220,7 @@ impl PosIntEditor {
|
||||||
*/
|
*/
|
||||||
PosIntEditor {
|
PosIntEditor {
|
||||||
radix,
|
radix,
|
||||||
digits: NestedNode::new(
|
digits: EditTree::new(
|
||||||
ctx,
|
ctx,
|
||||||
r3vi::buffer::singleton::SingletonBuffer::new(0).get_port()
|
r3vi::buffer::singleton::SingletonBuffer::new(0).get_port()
|
||||||
)
|
)
|
||||||
|
@ -207,7 +248,7 @@ impl PosIntEditor {
|
||||||
self.digits.goto(TreeCursor::none());
|
self.digits.goto(TreeCursor::none());
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn into_node(self) -> NestedNode {
|
pub fn into_node(self) -> EditTree {
|
||||||
self.digits
|
self.digits
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@ use {
|
||||||
crate::{
|
crate::{
|
||||||
editors::{list::{ListEditor, ListCursor, ListCursorMode}, ObjCommander},
|
editors::{list::{ListEditor, ListCursor, ListCursorMode}, ObjCommander},
|
||||||
repr_tree::{Context, ReprTree},
|
repr_tree::{Context, ReprTree},
|
||||||
edit_tree::{NestedNode, TreeNav, TreeNavResult, TreeCursor},
|
edit_tree::{EditTree, TreeNav, TreeNavResult, TreeCursor},
|
||||||
},
|
},
|
||||||
std::sync::{Arc, RwLock}
|
std::sync::{Arc, RwLock}
|
||||||
};
|
};
|
||||||
|
@ -35,7 +35,7 @@ impl ObjCommander for ListEditor {
|
||||||
fn send_cmd_obj(&mut self, cmd_obj: Arc<RwLock<ReprTree>>) -> TreeNavResult {
|
fn send_cmd_obj(&mut self, cmd_obj: Arc<RwLock<ReprTree>>) -> TreeNavResult {
|
||||||
let cmd_repr = cmd_obj.read().unwrap();
|
let cmd_repr = cmd_obj.read().unwrap();
|
||||||
|
|
||||||
if let Some(view) = cmd_repr.get_view::<dyn SingletonView<Item = NestedNode>>() {
|
if let Some(view) = cmd_repr.get_view::<dyn SingletonView<Item = EditTree>>() {
|
||||||
let node = view.get();
|
let node = view.get();
|
||||||
let cur = self.cursor.get();
|
let cur = self.cursor.get();
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
use {
|
use {
|
||||||
r3vi::{view::{OuterViewPort, singleton::*}},
|
r3vi::{view::{OuterViewPort, singleton::*}, buffer::singleton::*},
|
||||||
laddertypes::{TypeTerm},
|
laddertypes::{TypeTerm},
|
||||||
crate::{
|
crate::{
|
||||||
repr_tree::{Context},
|
repr_tree::{Context},
|
||||||
|
@ -10,33 +10,37 @@ use {
|
||||||
|
|
||||||
//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>
|
//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>
|
||||||
|
|
||||||
pub fn init_ctx(ctx: &mut Context) {
|
pub fn init_ctx(ctx: Arc<RwLock<Context>>) {
|
||||||
ctx.add_typename("ListCmd".into());
|
ctx.write().unwrap().add_list_typename("List".into());
|
||||||
ctx.add_list_typename("List".into());
|
ctx.write().unwrap().add_varname("Item");
|
||||||
/*
|
let mt = crate::repr_tree::MorphismType {
|
||||||
ctx.add_node_ctor(
|
src_type: Context::parse(&ctx, "<List Item>"),
|
||||||
"List", Arc::new(
|
dst_type: Context::parse(&ctx, "<List Item>~EditTree")
|
||||||
|ctx: Arc<RwLock<Context>>, ty: TypeTerm, depth: OuterViewPort<dyn SingletonView<Item = usize>>| {
|
};
|
||||||
match ty {
|
ctx.write().unwrap().morphisms.add_morphism(
|
||||||
TypeTerm::App(args) => {
|
mt,
|
||||||
if args.len() > 1 {
|
{
|
||||||
let typ = args[1].clone();
|
let ctx = ctx.clone();
|
||||||
|
move |rt, σ| {
|
||||||
let mut node = ListEditor::new(ctx.clone(), typ).into_node(depth);
|
let item_id = laddertypes::TypeID::Var( ctx.read().unwrap().get_var_typeid("Item").unwrap() );
|
||||||
|
if let Some( item_type ) = σ.get( &item_id ) {
|
||||||
// PTYListController::for_node( &mut node, Some(','), Some('}') );
|
let mut edittree_list = ListEditor::new(
|
||||||
// PTYListStyle::for_node( &mut node, ("{",", ","}") );
|
ctx.clone(),
|
||||||
|
item_type.clone()
|
||||||
Some(node)
|
).into_node(
|
||||||
} else {
|
r3vi::buffer::singleton::SingletonBuffer::<usize>::new(0).get_port()
|
||||||
None
|
);
|
||||||
}
|
|
||||||
}
|
let mut rt = rt.write().unwrap();
|
||||||
_ => None
|
rt.insert_leaf(
|
||||||
}
|
vec![ Context::parse(&ctx, "EditTree") ].into_iter(),
|
||||||
}
|
SingletonBuffer::new( Arc::new(RwLock::new( edittree_list )) ).get_port().into()
|
||||||
)
|
);
|
||||||
|
} else {
|
||||||
|
eprintln!("no item type");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
);
|
);
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ use {
|
||||||
laddertypes::{TypeTerm},
|
laddertypes::{TypeTerm},
|
||||||
crate::{
|
crate::{
|
||||||
repr_tree::{Context, ReprTree},
|
repr_tree::{Context, ReprTree},
|
||||||
edit_tree::{NestedNode, TreeNav, TreeCursor, diagnostics::Diagnostics},
|
edit_tree::{EditTree, TreeNav, TreeCursor, diagnostics::Diagnostics},
|
||||||
editors::{list::{ListCursor, ListCursorMode, ListCmd}, ObjCommander},
|
editors::{list::{ListCursor, ListCursorMode, ListCmd}, ObjCommander},
|
||||||
},
|
},
|
||||||
std::sync::{Arc, RwLock}
|
std::sync::{Arc, RwLock}
|
||||||
|
@ -18,9 +18,9 @@ pub struct ListEditor {
|
||||||
pub cursor: SingletonBuffer<ListCursor>,
|
pub cursor: SingletonBuffer<ListCursor>,
|
||||||
|
|
||||||
// todo: (?) remove RwLock<..> around NestedNode ??
|
// todo: (?) remove RwLock<..> around NestedNode ??
|
||||||
pub data: VecBuffer< Arc<RwLock<NestedNode>> >,
|
pub data: VecBuffer< Arc<RwLock<EditTree>> >,
|
||||||
|
|
||||||
pub spillbuf: Arc<RwLock<Vec<Arc<RwLock<NestedNode>>>>>,
|
pub spillbuf: Arc<RwLock<Vec<Arc<RwLock<EditTree>>>>>,
|
||||||
|
|
||||||
pub(super) addr_port: OuterViewPort<dyn SequenceView<Item = isize>>,
|
pub(super) addr_port: OuterViewPort<dyn SequenceView<Item = isize>>,
|
||||||
pub(super) mode_port: OuterViewPort<dyn SingletonView<Item = ListCursorMode>>,
|
pub(super) mode_port: OuterViewPort<dyn SingletonView<Item = ListCursorMode>>,
|
||||||
|
@ -39,7 +39,7 @@ impl ListEditor {
|
||||||
typ: TypeTerm,
|
typ: TypeTerm,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
let cursor = SingletonBuffer::new(ListCursor::default());
|
let cursor = SingletonBuffer::new(ListCursor::default());
|
||||||
let data : VecBuffer<Arc<RwLock<NestedNode>>> = VecBuffer::new();
|
let data : VecBuffer<Arc<RwLock<EditTree>>> = VecBuffer::new();
|
||||||
|
|
||||||
ListEditor {
|
ListEditor {
|
||||||
mode_port: cursor
|
mode_port: cursor
|
||||||
|
@ -100,7 +100,7 @@ impl ListEditor {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn into_node(mut self, depth: OuterViewPort<dyn SingletonView<Item = usize>>) -> NestedNode {
|
pub fn into_node(mut self, depth: OuterViewPort<dyn SingletonView<Item = usize>>) -> EditTree {
|
||||||
let data = self.get_data();
|
let data = self.get_data();
|
||||||
let ctx = self.ctx.clone();
|
let ctx = self.ctx.clone();
|
||||||
|
|
||||||
|
@ -109,7 +109,7 @@ impl ListEditor {
|
||||||
|
|
||||||
let e = editor.read().unwrap();
|
let e = editor.read().unwrap();
|
||||||
|
|
||||||
let mut node = NestedNode::new(ctx, depth)
|
let mut node = EditTree::new(ctx, depth)
|
||||||
.set_editor(editor.clone())
|
.set_editor(editor.clone())
|
||||||
.set_nav(editor.clone())
|
.set_nav(editor.clone())
|
||||||
.set_cmd(editor.clone())
|
.set_cmd(editor.clone())
|
||||||
|
@ -131,7 +131,7 @@ impl ListEditor {
|
||||||
.flatten()
|
.flatten()
|
||||||
);
|
);
|
||||||
|
|
||||||
node.edit.spillbuf = e.spillbuf.clone();
|
node.ctrl.spillbuf = e.spillbuf.clone();
|
||||||
node
|
node
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -150,7 +150,7 @@ impl ListEditor {
|
||||||
self.cursor.get_port()
|
self.cursor.get_port()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_data_port(&self) -> OuterViewPort<dyn SequenceView<Item = NestedNode>> {
|
pub fn get_data_port(&self) -> OuterViewPort<dyn SequenceView<Item = EditTree>> {
|
||||||
self.data.get_port().to_sequence().map(
|
self.data.get_port().to_sequence().map(
|
||||||
|x| x.read().unwrap().clone()
|
|x| x.read().unwrap().clone()
|
||||||
)
|
)
|
||||||
|
@ -164,7 +164,7 @@ impl ListEditor {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_item(&self) -> Option<NestedNode> {
|
pub fn get_item(&self) -> Option<EditTree> {
|
||||||
if let Some(idx) = self.cursor.get().idx {
|
if let Some(idx) = self.cursor.get().idx {
|
||||||
let idx = crate::utils::modulo(idx as isize, self.data.len() as isize) as usize;
|
let idx = crate::utils::modulo(idx as isize, self.data.len() as isize) as usize;
|
||||||
if idx < self.data.len() {
|
if idx < self.data.len() {
|
||||||
|
@ -177,7 +177,7 @@ impl ListEditor {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_item_mut(&mut self) -> Option<MutableVecAccess<Arc<RwLock<NestedNode>>>> {
|
pub fn get_item_mut(&mut self) -> Option<MutableVecAccess<Arc<RwLock<EditTree>>>> {
|
||||||
if let Some(idx) = self.cursor.get().idx {
|
if let Some(idx) = self.cursor.get().idx {
|
||||||
let idx = crate::utils::modulo(idx as isize, self.data.len() as isize) as usize;
|
let idx = crate::utils::modulo(idx as isize, self.data.len() as isize) as usize;
|
||||||
if idx < self.data.len() {
|
if idx < self.data.len() {
|
||||||
|
@ -228,7 +228,7 @@ impl ListEditor {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// insert a new element
|
/// insert a new element
|
||||||
pub fn insert(&mut self, item: Arc<RwLock<NestedNode>>) {
|
pub fn insert(&mut self, item: Arc<RwLock<EditTree>>) {
|
||||||
item.read().unwrap().disp.depth.0.set_view(
|
item.read().unwrap().disp.depth.0.set_view(
|
||||||
self.depth.map(|d| d+1).get_view()
|
self.depth.map(|d| d+1).get_view()
|
||||||
);
|
);
|
||||||
|
@ -306,9 +306,15 @@ impl ListEditor {
|
||||||
self.set_leaf_mode(ListCursorMode::Insert);
|
self.set_leaf_mode(ListCursorMode::Insert);
|
||||||
self.nexd();
|
self.nexd();
|
||||||
|
|
||||||
let mut b = item.edit.spillbuf.write().unwrap();
|
let mut b = item.ctrl.spillbuf.write().unwrap();
|
||||||
/* TODO
|
|
||||||
let mut tail_node = Context::make_node(&self.ctx, self.typ.clone(), self.depth.map(|d| d+1)).unwrap();
|
let rt = ReprTree::new_arc(self.typ.clone());
|
||||||
|
let new_edittree = self.ctx.read().unwrap()
|
||||||
|
.setup_edittree(
|
||||||
|
rt,
|
||||||
|
self.depth.map(|d| d+1)
|
||||||
|
);
|
||||||
|
let mut tail_node = new_edittree.write().unwrap();
|
||||||
tail_node.goto(TreeCursor::home());
|
tail_node.goto(TreeCursor::home());
|
||||||
|
|
||||||
for node in b.iter() {
|
for node in b.iter() {
|
||||||
|
@ -316,7 +322,7 @@ impl ListEditor {
|
||||||
.send_cmd_obj(
|
.send_cmd_obj(
|
||||||
ReprTree::new_leaf(
|
ReprTree::new_leaf(
|
||||||
Context::parse(&self.ctx, "NestedNode"),
|
Context::parse(&self.ctx, "NestedNode"),
|
||||||
SingletonBuffer::<NestedNode>::new(
|
SingletonBuffer::<EditTree>::new(
|
||||||
node.read().unwrap().clone()
|
node.read().unwrap().clone()
|
||||||
).get_port().into()
|
).get_port().into()
|
||||||
)
|
)
|
||||||
|
@ -331,11 +337,12 @@ impl ListEditor {
|
||||||
if cur.tree_addr.len() > 1 {
|
if cur.tree_addr.len() > 1 {
|
||||||
tail_node.dn();
|
tail_node.dn();
|
||||||
}
|
}
|
||||||
|
drop(tail_node);
|
||||||
|
|
||||||
self.insert(
|
self.insert(
|
||||||
Arc::new(RwLock::new(tail_node))
|
new_edittree
|
||||||
);
|
);
|
||||||
*/
|
|
||||||
} else {
|
} else {
|
||||||
self.up();
|
self.up();
|
||||||
self.listlist_split();
|
self.listlist_split();
|
||||||
|
@ -366,12 +373,12 @@ impl ListEditor {
|
||||||
|
|
||||||
let old_cur = pxv_editor.get_cursor();
|
let old_cur = pxv_editor.get_cursor();
|
||||||
|
|
||||||
let data = cur_editor.edit.spillbuf.read().unwrap();
|
let data = cur_editor.ctrl.spillbuf.read().unwrap();
|
||||||
for x in data.iter() {
|
for x in data.iter() {
|
||||||
pxv_editor.send_cmd_obj(
|
pxv_editor.send_cmd_obj(
|
||||||
ReprTree::new_leaf(
|
ReprTree::new_leaf(
|
||||||
Context::parse(&self.ctx, "NestedNode"),
|
Context::parse(&self.ctx, "NestedNode"),
|
||||||
SingletonBuffer::<NestedNode>::new(
|
SingletonBuffer::<EditTree>::new(
|
||||||
x.read().unwrap().clone()
|
x.read().unwrap().clone()
|
||||||
).get_port().into()
|
).get_port().into()
|
||||||
)
|
)
|
||||||
|
@ -424,13 +431,13 @@ impl ListEditor {
|
||||||
leaf_mode: ListCursorMode::Insert
|
leaf_mode: ListCursorMode::Insert
|
||||||
});
|
});
|
||||||
|
|
||||||
let data = nxd_editor.edit.spillbuf.read().unwrap();
|
let data = nxd_editor.ctrl.spillbuf.read().unwrap();
|
||||||
|
|
||||||
for x in data.iter() {
|
for x in data.iter() {
|
||||||
cur_editor.send_cmd_obj(
|
cur_editor.send_cmd_obj(
|
||||||
ReprTree::new_leaf(
|
ReprTree::new_leaf(
|
||||||
Context::parse(&self.ctx, "NestedNode"),
|
Context::parse(&self.ctx, "NestedNode"),
|
||||||
SingletonBuffer::<NestedNode>::new(
|
SingletonBuffer::<EditTree>::new(
|
||||||
x.read().unwrap().clone()
|
x.read().unwrap().clone()
|
||||||
).get_port().into()
|
).get_port().into()
|
||||||
)
|
)
|
||||||
|
|
|
@ -9,7 +9,7 @@ use {
|
||||||
},
|
},
|
||||||
crate::{
|
crate::{
|
||||||
editors::list::{ListCursor, ListCursorMode},
|
editors::list::{ListCursor, ListCursorMode},
|
||||||
edit_tree::{NestedNode}
|
edit_tree::{EditTree}
|
||||||
},
|
},
|
||||||
std::sync::Arc,
|
std::sync::Arc,
|
||||||
std::sync::RwLock,
|
std::sync::RwLock,
|
||||||
|
@ -18,13 +18,13 @@ use {
|
||||||
pub enum ListSegment {
|
pub enum ListSegment {
|
||||||
InsertCursor,
|
InsertCursor,
|
||||||
Item {
|
Item {
|
||||||
editor: NestedNode,
|
editor: EditTree,
|
||||||
cur_dist: isize,
|
cur_dist: isize,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct ListSegmentSequence {
|
pub struct ListSegmentSequence {
|
||||||
data: Arc<dyn SequenceView<Item = NestedNode>>,
|
data: Arc<dyn SequenceView<Item = EditTree>>,
|
||||||
cursor: Arc<dyn SingletonView<Item = ListCursor>>,
|
cursor: Arc<dyn SingletonView<Item = ListCursor>>,
|
||||||
|
|
||||||
cur_cursor: ListCursor,
|
cur_cursor: ListCursor,
|
||||||
|
@ -88,7 +88,7 @@ impl SequenceView for ListSegmentSequence {
|
||||||
impl ListSegmentSequence {
|
impl ListSegmentSequence {
|
||||||
pub fn new(
|
pub fn new(
|
||||||
cursor_port: OuterViewPort<dyn SingletonView<Item = ListCursor>>,
|
cursor_port: OuterViewPort<dyn SingletonView<Item = ListCursor>>,
|
||||||
data_port: OuterViewPort<dyn SequenceView<Item = NestedNode>>,
|
data_port: OuterViewPort<dyn SequenceView<Item = EditTree>>,
|
||||||
) -> Arc<RwLock<Self>> {
|
) -> Arc<RwLock<Self>> {
|
||||||
let out_port = ViewPort::new();
|
let out_port = ViewPort::new();
|
||||||
let mut proj_helper = ProjectionHelper::new(out_port.update_hooks.clone());
|
let mut proj_helper = ProjectionHelper::new(out_port.update_hooks.clone());
|
||||||
|
|
|
@ -4,7 +4,7 @@ pub mod list;
|
||||||
//pub mod sum;
|
//pub mod sum;
|
||||||
|
|
||||||
pub mod char;
|
pub mod char;
|
||||||
//pub mod integer;
|
pub mod integer;
|
||||||
//pub mod typeterm;
|
//pub mod typeterm;
|
||||||
|
|
||||||
|
|
||||||
|
@ -24,3 +24,4 @@ pub trait ObjCommander {
|
||||||
fn send_cmd_obj(&mut self, cmd_obj: Arc<RwLock<ReprTree>>) -> TreeNavResult;
|
fn send_cmd_obj(&mut self, cmd_obj: Arc<RwLock<ReprTree>>) -> TreeNavResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ use {
|
||||||
laddertypes::{TypeDict, TypeTerm, TypeID},
|
laddertypes::{TypeDict, TypeTerm, TypeID},
|
||||||
crate::{
|
crate::{
|
||||||
repr_tree::{ReprTree, MorphismType, GenericReprTreeMorphism, MorphismBase},
|
repr_tree::{ReprTree, MorphismType, GenericReprTreeMorphism, MorphismBase},
|
||||||
edit_tree::NestedNode
|
edit_tree::EditTree
|
||||||
},
|
},
|
||||||
std::{
|
std::{
|
||||||
collections::HashMap,
|
collections::HashMap,
|
||||||
|
@ -29,12 +29,16 @@ pub struct Context {
|
||||||
pub list_types: Vec< TypeID >,
|
pub list_types: Vec< TypeID >,
|
||||||
pub meta_chars: Vec< char >,
|
pub meta_chars: Vec< char >,
|
||||||
|
|
||||||
|
edittree_hook: Arc< dyn Fn(Arc<RwLock<EditTree>>, TypeTerm) + Send +Sync +'static >,
|
||||||
|
|
||||||
/// recursion
|
/// recursion
|
||||||
parent: Option<Arc<RwLock<Context>>>,
|
parent: Option<Arc<RwLock<Context>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Context {
|
impl Context {
|
||||||
pub fn with_parent(parent: Option<Arc<RwLock<Context>>>) -> Self {
|
pub fn with_parent(
|
||||||
|
parent: Option<Arc<RwLock<Context>>>
|
||||||
|
) -> Self {
|
||||||
Context {
|
Context {
|
||||||
type_dict: match parent.as_ref() {
|
type_dict: match parent.as_ref() {
|
||||||
Some(p) => p.read().unwrap().type_dict.clone(),
|
Some(p) => p.read().unwrap().type_dict.clone(),
|
||||||
|
@ -51,6 +55,8 @@ impl Context {
|
||||||
None => Vec::new()
|
None => Vec::new()
|
||||||
},
|
},
|
||||||
parent,
|
parent,
|
||||||
|
|
||||||
|
edittree_hook: Arc::new(|_et, _t| {})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -58,6 +64,10 @@ impl Context {
|
||||||
Context::with_parent(None)
|
Context::with_parent(None)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn set_edittree_hook(&mut self, hook: Arc< dyn Fn(Arc<RwLock<EditTree>>, TypeTerm) + Send +Sync +'static >) {
|
||||||
|
self.edittree_hook = hook;
|
||||||
|
}
|
||||||
|
|
||||||
pub fn depth(&self) -> usize {
|
pub fn depth(&self) -> usize {
|
||||||
if let Some(parent) = self.parent.as_ref() {
|
if let Some(parent) = self.parent.as_ref() {
|
||||||
parent.read().unwrap().depth() + 1
|
parent.read().unwrap().depth() + 1
|
||||||
|
@ -165,6 +175,36 @@ impl Context {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn setup_edittree(
|
||||||
|
&self,
|
||||||
|
rt: Arc<RwLock<ReprTree>>,
|
||||||
|
depth: OuterViewPort<dyn SingletonView<Item = usize>>
|
||||||
|
) -> Arc<RwLock<EditTree>> {
|
||||||
|
let ladder = TypeTerm::Ladder(vec![
|
||||||
|
rt.read().unwrap().get_type().clone(),
|
||||||
|
self.type_term_from_str("EditTree").expect("")
|
||||||
|
]);
|
||||||
|
|
||||||
|
self.morphisms.morph(
|
||||||
|
rt.clone(),
|
||||||
|
&ladder
|
||||||
|
);
|
||||||
|
|
||||||
|
let new_edittree = rt
|
||||||
|
.read().unwrap()
|
||||||
|
.descend(
|
||||||
|
self.type_term_from_str("EditTree").expect("")
|
||||||
|
).unwrap()
|
||||||
|
.read().unwrap()
|
||||||
|
.get_view::<dyn SingletonView<Item = Arc<RwLock<EditTree>> >>()
|
||||||
|
.unwrap()
|
||||||
|
.get();
|
||||||
|
|
||||||
|
(*self.edittree_hook)( new_edittree.clone(), rt.read().unwrap().get_type().clone() );
|
||||||
|
|
||||||
|
new_edittree
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>
|
//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>
|
||||||
|
|
|
@ -7,7 +7,7 @@ pub use {
|
||||||
};
|
};
|
||||||
|
|
||||||
use {
|
use {
|
||||||
r3vi::view::{AnyOuterViewPort, OuterViewPort, View},
|
r3vi::view::{AnyOuterViewPort, OuterViewPort, View, singleton::*},
|
||||||
laddertypes::{TypeTerm},
|
laddertypes::{TypeTerm},
|
||||||
std::{
|
std::{
|
||||||
collections::HashMap,
|
collections::HashMap,
|
||||||
|
@ -26,10 +26,10 @@ pub struct ReprTree {
|
||||||
|
|
||||||
impl std::fmt::Debug for ReprTree {
|
impl std::fmt::Debug for ReprTree {
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
write!(f, "type: {:?}", self.type_tag)?;
|
writeln!(f, "| type: {:?}", self.type_tag)?;
|
||||||
|
|
||||||
for (_k,x) in self.branches.iter() {
|
for (_k,x) in self.branches.iter() {
|
||||||
write!(f, "child: {:?}", x)?;
|
writeln!(f, "|--> child: {:?}", x)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
@ -100,6 +100,13 @@ impl ReprTree {
|
||||||
//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>
|
//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>
|
||||||
|
|
||||||
|
|
||||||
|
pub fn view_char(&self) -> OuterViewPort<dyn SingletonView<Item = char>> {
|
||||||
|
self.get_port::<dyn SingletonView<Item = char>>().expect("no char-view available")
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn view_u64(&self) -> OuterViewPort<dyn SingletonView<Item = u64>> {
|
||||||
|
self.get_port::<dyn SingletonView<Item = u64>>().expect("no u64-view available")
|
||||||
|
}
|
||||||
|
|
||||||
pub fn get_port<V: View + ?Sized + 'static>(&self) -> Option<OuterViewPort<V>>
|
pub fn get_port<V: View + ?Sized + 'static>(&self) -> Option<OuterViewPort<V>>
|
||||||
where
|
where
|
||||||
|
|
|
@ -68,7 +68,6 @@ impl MorphismBase {
|
||||||
);
|
);
|
||||||
|
|
||||||
if let Ok(σ) = unification_problem.solve() {
|
if let Ok(σ) = unification_problem.solve() {
|
||||||
eprintln!("found matching morphism");
|
|
||||||
return Some((m, σ));
|
return Some((m, σ));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -81,7 +80,8 @@ impl MorphismBase {
|
||||||
repr_tree: Arc<RwLock<ReprTree>>,
|
repr_tree: Arc<RwLock<ReprTree>>,
|
||||||
target_type: &TypeTerm
|
target_type: &TypeTerm
|
||||||
) {
|
) {
|
||||||
if let Some((m, σ)) = self.find_morphism( repr_tree.read().unwrap().get_type(), target_type ) {
|
let t = repr_tree.read().unwrap().get_type().clone();
|
||||||
|
if let Some((m, σ)) = self.find_morphism( &t, target_type ) {
|
||||||
(m.repr_tree_op)( repr_tree.clone(), &σ );
|
(m.repr_tree_op)( repr_tree.clone(), &σ );
|
||||||
} else {
|
} else {
|
||||||
eprintln!("could not find morphism");
|
eprintln!("could not find morphism");
|
||||||
|
|
|
@ -107,3 +107,4 @@ impl TerminalEvent {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ use {
|
||||||
nested::{
|
nested::{
|
||||||
repr_tree::{Context, ReprTree},
|
repr_tree::{Context, ReprTree},
|
||||||
editors::list::*,
|
editors::list::*,
|
||||||
edit_tree::{TreeCursor, TreeNav, TreeNavResult, NestedNode},
|
edit_tree::{TreeCursor, TreeNav, TreeNavResult, EditTree},
|
||||||
},
|
},
|
||||||
crate::{
|
crate::{
|
||||||
DisplaySegment,
|
DisplaySegment,
|
||||||
|
@ -91,7 +91,7 @@ impl PTYListStyle {
|
||||||
.flatten()
|
.flatten()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn for_node(node: &mut NestedNode, style: (&str, &str, &str)) {
|
pub fn for_node(node: &mut EditTree, style: (&str, &str, &str)) {
|
||||||
node.disp.view
|
node.disp.view
|
||||||
.write().unwrap()
|
.write().unwrap()
|
||||||
.insert_branch(ReprTree::new_leaf(
|
.insert_branch(ReprTree::new_leaf(
|
||||||
|
@ -135,10 +135,11 @@ impl PTYListController {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn for_node(
|
pub fn for_node(
|
||||||
node: &mut NestedNode,
|
node: &mut EditTree,
|
||||||
split_char: Option<char>,
|
split_char: Option<char>,
|
||||||
close_char: Option<char>
|
close_char: Option<char>
|
||||||
) {
|
) {
|
||||||
|
/*
|
||||||
{
|
{
|
||||||
let ctx = node.ctx.as_ref();
|
let ctx = node.ctx.as_ref();
|
||||||
let mut ctx = ctx.write().unwrap();
|
let mut ctx = ctx.write().unwrap();
|
||||||
|
@ -150,15 +151,15 @@ impl PTYListController {
|
||||||
ctx.meta_chars.push(*c);
|
ctx.meta_chars.push(*c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
let editor = node.get_edit::<ListEditor>().unwrap();
|
let editor = node.get_edit::<ListEditor>().unwrap();
|
||||||
let controller = Arc::new(RwLock::new(PTYListController::from_editor( editor, split_char, close_char, node.disp.depth.clone() )));
|
let controller = Arc::new(RwLock::new(PTYListController::from_editor( editor, split_char, close_char, node.disp.depth.clone() )));
|
||||||
|
|
||||||
node.edit.cmd.set(Some(controller.clone()));
|
node.ctrl.cmd.set(Some(controller.clone()));
|
||||||
node.edit.close_char.set(close_char);
|
node.ctrl.close_char.set(close_char);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_data_port(&self) -> OuterViewPort<dyn SequenceView<Item = NestedNode>> {
|
pub fn get_data_port(&self) -> OuterViewPort<dyn SequenceView<Item = EditTree>> {
|
||||||
self.editor.read().unwrap().get_data_port()
|
self.editor.read().unwrap().get_data_port()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -166,7 +167,7 @@ impl PTYListController {
|
||||||
self.editor.write().unwrap().clear();
|
self.editor.write().unwrap().clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_item(&self) -> Option<NestedNode> {
|
pub fn get_item(&self) -> Option<EditTree> {
|
||||||
self.editor.read().unwrap().get_item()
|
self.editor.read().unwrap().get_item()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -219,26 +220,27 @@ impl PTYListController {
|
||||||
|
|
||||||
match cur.mode {
|
match cur.mode {
|
||||||
ListCursorMode::Insert => {
|
ListCursorMode::Insert => {
|
||||||
/* TODO
|
let rt = ReprTree::new_arc(e.typ.clone());
|
||||||
let mut new_edit = Context::make_node(&e.ctx, e.typ.clone(), self.depth.map(|d| d+1)).unwrap();
|
let new_edittree = ctx.setup_edittree(
|
||||||
new_edit.goto(TreeCursor::home());
|
rt,
|
||||||
|
self.depth.map(|d| d+1)
|
||||||
match new_edit.send_cmd_obj(cmd_obj.clone()) {
|
);
|
||||||
|
let mut ne = new_edittree.write().unwrap();
|
||||||
|
match ne.send_cmd_obj(cmd_obj.clone()) {
|
||||||
TreeNavResult::Continue => {
|
TreeNavResult::Continue => {
|
||||||
e.insert(Arc::new(RwLock::new(new_edit.clone())));
|
drop(ne);
|
||||||
|
e.insert(new_edittree.clone());
|
||||||
TreeNavResult::Continue
|
TreeNavResult::Continue
|
||||||
}
|
}
|
||||||
TreeNavResult::Exit => {
|
TreeNavResult::Exit => {
|
||||||
TreeNavResult::Exit
|
TreeNavResult::Exit
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
TreeNavResult::Continue
|
|
||||||
},
|
},
|
||||||
ListCursorMode::Select => {
|
ListCursorMode::Select => {
|
||||||
if let Some(item) = e.get_item_mut() {
|
if let Some(item) = e.get_item_mut() {
|
||||||
let res = item.write().unwrap().send_cmd_obj(cmd_obj.clone());
|
let res = item.write().unwrap().send_cmd_obj(cmd_obj.clone());
|
||||||
let child_close_char = item.read().unwrap().edit.close_char.get();
|
let child_close_char = item.read().unwrap().ctrl.close_char.get();
|
||||||
|
|
||||||
match res {
|
match res {
|
||||||
TreeNavResult::Continue => TreeNavResult::Continue,
|
TreeNavResult::Continue => TreeNavResult::Continue,
|
||||||
|
|
|
@ -3,7 +3,7 @@ pub mod list;
|
||||||
|
|
||||||
use {
|
use {
|
||||||
nested::{
|
nested::{
|
||||||
edit_tree::{NestedNode},
|
edit_tree::{EditTree},
|
||||||
repr_tree::{ReprTree, Context}
|
repr_tree::{ReprTree, Context}
|
||||||
},
|
},
|
||||||
r3vi::{
|
r3vi::{
|
||||||
|
@ -13,22 +13,22 @@ use {
|
||||||
crate::{
|
crate::{
|
||||||
make_label,
|
make_label,
|
||||||
DisplaySegment,
|
DisplaySegment,
|
||||||
atom::TerminalAtom
|
atom::{TerminalAtom, TerminalStyle}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
/*
|
|
||||||
pub fn node_make_char_view(
|
pub fn edittree_make_char_view(
|
||||||
node: NestedNode
|
node: EditTree
|
||||||
) -> NestedNode {
|
) -> EditTree {
|
||||||
node.disp.view
|
node.disp.view
|
||||||
.write().unwrap()
|
.write().unwrap()
|
||||||
.insert_branch(ReprTree::new_leaf(
|
.insert_branch(ReprTree::new_leaf(
|
||||||
Context::parse(&node.ctx, "TerminalView"),
|
Context::parse(&node.ctx, "TerminalView"),
|
||||||
node.data
|
node.get_edit::< nested::editors::char::CharEditor >()
|
||||||
|
.unwrap()
|
||||||
.read()
|
.read()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.get_port::<dyn SingletonView<Item = char>>()
|
.get_port()
|
||||||
.expect("unable to get Char-view")
|
|
||||||
.map(move |c| TerminalAtom::from(if c == '\0' { ' ' } else { c }))
|
.map(move |c| TerminalAtom::from(if c == '\0' { ' ' } else { c }))
|
||||||
.to_grid()
|
.to_grid()
|
||||||
.into(),
|
.into(),
|
||||||
|
@ -37,19 +37,46 @@ pub fn node_make_char_view(
|
||||||
node
|
node
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn node_make_seq_view(
|
pub fn edittree_make_digit_view(
|
||||||
mut node: NestedNode
|
node: EditTree
|
||||||
) -> NestedNode {
|
) -> EditTree {
|
||||||
node.disp.view
|
node.disp.view
|
||||||
.write().unwrap()
|
.write().unwrap()
|
||||||
.insert_branch(ReprTree::new_leaf(
|
.insert_branch(ReprTree::new_leaf(
|
||||||
Context::parse(&node.ctx, "TerminalView"),
|
Context::parse(&node.ctx, "TerminalView"),
|
||||||
node.data
|
node.get_edit::< nested::editors::integer::DigitEditor >()
|
||||||
|
.unwrap()
|
||||||
.read()
|
.read()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.get_port::<dyn SequenceView<Item = NestedNode>>()
|
.get_data_port()
|
||||||
.expect("unable to get Seq-view")
|
.map(move |digit|
|
||||||
.map(move |char_node| node_make_tty_view(char_node.clone()).display_view() )
|
match digit {
|
||||||
|
Ok(digit) => TerminalAtom::new( char::from_digit(digit, 16).unwrap_or('?'), TerminalStyle::fg_color((220, 220, 0)) ),
|
||||||
|
Err(c) => TerminalAtom::new( c, TerminalStyle::fg_color((220, 0, 0)) )
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.to_grid()
|
||||||
|
.into(),
|
||||||
|
));
|
||||||
|
|
||||||
|
node
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
pub fn edittree_make_seq_view(
|
||||||
|
mut node: EditTree
|
||||||
|
) -> EditTree {
|
||||||
|
node.disp.view
|
||||||
|
.write().unwrap()
|
||||||
|
.insert_branch(ReprTree::new_leaf(
|
||||||
|
Context::parse(&node.ctx, "TerminalView"),
|
||||||
|
node.get_edit::< nested::editors::list::ListEditor >()
|
||||||
|
.unwrap()
|
||||||
|
.read().unwrap()
|
||||||
|
.get_data_port()
|
||||||
|
.map(move |item_edittree|
|
||||||
|
edittree_make_tty_view( item_edittree ).display_view()
|
||||||
|
)
|
||||||
.wrap(make_label("("), make_label(")"))
|
.wrap(make_label("("), make_label(")"))
|
||||||
.to_grid_horizontal()
|
.to_grid_horizontal()
|
||||||
.flatten()
|
.flatten()
|
||||||
|
@ -57,28 +84,4 @@ pub fn node_make_seq_view(
|
||||||
));
|
));
|
||||||
node
|
node
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn node_make_list_edit(
|
|
||||||
mut node: NestedNode
|
|
||||||
) -> NestedNode {
|
|
||||||
list::PTYListStyle::for_node( &mut node, ("(", "", ")") );
|
|
||||||
list::PTYListController::for_node( &mut node, None, None );
|
|
||||||
|
|
||||||
node
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn node_make_tty_view(
|
|
||||||
node: NestedNode
|
|
||||||
) -> NestedNode {
|
|
||||||
if node.data.read().unwrap().get_type() == &Context::parse(&node.ctx, "Char") {
|
|
||||||
node_make_char_view( node )
|
|
||||||
} else if node.data.read().unwrap().get_type() == &Context::parse(&node.ctx, "<Seq Char>") {
|
|
||||||
node_make_seq_view( node )
|
|
||||||
} else if node.data.read().unwrap().get_type() == &Context::parse(&node.ctx, "<List Char>") {
|
|
||||||
node_make_list_edit( node )
|
|
||||||
} else {
|
|
||||||
eprintln!("couldnt add view");
|
|
||||||
node
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -42,7 +42,7 @@ pub trait DisplaySegment {
|
||||||
use nested::repr_tree::Context;
|
use nested::repr_tree::Context;
|
||||||
use std::sync::{Arc, RwLock};
|
use std::sync::{Arc, RwLock};
|
||||||
|
|
||||||
impl DisplaySegment for nested::edit_tree::NestedNode {
|
impl DisplaySegment for nested::edit_tree::EditTree {
|
||||||
fn display_view(&self) -> OuterViewPort<dyn TerminalView> {
|
fn display_view(&self) -> OuterViewPort<dyn TerminalView> {
|
||||||
if let Some( tv_repr ) = self.disp.view
|
if let Some( tv_repr ) = self.disp.view
|
||||||
.read().unwrap()
|
.read().unwrap()
|
||||||
|
@ -56,10 +56,10 @@ impl DisplaySegment for nested::edit_tree::NestedNode {
|
||||||
}
|
}
|
||||||
|
|
||||||
else {
|
else {
|
||||||
make_label("?")
|
make_label("# could not get ViewPort #")
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
make_label("?")
|
make_label("# No TTY View available #")
|
||||||
.map_item(|_p,a| a.add_style_back(TerminalStyle::fg_color((220, 30, 30))))
|
.map_item(|_p,a| a.add_style_back(TerminalStyle::fg_color((220, 30, 30))))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
use {
|
use {
|
||||||
cgmath::Vector2,
|
cgmath::Vector2,
|
||||||
nested::{
|
nested::{
|
||||||
edit_tree::NestedNode,
|
edit_tree::EditTree,
|
||||||
repr_tree::{Context, ReprTree},
|
repr_tree::{Context, ReprTree},
|
||||||
},
|
},
|
||||||
crate::{
|
crate::{
|
||||||
|
|
|
@ -1,11 +1,12 @@
|
||||||
[package]
|
[package]
|
||||||
authors = ["Michael Sippel <micha@fragmental.art>"]
|
authors = ["Michael Sippel <micha@fragmental.art>"]
|
||||||
name = "ansi_parser"
|
name = "pty-server"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
nested = { path = "../../nested" }
|
nested = { path = "../lib-nested-core" }
|
||||||
|
nested-tty = { path = "../lib-nested-tty" }
|
||||||
cgmath = { version = "0.18.0", features = ["serde"] }
|
cgmath = { version = "0.18.0", features = ["serde"] }
|
||||||
serde = { version = "1.0", features = ["serde_derive"] }
|
serde = { version = "1.0", features = ["serde_derive"] }
|
||||||
bincode = "1.3.3"
|
bincode = "1.3.3"
|
||||||
|
|
Loading…
Reference in a new issue