use { r3vi::{ view::{ OuterViewPort, singleton::*, port::UpdateTask }, buffer::singleton::* }, laddertypes::{TypeTerm}, crate::{ repr_tree::{Context, ReprTree, ReprLeaf, ReprTreeExt, GenericReprTreeMorphism}, edit_tree::{EditTree, TreeNavResult}, editors::ObjCommander, }, std::sync::Arc, std::sync::RwLock }; pub mod ctx; pub use crate::editors::char::ctx::init_ctx; pub struct CharEditor { ctx: Arc<RwLock<Context>>, data: SingletonBuffer<char> } impl ObjCommander for CharEditor { fn send_cmd_obj(&mut self, cmd_obj: Arc<RwLock<ReprTree>>) -> TreeNavResult { let cmd_obj = cmd_obj.read().unwrap(); let cmd_type = cmd_obj.get_type().clone(); if cmd_type == Context::parse(&self.ctx, "Char") { if let Some(cmd_view) = cmd_obj.get_view::<dyn SingletonView<Item = char>>() { let value = cmd_view.get(); if self.ctx.read().unwrap().meta_chars.contains(&value) { TreeNavResult::Exit } else { self.data.set(value); TreeNavResult::Continue } } else { TreeNavResult::Exit } } else { TreeNavResult::Exit } } } impl CharEditor { pub fn new(ctx: Arc<RwLock<Context>>) -> Self { CharEditor { ctx, data: SingletonBuffer::new('\0') } } pub fn get_port(&self) -> OuterViewPort<dyn SingletonView<Item = char>> { self.data.get_port() } pub fn get(&self) -> char { self.get_port().get_view().unwrap().get() } pub fn new_edit_tree( ctx0: Arc<RwLock<Context>>, data: SingletonBuffer<char>, depth: OuterViewPort<dyn SingletonView<Item = usize>> ) -> EditTree { //let data = SingletonBuffer::new('\0'); let ctx = ctx0.clone(); let editor = Arc::new(RwLock::new(CharEditor{ ctx, data: data.clone() })); EditTree::new( ctx0.clone(), depth ) .set_cmd( editor.clone() ) .set_editor( editor.clone() ) } }